Уничтожить экземпляр фрагмента / триггера onDestroy с помощью библиотеки навигации - PullRequest
0 голосов
/ 19 января 2020

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

Но у меня также есть вариант использования, когда мне нужно воссоздать этот экземпляр Fragment, поэтому я ожидаю, что у меня будет возможность вызвать onDestroy () для этого фрагмента. Но я не вижу API для удаления / получения существующих в экземплярах backstack.

Так что мой вопрос , как получить существующий экземпляр фрагмента из стека навигации назад и уничтожить его или просто удалить, вызвав контроллер nav api .

некоторый код:

 override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        viewModel = ViewModelProviders.of(requireActivity(), mViewModelFactory)
            .get(MainViewModel::class.java)
        parseNavigationExtra()
        return if (::mBinding.isInitialized) {
            mBinding.root
        } else {
        //create new binding
}

, поэтому, когда я вызываю это действие, я все еще получаю старую привязку root, поскольку переменная все еще присутствует.

  <action
        android:id="@+id/clearBackStack"
        app:destination="@+id/mainFragment"
        app:launchSingleTop="true"
        app:popUpTo="@+id/mobile_navigation"
        app:popUpToInclusive="true" />

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

изменений в библиотеке навигации с 2.1.0

NavBackStackEntry: теперь вы можете вызывать NavController.getBackStackEntry (), передавая идентификатор места назначения или навигационный граф в заднем стеке. Возвращенный NavBackStackEntry предоставляет управляемый навигацией LifecycleOwner, ViewModelStoreOwner (то же самое, что возвращается NavController.getViewModelStoreOwner ()) и SavedStateRegistryOwner, в дополнение к предоставлению аргументов, используемых для запуска этого места назначения.

Таким образом, планируется использовать новый API, чтобы увидеть, что доступно для NavBackStackEntry.

0 голосов
/ 19 января 2020
List<Fragment> fragments = getActivity().getSupportFragmentManager().getFragments();          
Fragment lastFragment = fragments.get(fragments.size() - 1);
getActivity().getSupportFragmentManager().beginTransaction().remove(emptyDialog);
...