Какие фрагменты я размещаю и показываю?

Есть ли способ узнать, какой Fragment в настоящее время отображается в данном <fragment> контейнер Activity без отслеживания всех изменений через onAttachFragment Перезвоните?

Можно ли даже узнать, какие фрагменты отображаются, когда транзакции фрагментов могут иметь место, когда пользователь нажимает клавишу возврата? В этом последнем случае, т.е. когда Fragment повторно отображается из-за спины, onAttach не называется.

2 ответа

Каждый раз, когда вы добавляете / заменяете фрагмент в контейнер, используйте для него тег:

FragmentTransaction ft = getFragmentManager().beginTransaction();       
ft.add(R.id.container, fragment, tag).commit();

тогда вы можете узнать, фрагмент виден в данный момент или нет:

Fragment fg = getFragmentManger().findFragmentByTag(tag);
if(fg.isVisible())
    //fg is the current visible fragment

Надеюсь, это поможет!

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

Fragment mCurrentDisplayedFragment;

и затем всякий раз, когда пользователь запрашивает другой фрагмент, выполните:

mCurrentFragment = (Fragment) userRequestedFragment;
fragmentManager.replace(container, mCurrentFragment, tag);

Затем, когда вам нужно было что-то сделать с текущим отображаемым фрагментом, вы можете сортировать его, пытаясь поймать приведение или с помощью instanceof.

Вы также можете обработать поведение при нажатой спине, переопределив этот метод в упражнении:

@Override
public void onBackPressed() {
    int stackSize = fragmentManager.getBackStackEntryCount(); 
    // This counts up from the bottom so the most recent fragment is the biggest number/size
    backFragId = fragmentManager.getBackStackEntryAt(stackSize);
    // Get a handle on the fragment that is about to be popped
    mCurrentFragment = fragmentManager.findFragmentById(backFragId);
    super.onBackPressed();
}

Кроме того, вы уверены, что onAttach не вызывается, когда фрагмент извлекается из стека? Кажется, я помню, что так и будет, и вы можете вызвать через созданный там интерфейс (если он у вас есть, и действие реализует его), чтобы зарегистрировать фрагмент как текущий фрагмент в действии в то время.

Но чтобы прямо ответить на ваш вопрос, не существует встроенного способа просто узнать, какой фрагмент отображается в данный момент (а их может быть больше одного!). Детали реализации этого до вас. Надеюсь, я дал вам несколько идей о том, как с этим можно справиться. Вы также можете найти документацию FragmentManager полезной.

Другие вопросы по тегам