我们坚持AUF(Always Use Fragments)原则
Fragemnt的生命周期

onAttach()
当碎片和活动建立关联的时候调用。
onCreateView()
为碎片创建视图(加载布局)时调用。
onActivityCreated()
确保与碎片相关联的活动一定已经创建完毕的时候调用。
onDestroyView()
当与碎片关联的视图被移除的时候调用。
onDetach()
当碎片和活动解除关联的时候调用。
源码实现
静态加载:
主布局文件:
1 2 3 4 5 6
| <fragment android:id="@+id/first_fragment" android:name="io.github.grooters.FirstFragment" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/>
|
android:name指明Fragment类
FirstFragment.class:
1 2 3 4 5
| @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_first, container, false); }
|
动态加载:
MainActivity,activity_main:
1 2 3 4 5 6 7 8 9 10 11
| FragmentManager manager=getSupportFragmentManager(); FragmentTransaction transaction=manager.beginTransaction(); FragmentOne fragmentOne=new FragmentOne(); transaction.replace(R.id.fragment_container,fragmentOne,"one"); transaction.commit();
<FrameLayout android:id="@+id/fragment_container" android:layout_marginTop="10dp" android:layout_width="match_parent" android:layout_height="match_parent"/>
|
FragmentOne:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| private final String TAG=FragmentOne.class.getSimpleName(); @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v=inflater.inflate(R.layout.fragment_one,container,false); Button button=v.findViewById(R.id.create_fragment); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { FragmentManager manager=getFragmentManager(); FragmentTransaction transaction=manager.beginTransaction(); transaction.replace(R.id.fragment_container,new FragmentTwo(),"two"); transaction.addToBackStack("one"); transaction.commit(); } }); return v; }
@Override public void onDestroyView() { super.onDestroyView();
Log.i(TAG,"onDestroyView"); } @Override public void onDestroy() { super.onDestroy();
Log.i(TAG,"onDestroy"); } @Override public void onDetach() { super.onDetach();
Log.i(TAG,"onDetach"); }
|
FragmentTwo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| private final String TAG=FragmentTwo.class.getSimpleName(); @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v=inflater.inflate(R.layout.fragment_two,container,false); return v; } @Override public void onDestroyView() { super.onDestroyView(); Log.i(TAG,"onDestroyView"); } @Override public void onDestroy() { super.onDestroy(); Log.i(TAG,"onDestroy"); } @Override public void onDetach() { super.onDetach(); Log.i(TAG,"onDetach"); }
|
在FragmentOne中的transaction.addToBackStack(“one”)是将FragmentOne添加进回退栈中,在跳转到下一个Fragment时只会销毁FragmentView,即只执行DestroyView方法,当在下一个Fragment回退时会返回到该Fragment,若没有该行代码,在跳转到下一个Fragment时会销毁整个Fragment,即执行DestoryView,Destroy和Detach方法
Fragment与Activity之间的通信
从属关系下的Fragment和Activity:
Activity拥有Fragment的引用,Fragment可调用getActivity获取Activity的上下文
要进行通信的Fragment不属于该Activity:
Activity可以通过FragmentManager对象中的findFragmentByTag或findFragmentById
1 2
| FragmentTwo fragment=(FragmentTwo) getSupportFragmentManager().findFragmentByTag("two"); fragment.getInfo("give you ok?");
|
tag为之前replace或add传入的tag
Fragment可以通过getActivity获取关联的Activity的上下文然后通过在该Activity中获取目标activity的相关方法,即通过关联Activity作为代理
通过setArgument传送数据:
1 2 3 4 5 6 7 8
| bundle.putSerializable("Student",getIntent().getSerializableExtra("Student"));
studentListFragment.setArguments(bundle); return studentListFragment;
Student student=(Student) getArguments().getSerializable("Student");
|
Fragment数据的保留
当遇到活动销毁时其托管的Fragment也会随之销毁,为了保留Fragment的数据,可以通过Fragment类中的方法:
当调用了该方法,传入的参数为true时,在Activity销毁时,会立即销毁Fragment绑定的视图,即调用onDestroyView方法(为了适应屏幕旋转后视图的改变)
Fragment的封装与解耦
BaseFragment.class:
1 2 3 4 5 6 7 8 9
| @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContainer(R.layout.fragment_main); Fragment fragment=createFragment(); FragmentManager fm=getFragmentManager(); fm.beginTransaction().replace(R.id.frame_container,fragment).commit(); } public abstract Fragment createFragment();
|
v1.5.2