Android, как вернуться в Main Activity без навигации backstack? - PullRequest
0 голосов
/ 22 октября 2018

Я работаю с фрагментом, и один из вариантов - удалить объект, на который я смотрю.После подтверждения действия по удалению я хочу, чтобы оно просто вернулось на главный экран или в MainActivity, и я не хочу проходить через backstack, поскольку оно будет пытаться перебрать то, что я только что удалил.

Ответы [ 5 ]

0 голосов
/ 22 октября 2018

ответ jitesh mohite имеет недостаток: если вы начнете новое занятие, вы потеряете все данные на экране (если они есть).Запуск Fragment обычно приводит к паузе Activity, и если повторный запуск действия имел место, то почему бы не использовать Activities - это первое место?

A FragmentManager всегда состоит изсписок Fragments в BackStack

Вы можете перебрать все фрагменты и выдвинуть их.Чтобы очистить фрагмент BackStack FragmentManager, вы можете выполнить итерацию по всем элементам обратного стека и вызвать popBackStack()

FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {    
    fm.popBackStack();
}

Но есть и более элегантное решение:

// in my case I get the support fragment manager, it should work with the native one too
FragmentManager fragmentManager = getSupportFragmentManager();
// this will clear the back stack and displays no animation on the screen
fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
0 голосов
/ 22 октября 2018

Существует так много способов сделать это.

Вы можете полностью очистить задний стек вашего FragmentManager.

ИЛИ просто перезапустите это действие с помощью

if (getActivity() != null) {
    Intent intent = getActivity().getIntent();
    getActivity().finish();
    startActivity(intent);
}
0 голосов
/ 22 октября 2018

Вы можете использовать приведенный ниже код, чтобы очистить весь предыдущий стек, Запустите ту же основную операцию.

Intent i = new Intent(OldActivity.this, MainActivity.class);
// set the new task and clear flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |  Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);

Вы также можете использовать ActivityCompat.finishAffinity(), чтобы очистить все дочерние действия.

0 голосов
/ 22 октября 2018

Не думаю, что проблема в том, как перезапустить действие, чтобы обойти загрузку данных.Вопрос должен заключаться в том, почему ваша программа не может разрешить возврат MainActivity путем отката стека и перезагрузки данных?

Отправка нового намерения действительно может решить вашу проблему, но я думаю, что это может быть не самым элегантным подходом.

Вообще говоря, элегантно, ваши данные могут быть разделены.После удаления данных другие местоположения автоматически синхронизируются;или вам разрешено перезагружать данные и работать в обычном режиме.

0 голосов
/ 22 октября 2018

Вы можете вызвать метод finish() или getActivity().finish(), чтобы закрыть родительское действие перед началом последующих действий.

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