Подтвердить что ты не робот

Есть ли способ получить фрагмент из вершины стека?

У меня есть 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.

4b9b3361

Ответ 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);
}