Intereting Posts
Ошибка подключения Bluetooth для Android Переименование файлов на Android-телефоне с использованием скрипта Есть ли способ удерживать запрос Volley до тех пор, пока ответ не завершится Как узнать, включены ли уведомления или нет для приложения в android? RxJava / Retrofit – Как заставить пользователей использовать определенный подкласс Subscriber? Как прокси-запросы на api.twitter.com, включая SSL-сертификаты? Как я могу скрыть элементы управления, полноэкранные кнопки в API-интерфейсе Youtube Player android? Почему метод onPause вызывается сразу после onCreate Открытие активности после нажатия push-уведомления android Любые текстовые редакторы с открытым исходным кодом для Android? Выберите первые n строк в contentProvider Запись скрытого файла .nomedia не работает на внутреннем хранилище Как отключить MediaPlayer в android Какой из них использовать? JSONObject от org.json VS JsonObject от javax.json Текст Android обрезается на некоторых устройствах

Есть ли способ получить ссылки для всех активных в настоящий момент фрагментов в Activity?

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

Solutions Collecting From Web of "Есть ли способ получить ссылки для всех активных в настоящий момент фрагментов в Activity?"

Похоже, что 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 Support Library, вы можете вызвать скрытый метод 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)); } 

Я решил с этим:

 public ArrayList<Fragment> getAllFragments() { ArrayList<Fragment> lista = new ArrayList<Fragment>(); for (Fragment fragment : getSupportFragmentManager().getFragments()) { try { fragment.getTag(); lista.add(fragment); } catch (NullPointerException e) { } } return lista; } 

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(); 

Регулярный FragmentManager не имеет этого метода вообще, но если это действительно необходимо, вы можете получить доступ к одному и тому же объекту, получив поле mActive через отражение. Использовать на свой страх и риск 🙂