Fragment

静态设置

<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步骤:

  1. 创建待添加的碎片实例
  2. 获取FragmentManager,在Activity中可以直接通过调用getSupportFragmentManager()方法得到。
  3. 开启一个事务,通过调用beginTransaction()方法开启。
  4. 向容器内添加或替换Fragment,一般使用replace()方法实现,需要传入容器的id和待添加的Fragment实例。
  5. 提交事务,调用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()中可以获取保存的数据。

打赏