静态设置
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/left_fragment"
android:name="com.shijiusui.LeftFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<fragment
android:id="@+id/right_fragment"
android:name="com.shijiusui.RightFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>
动态添加
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/left_fragment"
android:name="com.shijiusui.LeftFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<FrameLayout
android:id="@+id/right_layout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>
private void replaceFragment(Fragment fragment){
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.right_layout, fragment);
transaction.commit();
}
动态添加Fragment步骤:
- 创建待添加的碎片实例
- 获取FragmentManager,在Activity中可以直接通过调用getSupportFragmentManager()方法得到。
- 开启一个事务,通过调用beginTransaction()方法开启。
- 向容器内添加或替换Fragment,一般使用replace()方法实现,需要传入容器的id和待添加的Fragment实例。
- 提交事务,调用commit()方法来完成。
返回栈
private void replaceFragment(Fragment fragment){
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.right_layout, fragment);
transaction.addToBackStack(null);//----------->
transaction.commit();
}
这里我们在事务提交之前调用了FragmentTransaction的addToBackStack()方法,它可以接收一个名字用于描述返回栈的状态,一般传入null即可。
Fragment和Activity之间进行通信
为了方便Fragment和Activity之间通信,FragmentManager提供了一个类似于findViewById()的方法,专门用于从布局文件中获取碎片的实例。
RightFragment rightFragment = (RightFragment) getFragmentManager()
.findFragmentById(R.id.right_fragment);
在Fragment中可以通过调用getActivity()方法来得到和当前Fragment相关联的Activity实例。
MainActivity activity = (MainActivity)getActivity();
生命周期
onAttach(Context)
onCreate(Bundle)
onCreateView(LayoutInflater, ViewGroup, Bundle)<——-返回栈
onActivityCreated(Bundle)
onStart()
onResume()
onPause()
onStop()
onDestroyView()—–>返回栈
onDestroy()
onDetach()
RightFragment第一次显示时,依次执行
onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()
当被其他替换时,进入停止状态,执行的是
onPause()->onStop()->onDestroyView()
如果在替换的时候没有调用addToBackStack()方法,此时会进入销毁状态,会接着执行
—->onDestroy()->onDetach()
当在替换的时候调用了addToBackStack()方法,按返回键会回退到RightFragment,由于RightFragment重新回到了运行状态,因此会执行
onActivityCreated()->onStart()->onResume()
注意,此时onCreate()和onCreateView()方法并不会执行,因为我们借助了addToBackStack()方法使得RightFragment和它的视图并没有销毁。
还有一个方法onSaveInstanceState()方法可以保存数据。在onCreate()、onCreateView()和onActivityCreated()中可以获取保存的数据。