Разница между созданием нового фрагмента и получением существующего от менеджера по очереди - PullRequest
0 голосов
/ 02 мая 2018

Похоже, я установил для retainInstance значение true или нет, когда я поворачиваю устройство, я получаю существующий фрагмент. Разница в том, что если я установлю его в true, я получу «test = yes!», В противном случае я получу «test = no!» после поворота устройства после нажатия кнопки проверки изменить test. То есть переменная-член сохраняется, если я сохраняю экземпляр.

Но, как я уже сказал, даже если я не сохраню его, я все равно получу существующий фрагмент от менеджера (всегда получаю «Повторное использование существующего» при ротации). В этом случае, если все переменные-члены потеряны, а представления фрагмента воссозданы, что сохраняется? Какой смысл получать существующий экземпляр фрагмента?

В действии onCreate,

    var frag = supportFragmentManager.findFragmentById(R.id.frame)

    if(frag == null)
    {
        frag = Fragment1.newInstance("", "");
    }
    else
    {
        Log.d("sss", "Reusing exsiting");
    }

    val transaction = supportFragmentManager.beginTransaction()
    transaction.replace(R.id.frame, frag)
    transaction.commit()

Во фрагменте

var test = "no!";

override fun onViewCreated(view: View, savedInstanceState: Bundle?)
{
    super.onViewCreated(view, savedInstanceState)
    Log.d("sss", "test = " + test);
    testButton.setOnClickListener {
        test = "yes!";
    }
}

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Я потратил несколько часов, пытаясь воссоздать вашу ситуацию по разным сценариям. Прежде всего, я должен отметить, что жизненный цикл фрагментов на самом деле настолько сложен, что во время ввода-вывода Google 2018 один из ведущих разработчиков спросил аудиторию, вызывается ли сначала метод onCreate() из Activity или что из Fragment х. Ответ был таков, это зависит от версии SDK. Но они все больше внимания уделяют библиотекам совместимости и советуют разработчикам использовать их для универсального использования на разных устройствах, а также наслаждаться новыми API-интерфейсами, которые сделают работу с фрагментами намного проще для нас.

Просматривая документацию по классу AppCompatActivity , я понял, что такое поведение является способом обращения с фрагментами.

Protected methods
void    onCreate(Bundle savedInstanceState)
Perform initialization of all fragments.

void    onDestroy()
Destroy all fragments.

void    onPostCreate(Bundle savedInstanceState)
void    onPostResume()
Dispatch onResume() to fragments.

void    onSaveInstanceState(Bundle outState)
Save all appropriate fragment state.

void    onStart()
Dispatch onStart() to all fragments.

void    onStop()
Dispatch onStop() to all fragments.

Как вы можете видеть, они "сохраняют все соответствующие состояния фрагмента" в onSaveInstanceState(); Это означает, что состояния будут восстановлены позже, после того, как Activity будет разрушен и воссоздан. Таким образом, в onDestroy() все фрагменты уничтожаются, и когда Activity создается снова, они также воссоздаются. Чтобы убедиться, что вы можете переопределить эти методы внутри Fragment и Activity и проверить результат. Если вы не проверяете FragmentManager для уже прикрепленных фрагментов, метод onCreate() метода Fragment будет вызываться дважды, один раз напрямую - добавляя как новый Fragment - и один раз самим AppCompatActivity.

О retainInstance = true в документации говорится, что он сохраняет переменные-члены во время изменений конфигурации и приведет к небольшому различию в жизненном цикле Fragment.

0 голосов
/ 20 мая 2018

setRetainInstance (истина)

Управляет сохранением экземпляра фрагмента при повторном создании действия (например, после изменения конфигурации). Это можно использовать только с фрагментами, которые не находятся в заднем стеке. Если установлено, жизненный цикл фрагмента будет немного отличаться при воссоздании действия:

onDestroy () вызываться не будет (но onDetach () все равно будет, поскольку фрагмент отсоединен от текущей активности).

onCreate (Bundle) вызываться не будет, поскольку фрагмент не создается заново.

onAttach (Activity) и onActivityCreated (Bundle) будут по-прежнему вызываться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...