Android - Установить идентификатор фрагмента - PullRequest
107 голосов
/ 20 февраля 2012

Как мне установить Fragment Id, чтобы я мог использовать getSupportFragmentManager().findFragmentById(R.id.--)?

Ответы [ 7 ]

112 голосов
/ 06 ноября 2012

Вы не можете установить идентификатор фрагмента программно .

Тем не менее, есть String tag, который вы можете установить внутри FragmentTransaction, который можно использовать для уникальной идентификации фрагмента.

Как отметил Алексей, вы можете передать идентификатор методу FragmentTransaction add(int, Fragment). Однако это не указывает идентификатор для фрагмента. Это указывает идентификатор ViewGroup для вставки Fragment в. Это не очень полезно для той цели, которую я ожидаю от вас, потому что она не уникально идентифицирует Fragment с, но ViewGroup с Эти идентификаторы относятся к контейнерам , к которым можно динамически добавить один или более фрагментов. Использование такого метода для идентификации Fragment s потребует от вас динамического добавления ViewGroup s к макету для каждого Fragment, который вы вставляете. Это было бы довольно громоздко.

Так что, если ваш вопрос заключается в том, как создать уникальный идентификатор для фрагмента, который вы добавляете динамически, ответ заключается в использовании FragmentTransaction ' add (int containerViewId, Fragment Fragment, String tag) method и метод FragmentManager findFragmentByTag (String) .

В одном из моих приложений я был вынужден генерировать строки динамически. Но в любом случае это не так дорого по сравнению с реальной FragmentTransaction.

Еще одним преимуществом метода тегов является то, что он может идентифицировать фрагмент, который не добавляется в пользовательский интерфейс. См. Метод FragmentTransaction add (Fragment, String) . Fragment s не нужно иметь View s! Они также могут использоваться для сохранения эфемерного состояния между изменениями конфигурации!

40 голосов
/ 19 февраля 2014

Оказывается, вам может не потребоваться знать идентификатор фрагмента.

Из документов:

public abstract Fragment findFragmentById (int id)

Finds a fragment that was identified by the given id either
when inflated from XML or as the container ID when added in
a transaction.

Важной частью является "как идентификатор контейнера при добавлении в транзакцию".

так:

getSupportFragmentManager()
    .beginTransaction()
    .add(R.id.fragment_holder, new AwesomeFragment())
    .commit();

, а затем

AwesomeFragment awesome = (AwesomeFragment)
     getSupportFragmentManager()
          .findFragmentById(R.id.fragment_holder);

даст вам любой (удивительный) фрагмент, хранящийся в R.id.fragment_holder.

4 голосов
/ 26 января 2013

В большинстве случаев вы можете использовать тег фрагмента, а также идентификатор.
Вы можете установить значение тега в FragmentTransaction.add(Fragment fragment, String tag );.Затем вы можете использовать команду FragmentManager.findFragmentByTag(String tab), чтобы найти нужный фрагмент.

2 голосов
/ 15 июля 2013

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

Мои решения до сих пор основаны на самом старом (Java) трюке в мире: создайте минималистичный фрагмент шаблона, который получает идентификатор в одном из своих конструкторов и предоставляет метод getFragmentId(), который возвращает этот идентификатор. Затем я позволю тем фрагментам, которые нуждаются в ранней идентификации, расширить этот шаблон и; вуаля! Проблема решена.

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

Извините за разрывание заживающих ран: -)

Ура!

1 голос
/ 22 июля 2016

Используйте следующее:

Чтобы добавить фрагмент:

getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();

Для идентификации существующего фрагмента:

getFragmentManager().findFragmentByTag(fragmentName);
0 голосов
/ 17 октября 2018

При использовании тега обязательно добавьте

fragmentTransaction.addToBackStack(null); 

метод, так что ваш фрагмент возобновляется, а не уничтожается, как указано в руководствах для разработчиков.

Если вы не вызываете addToBackStack () при выполнении транзакции, которая удаляет фрагмент, тогда этот фрагмент уничтожается, когда транзакция фиксируется, и пользователь не может вернуться к ней. Принимая во внимание, что если вы вызываете addToBackStack () при удалении фрагмента, то этот фрагмент останавливается и позже возобновляется, если пользователь переходит обратно.

Вы можете найти это в конце этой страницы .

Я потерял около 30 минут, пытаясь выяснить, почему мой фрагмент не был найден с помощью простого findFragmentByTag(); звонка

0 голосов
/ 25 июня 2014

В дополнение к ответу Тома метод replace также поддерживает тег фрагмента, в дополнение к методу add.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...