Android片段在活动xml或newInstance()工厂方法中声明?

问题描述 投票:0回答:1

在我的项目中,我有一个活动和多个片段。目前,片段是在我的活动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)。但是我认为这是正确的方法,如果我想将初始化参数传递给片段。

所以我想知道哪种方法更好。

而且是否保留对所有片段的引用都可以,还是在交易过程中更好地创建?

android fragment
1个回答
1
投票

完全没有。创建newInstance工厂方法时,您这样做是因为要将一些参数从活动传递到片段。通常,您可以使用构造函数来执行此操作,但这不是处理片段时的选择。因此,这就是其他时候为片段创建工厂方法的唯一原因,您只需调用默认构造函数即可。现在,无论哪种情况,这并不意味着您将需要在代码中编写布局参数。有一个不错的解决方法。您将创建FrameLayout或任何ViewGroup并在xml中设置其布局参数。现在,当您要添加片段时,只需在该ViewGroup中添加(或替换)片段即可。代码非常简单。

© www.soinside.com 2019 - 2024. All rights reserved.