Fragment的跳转

1. 主Fragment

  设置一个主Fragment,其它fragment得到它就可以了。

  示例如下:

1  val ft = fragmentManager?.beginTransaction()
2  val maiFrgmt = MainFrgmt()
3  ft?.replace(R.id.main,maiFrgmt,"MainTag")?.setPrimaryNavigationFragment(maiFrgmt)?.commitAllowingStateLoss()

  其它fragment中

1  var mainFrgmt = requireFragmentManager().primaryNavigationFragment

 

2.根据Tag,Id查找目标Fragment

  查找MainFrgmt示例:

1  val main2 = requireFragmentManager().findFragmentByTag("MainTag")

3.Fragment中共享view

1  val ft = fragmentManager?.beginTransaction()
2  val maiFrgmt = MainFrgmt()
3  requireFragmentManager().beginTransaction().addSharedElement(maiFrgmt.mViewPager2,"MainTag").commit()

4.通过Activity

  Fragment之间共用宿主activity

5.parentFragment

  通过 getParentFragment() 返回父Fragment,如下:

  现在有个AboutFragment,它的布局如下 about_fragment.xml :

 1     <androidx.constraintlayout.widget.ConstraintLayout ...>
 2 
 3         ...
 4 
 5         <fragment
 6             android:id="@+id/about_title_frgmt"
 7             android:name="app.TitleFrgmt"
 8             android:layout_width="0dp"
 9             android:layout_height="wrap_content"
10             app:layout_constraintEnd_toEndOf="parent"
11             app:layout_constraintStart_toStartOf="parent"
12             app:layout_constraintTop_toTopOf="parent" />
13 
14 
15     </androidx.constraintlayout.widget.ConstraintLayout>

  AboutFragment就是 about_title_frgmt 的父Fragment.

6.FragmentManager

  一个Fragment有两个fragmentManager和一个parent

 1     // The fragment manager we are associated with.  Set as soon as the
 2     // fragment is used in a transaction; cleared after it has been removed
 3     // from all transactions.
 4     FragmentManager         mFragmentManager;
 5     ...
 6 
 7     // Private fragment manager for child fragments inside of this one.
 8     @NonNull
 9     FragmentManager         mChildFragmentManager = new FragmentManagerImpl();
10 
11     // If this Fragment is contained in another Fragment, this is that container.
12     Fragment             mParentFragment;

6.1 getFragmentManager()

  • 如果在子Fragment内调用它,那么它返回的是 parent.getChildFragmentManager()
  • 否则返回的是本身的FragmentManager

6.2 getParentFragmentManager()

  • 如果在子Fragment内调用它,返回的是 parent.getChildFragmentManager  
  • 否则返回本身的FragmentManager

6.3 getChildFragmentManager()

  • 返回子FragmentManager

 

posted @ 2015-10-21 22:58  f9q  阅读(456)  评论(0编辑  收藏  举报