Есть ли способ получить ссылки для всех активных в данный момент фрагментов в действии?
Я не нашел простого способа получить все активные в данный момент (видимые, в настоящее время в возобновленном состоянии) фрагменты в действии. Возможно ли это без специальной бухгалтерии в моей деятельности? Похоже, что FragmentManager не поддерживает эту функцию.
5 ответов:
похоже, что API в настоящее время пропускает такой метод, как "getFragments".
Однако с помощью события "onAttachFragment" класса Activity это должно быть довольно легко сделать то, что вы хотите. Я бы сделал что-то вроде:List<WeakReference<Fragment>> fragList = new ArrayList<WeakReference<Fragment>>(); @Override public void onAttachFragment (Fragment fragment) { fragList.add(new WeakReference(fragment)); } public List<Fragment> getActiveFragments() { ArrayList<Fragment> ret = new ArrayList<Fragment>(); for(WeakReference<Fragment> ref : fragList) { Fragment f = ref.get(); if(f != null) { if(f.isVisible()) { ret.add(f); } } } return ret; }
в случае, если нет готового метода для чтения состояния из объекта (isActive() в примере), я бы переопределил onResume и onPause, чтобы установить флаг (может быть просто поле bool).
Это уже какая-то собственная бухгалтерия, но все еще очень ограниченная в моем мнение с учетом вполне конкретной цели, которую вы хотите достичь (список зависимых от статуса).
Если вы используете библиотеку поддержки Android, то вы можете вызвать hidden
FragmentManager.getFragments()
способ:public List<Fragment> getVisibleFragments() { List<Fragment> allFragments = getSupportFragmentManager().getFragments(); if (allFragments == null || allFragments.isEmpty()) { return Collections.emptyList(); } List<Fragment> visibleFragments = new ArrayList<Fragment>(); for (Fragment fragment : allFragments) { if (fragment.isVisible()) { visibleFragments.add(fragment); } } return visibleFragments; }
еще один способ сделать это-поместить теги на ваши фрагменты, когда вы добавляете их в действие.
например, если вы динамически добавляете 4 фрагмента, вы можете добавить их как:
for (int i = 0; i < NUM_FRAGMENTS; i++){ MyFragment fragment = new Fragment(i); fragmentTransaction.add(R.id.containerId, fragment, SOME_CUSTOM_PREFIX + i).commit() }
затем, если вам нужно вернуть все фрагменты позже, вы можете сделать:
for (int i = 0; i < NUM_FRAGMENTS; i++) { String tag = SOME_CUSTOM_PREFIX + i; fragmentList.add((MyFragment) fragmentManager.findFragmentByTag(tag)); }
android.support.v4.app.FragmentManager
имеет метод с именемgetFragments()
что делает именно то, что вам нужно, но он никогда не был доступен. Внезапно, однако, это так, но я не уверен, что это предназначено, потому что он все еще помечен как скрытый./** * Get a list of all fragments that have been added to the fragment manager. * * @return The list of all fragments or null if none. * @hide */ public abstract List<Fragment> getFragments();
обычный
android.app.FragmentManager
не имеет этого метода вообще, но если это действительно необходимо, вы можете получить доступ к тому же объекту, получив полеmActive
через отражение (будьте осторожны: начиная с API 26, его тип-aSparseArray
вместоList
). Используйте на свой страх и риск :)