Для моего приложения некоторые фрагменты требуют, чтобы пользователь вводил контакт в диалоговом окне перед его показом. У меня есть класс BaseFragment, который распространяется на все мои другие фрагменты, которые сохраняются, если требуется булавка. Моя проблема прямо сейчас связана с кнопкой «назад», как будто пользователь пытается вернуться к фрагменту, для которого требуется, чтобы в нем сначала был показан диалог вывода.Android peek backstack без popping
В настоящее время я переопределяю onBackPressed(), в котором я хочу посмотреть назад, чтобы увидеть, какой фрагмент будет возобновлен, если popkackstack() был вызван, поэтому я могу проверить, должен ли отображаться диалог PIN-кода. Ниже мой текущий код, который popFragment возвращается нуль:
@Override
public void onBackPressed() {
if(getSupportFragmentManager().findFragmentById(R.id.fragment_container) instanceof BaseFragment) {
BaseFragment frag = (BaseFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container);
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
int index = getSupportFragmentManager().getBackStackEntryCount() - 1;
Log.e("Back stack", Integer.toString(index));
FragmentManager.BackStackEntry backEntry = (FragmentManager.BackStackEntry) getSupportFragmentManager().getBackStackEntryAt(index);
BaseFragment popFragment = (BaseFragment) getSupportFragmentManager().findFragmentById(backEntry.getId());
BaseFragment.checkAuth(this, frag, popFragment, new NavigationCallback((AppCompatActivity) this));
} else {
super.onBackPressed();
}
} else {
super.onBackPressed();
}
}
Я проверил, если backEntry является недействительным и его нет. backEntry.getId() также возвращается со значением 1, поэтому я не уверен, почему findFragmentById() тогда null. Я также не думаю, что он должен делать с тем, как я показываю фрагменты, но вот мой код, который, как хорошо:
FragmentManager fragManager = mActivity.getSupportFragmentManager();
FragmentTransaction transaction = fragManager.beginTransaction();
transaction.replace(R.id.fragment_container, mFragment);
transaction.addToBackStack(null);
transaction.commit();
Вы столкнулись с проблемой, где нужно было несколько фрагментов с тем же тегом в backstack? Мне любопытно, будет ли генерировать случайное имя для тега. –
Я только что создал соглашение о создании тегов, которые гарантировали бы, что они будут уникальными в любой мыслимой перестановке стека. В моем случае, просто использование имени класса фрагмента было достаточно из-за дизайна приложения. Генерация случайного тега должна работать, если вы можете гарантировать, что тег никогда не будет дублироваться в фоновом стеке. –
Также в моем случае мне нужно было знать, был ли только один из четырех типов фрагментов, потому что, как и ваше приложение, им нужно было знать, была ли нажата кнопка «Назад». Поэтому большинство транзакций с фрагментами даже не указывали теги вообще. –