Есть ли способ получить фрагмент из вершины стека?
У меня есть ListFragment в моей MainActivity. Вот как я установил свой объект фрагмента.
FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new MyFragment();
fragmentTransaction.replace(R.id.framecontainer, newFragment, "tag");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Проблема заключается в том, когда пользователь нажимает кнопку "назад", мне нужно, по крайней мере, изменить панель действий и меню, вызвав
getActionBar().setTitle(title);
getActionBar().setDisplayHomeAsUpEnabled(isEnabled);
invalidateOptionsMenu();
Я должен знать, какой фрагмент показывается в данный момент, так что я знаю, как установить панель действий. Я сохраняю параметр установки в фрагменте как аргументы.
String title = fragment.getArguments().getString("KEY_TITLE");
boolean isEnabled = fragment.getArguments().getBoolean("KEY_ISENABLED");
Я выполняю поиск по соответствующему вопросу, и я понял, что могу получить фрагмент, позвонив
MyFragment fragment = (MyFragment) getSupportFragmentManager()
.findFragmentByTag("tag");
Тем не менее, я должен хранить весь тег в пользовательском стеке и вызывать pop() каждый раз, когда пользователь нажимает кнопку в onBackPressed()
.
Итак, мой вопрос в том, что есть ли способ получить текущий видимый фрагмент из стека напрямую?
Примечание. Имейте в виду, что типы фрагментов различны, а не только MyFragment.
Ответы
Ответ 1
Некоторые вещи, подобные этому, должны помочь вашей активности понять это на обратном пути:
private Fragment getCurrentFragment(){
FragmentManager fragmentManager = getSupportFragmentManager();
String fragmentTag = fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName();
Fragment currentFragment = fragmentManager.findFragmentByTag(fragmentTag);
return currentFragment;
}
@Override
public void onBackPressed() {
Fragment fragmentBeforeBackPress = getCurrentFragment();
// Perform the usual back action
super.onBackPressed();
Fragment fragmentAfterBackPress = getCurrentFragment();
}
Надеюсь, что это поможет.
Ответ 2
FragmentManager.findFragmentById(fragmentsContainerId)
функция возвращает ссылку вверху Fragment
в backstack. Пример использования:
fragmentManager.addOnBackStackChangedListener(new OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
Fragment fr = fragmentManager.findFragmentById(R.id.fragmentsContainer);
if(fr!=null){
Log.e("fragment=", f.getClass().getSimpleName());
}
}
});
Ответ 3
Уже есть ответ, помеченный как правильный, и моя дополнительная информация не будет
будь то другое. НО, у меня возникли проблемы при использовании приемника, пытающегося
выяснить, есть ли фрагмент, откуда находится приемник, текущая вершина
фрагмент в стеке. Вы можете легко запускать много NPE и Index за пределами границ.
Поэтому я написал это, возможно, это помогает кому-то.
private boolean isFragmentOnTop(Activity parentActivity, final String fragmentName){
FragmentManager fmManager = parentActivity.getFragmentManager();
if(fmManager.getBackStackEntryCount() == 0){
LOG.i("BackStack entry count is 0: " + this);
return false;
}
String fragmentNameOnStackTop = "";
final FragmentManager.BackStackEntry topEntry = fmManager.getBackStackEntryAt(fmManager.getBackStackEntryCount() -1);
if(topEntry != null) {
fragmentNameOnStackTop = topEntry.getName();
}
LOG.d("Got fragments name: " + fragmentNameOnStackTop);
return fragmentNameOnStackTop != null ? fragmentNameOnStackTop.equals(fragmentName) : false;
}
Обратите внимание, что это отлично работает для операции с некоторыми фрагментами. Имейте в виду, если вы
используя ViewPager - childfragmentmanager.
И не забудьте установить имя_файла в FragmentTransaction.addToBackStack(fragmentName)
Ответ 4
этот вспомогательный метод получает фрагмент сверху стека:
public Fragment getTopFragment() {
if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
return null;
}
String fragmentTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
return getSupportFragmentManager().findFragmentByTag(fragmentTag);
}