Фрагменты уничтожены / воссозданы с помощью компонентов Jetpack для Android-навигации - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь реализовать Навигацию с помощью компонентов архитектуры Jetpack в моем существующем приложении.

У меня есть одно приложение для действий, в котором основной фрагмент (ListFragment) представляет собой списокПредметы.В настоящее время, когда пользователь нажимает на элемент списка, второй фрагмент добавляется в стек на fragmentTransaction.add(R.id.main, detailFragment).Таким образом, при нажатии кнопки «назад» DetailFragment отсоединяется и снова отображается ListFragment.

При использовании архитектуры навигации это обрабатывается автоматически.Вместо добавления нового фрагмента он заменяется на , поэтому представление фрагмента уничтожается, вызывается onDestroyView() и вызывается onCreateView() при нажатии back для воссоздания представления.

Я понимаючто это хороший шаблон, используемый с LiveData и ViewModel , чтобы избежать использования большего количества памяти, чем необходимо, но в моем случае это раздражает, потому что список имеет сложную компоновку и раздувает времяи загрузка процессора, также потому, что мне нужно сохранить позицию прокрутки списка и снова прокрутить до той же позиции, что пользователь оставил фрагмент.Это возможно, но, похоже, он должен существовать лучше.

Я пытался «сохранить» представление в приватном поле фрагмента и повторно использовать его на onCreateView(), если оно уже есть, но, похоже,анти-шаблон.

private View view = null;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    if (view == null) {
        view = inflater.inflate(R.layout.fragment_list, container, false);
        //...
    }

    return view;
}

Есть ли другой, более изящный способ избежать повторного раздувания макета?

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Я попробовал вот так, и он работает для меня.

  • Init ViewModel от navGraphViewModels (Live on Navigation scope)
  • Сохранение любого состояния для восстановления вViewModel
// fragment.kt
private val vm by navGraphViewModels<VM>(R.id.nav_graph) { vmFactory }

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    // Restore state
    vm.state?.let {
        (recycler.layoutManager as GridLayoutManager).onRestoreInstanceState(it)
    }
}

override fun onPause() {
    super.onPause()
    // Store state
    vm.state = (recycler.layoutManager as GridLayoutManager).onSaveInstanceState()
}

// vm.kt
var state:Parcelable? = null
0 голосов
/ 07 марта 2019

Ян Лейк от Google ответил мне, что мы можем сохранить представление в переменной и вместо надувания нового макета, просто вернуть экземпляр предварительно сохраненного представления на onCreateView()

Leakcanery может показывать это как утечку, но его ложное срабатывание ..

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