Android Объявление фрагмента в действии xml ИЛИ метод фабрики newInstance ()? - PullRequest
0 голосов
/ 03 апреля 2020

В моем проекте есть активность и несколько фрагментов. В настоящее время фрагменты объявлены в моей деятельности 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) по коду. Но я думаю, что это правильный путь, если я хочу передать параметры инициализации во фрагмент.

Поэтому мне интересно, какой подход лучше.

А также сохраняет ссылки на все фрагменты в порядке или лучше создать во время транзакции?

1 Ответ

1 голос
/ 03 апреля 2020

Совсем нет. когда вы создаете метод фабрики newInstance, вы делаете это потому, что хотите передать некоторые аргументы из действия во фрагмент. обычно вы делаете это с помощью конструктора, но это не вариант при работе с фрагментами. так что это единственная причина для создания фабричного метода для фрагментов, в противном случае вы просто вызовете конструктор по умолчанию. теперь в любом случае это не означает, что вам нужно будет записывать параметры макета в коде. для этого есть хороший обходной путь. вы создадите FrameLayout или любую ViewGroup и установите параметры ее макета в xml. Теперь, в какой-то момент, когда вы захотите добавить свой фрагмент, вы можете просто добавить свой фрагмент (или заменить) в эту ViewGroup. Код так же прост, как все, что можно получить.

supportFragmentManager
.beginTransaction()
.replace(R.id.your_view_group_id, BadAssFragment.newInstance(someCoolData))
.commit()
...