Создание экземпляра фрагмента внутри действия и повторное его использование - плохая практика кодирования? - PullRequest
0 голосов
/ 09 февраля 2020

Есть одно действие и два фрагмента. Вы можете переключиться на другой фрагмент, нажав кнопку (на панели действий в меню параметров). При нажатии кнопки фрагмент заменяется соответствующим другим фрагментом.

Чтобы убедиться, что нужный фрагмент помещается в контейнер фрагментов, сначала необходимо идентифицировать текущий отображаемый фрагмент, а затем заменить.

when(supportFragmentManager.findFragmentByTag("test")!!.id) {
    foodListFragment.id -> {
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.main_fragment_container,consumedFoodListFragment,"test")
            .commit()
    }
    consumedFoodListFragment.id -> {
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.main_fragment_container,foodListFragment,"test")
            .commit()
    }
}

Одна из проблем, с которой я столкнулся, заключалась в том, что frag.id зависит от экземпляра и не является фиксированным, поэтому я создал два экземпляра в классе Main Activity:

class MainActivity : AppCompatActivity() {

    private val foodListFragment by lazy { FoodListFragment() }
    private val consumedFoodListFragment by lazy { ConsumedFoodListFragment() }

    ...
}

(1) Главный вопрос, который у меня есть: это плохая практика? Мое предположение было бы да, потому что, поскольку есть ссылка на фрагмент внутри Main Activity, жизненный цикл фрагмента зависит от жизненного цикла действия, и это неправильно, так как жизненный цикл фрагмента должен быть независимым от активности, которую вы выполняете? Верны ли эти рассуждения?

(2) Еще один вопрос: что может быть более элегантным решением этой проблемы (определение того, какой фрагмент отображается в данный момент, и замена его)?

1 Ответ

1 голос
/ 09 февраля 2020

Чтобы ответить на ваш первый вопрос, я бы сказал.

1) Жизненный цикл фрагмента действительно зависит от активности жизненного цикла, тогда он не может существовать без них. И да, это плохая практика, учитывая ваш вариант использования. На мой взгляд, это плохая практика для сохранения экземпляра в действии, но это хорошо и в некоторых случаях, когда ваши пользователи очень часто посещают эти фрагменты, и вы не хотите воссоздавать их каждый раз и поддерживать их состояние, и поскольку только 2 фрагмента, так что все в порядке.

2) Для этого есть менеджер фрагментов. Ниже приведены методы, с помощью которых мы можем найти какой-то фрагмент, который сейчас активен.

1) Находит фрагмент, который был идентифицирован по данному идентификатору, либо при накачке из XML, либо как идентификатор контейнера при добавлении в транзакцию.

findFragmentById(int id)

//example
getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);

2) Находит фрагмент, который был идентифицирован по заданному пометка либо при накачке из XML, либо при поставке при добавлении в транзакцию.

findFragmentByTag(String tag)

 //example
getActivity().getFragmentManager().findFragmentByTag("fragment_first");

3) Получить список всех фрагментов, которые в данный момент добавлены в FragmentManager.

getFragments()

Примечание: также обратите внимание, что если во фрагментах не выполняется тяжелая работа, вы можете считать их воссозданием.

...