Android - Установить идентификатор фрагмента

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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.

Ответ 3

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

Ответ 4

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

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

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

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

Ура!

Ответ 5

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

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

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

Чтобы определить существующий фрагмент:

getFragmentManager().findFragmentByTag(fragmentName);

Ответ 6

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