Как установить Fragment
Id
, чтобы я мог использовать getSupportFragmentManager().findFragmentById(R.id.--)
?
Android - Установить идентификатор фрагмента
Ответ 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 также поддерживает тег фрагмента, в дополнение к методу добавления.