在我的项目中,我有一个活动和多个片段。目前,片段是在我的活动xml中声明的例如:
<fragment
tools:layout="@layout/fragment_do_you_know"
android:name="myapp.fragments.DoYouKnowFragment"
android:id="@+id/doYouKnowFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible"/>
<fragment
tools:layout="@layout/fragment_whats_new"
android:name="myapp.fragments.WhatsNewFragment"
android:id="@+id/whatsNewFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible"/>
在活动初始化期间,我获得了片段引用:
mWhatsNewFragment = (WhatsNewFragment) mFragmentManager.findFragmentById(R.id.whatsNewFragment);
mDoYouKnowFragment = (DoYouKnowFragment) mFragmentManager.findFragmentById(R.id.doYouKnowFragment);
在不同的操作上,我显示其中一个片段,并在FragmentManager事务中隐藏所有其他片段:
protected void showFragment(BaseFragment fragment) {
FragmentTransaction transaction = mFragmentManager.beginTransaction();
transaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
BaseFragment visibleFragment = null;
for (BaseFragment fr: mAllFragments) {
if (fragment == fr) {
transaction.show(fr);
visibleFragment = fr;
}
else {
transaction.hide(fr);
}
}
transaction.commit();
if (visibleFragment != null) {
visibleFragment.onShow();
}
}
我知道另一种方法是使用newInstance()工厂方法来获取片段引用。在那种情况下,我想必须通过代码设置布局参数(layout_width,layout_height)。但是我认为这是正确的方法,如果我想将初始化参数传递给片段。
所以我想知道哪种方法更好。
而且是否保留对所有片段的引用都可以,还是在交易过程中更好地创建?
完全没有。创建newInstance工厂方法时,您这样做是因为要将一些参数从活动传递到片段。通常,您可以使用构造函数来执行此操作,但这不是处理片段时的选择。因此,这就是其他时候为片段创建工厂方法的唯一原因,您只需调用默认构造函数即可。现在,无论哪种情况,这并不意味着您将需要在代码中编写布局参数。有一个不错的解决方法。您将创建FrameLayout或任何ViewGroup并在xml中设置其布局参数。现在,当您要添加片段时,只需在该ViewGroup中添加(或替换)片段即可。代码非常简单。