Какие фрагменты я размещаю и показываю?
Есть ли способ узнать, какой 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 полезной.