这只是我在学Android过程中对于所学知识的巩固和方便日后查询的学习笔记,能帮助到有需要的和我一样的初学者就更好了
强烈建议使用V4库中的Fragment来达到更好的兼容性
使用时只需新建MyFragment继承Fragment,并重写View onCreateView()来动态加载即可
首先
<fragment
android:id="......"
android:name="......"
//也就是MyFragment(完整包名+类名,类似:com.example.Test.MyFragment)
......
/>
其次
public class MyFragment extends Fragment{
@override
public View onCreateView(LayoutInflater inflater ,ViewGroup container ,Bundle savedInstanceState){
View view=inflater.inflate(R.layout. ... ,container,false);
return view;
}//Fragment中的UI控件也加在与此方法中
}
就这么简单
Fragment的替换(配合FrameLayout)
要注意
Fragment的替换并不是两个Fragment相互替换,而是去替换空白的FrameLayout
**<FrameLayout id="@+id/frame_layout" />
假设 有两个id分别为fragment1,fragment2的碎片
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
@override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=(Button)findViewById(R.id.changefragmen);
button.setonClickListener(this);
replaceFragment(new Fragment1());
}
@override
public void onClick(View v){
switch (v.getId()){
case R.id.changefragment:
replaceFragment(new Fragment2());
break;
default:
break;
}
}
private void replaceFragment(Fragment fragment){
//替换的相关代码
FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction=manager.beginTransaction();
transaction.replace(R.id.frame_layout ,fragment);//后者替换前者
//可以看出并非fragment2替换了fragment1
//而是代替了fragment1去替换frame_layout
transaction.commit();
}
}
与Activity的通信
引用了Fragment的Activity中获取Fragment实例
MyFragment fragment=(MyFragment)getSupportManager().findFragmentById(R.id.fragment);
Fragment要使用Context对象时getActivity()即可
Fragment中获取Activity对象
MainActivity activity=(MainActivity)getActivity();
Fragment间通信
先获取另一碎片所属活动的实例再由上面方法即可获取碎片实例
生命周期
onAttach() onCreate() onCreateView() onActivityCreated
onStart() onResume() onPause() onStop()
onDestroyView() onDestroy() onDetach()
注意事项
1、fragment是可以加入返回桟的从而达到back键回到替换前的fragment而不是退出应用
只需在 transaction.commit();前addToBackStack(null);
.......
transaction.addToBackStack(null);//参数为一个用于描述返回栈状态的名字
transaction.commit();
2、很多时候一切设置妥当但是运行时报有关fragment的错:
我遇到此问题时一般都是由于很少用到id,所以<fragment >中没有设置id这个属性,设置后就正常了,别的问题还没遇到
3、引入Fragment时右侧预览总是报错而且无法正常显示Fragment,但是运行起来没问题,我也不知道原因
补充
有些情况下需要将继承了SurfaceView的类加载于Fragment中,例如MySurfaceView。加载至Activity中时
setonContentView(new MySurfaceView());
当时要加载到Fragment中时我却不知该怎么办,后来看Activity中的加载方法联想到Fragment中和View有联系的方法中加载是否可行。
于是
public class MyFragment extends Fragment{
@override
public View onCreateView(LayoutInflater inflater ,ViewGroup container ,Bundle savedInstanceState){
View view=new MySurfaceView();
return view;
}
}
发现可以达到预期效果
如有错误欢迎指正