Android - Definir id de fragmento

111

Como posso definir um Fragment's Idpara que eu possa usargetSupportFragmentManager().findFragmentById(R.id.--) ?

tyb
fonte
Você pode configurá-lo no arquivo de layout xml
Vladimir Eremeev

Respostas:

117

Você não pode definir o ID de um fragmento de forma programática .

No entanto, há um String tag que você pode definir dentro da FragmentTransaction que pode ser usado para identificar exclusivamente um Fragment.

Como Aleksey apontou, você pode passar um ID para FragmentTransactiono add(int, Fragment)método de. No entanto, isso não especifica o ID de um fragmento. Ele especifica o ID de um ViewGroupno qual inserir Fragment. Isso não é tão útil para o propósito que espero que você tenha, porque não identifica exclusivamente Fragments, mas ViewGroups. Esses IDs são de contêineres aos quais um ou mais fragmentos podem ser adicionados dinamicamente. Usar tal método para identificar Fragments exigiria que você adicionasse ViewGroups dinamicamente ao Layout para cada Fragmentinserção. Isso seria muito complicado.

Portanto, se sua pergunta é como criar um identificador exclusivo para um fragmento que você está adicionando dinamicamente, a resposta é usar FragmentTransaction de add (int containerViewId, Fragmento fragmento, String tag) método e FragmentManager's findFragmentByTag (String) método.

Em um de meus aplicativos, fui forçado a gerar strings dinamicamente. Mas não é tão caro em relação à FragmentTransaction real, de qualquer maneira.

Outra vantagem do método de tag é que ele pode identificar um Fragment que não está sendo adicionado à IU. Consulte o método add (Fragment, String) de FragmentTransaction . Fragments não precisa ter Views! Eles também podem ser usados ​​para manter o estado efêmero entre as alterações de configuração!

Thomas Dignan
fonte
Se eu usar a tag e não a ID do fragmento, como usaria a chamada de substituição que precisa de uma ID de recurso de fragmento?
Namratha
12
@TomDignan que tal um fragmento que será adicionado em um ViewPager? Como posso definir sua tag? Não posso usar transações nesta situação.
GuilhE
1
@GuilhE Activity fornece um método addFragment () que você pode fazer referência no viewpager. Manter a tag antes disso poderia ser feito com um hashmap.
Thomas Dignan
1
A resposta pode ser editada um pouco para enfatizar que você pode definir a id no layout xml? Porque eu pessoalmente não li outras perguntas e tive a impressão de que não há como definir a id para o fragmento ...
Ivan
41

Acontece que você pode não precisar saber a id do fragmento.

Dos documentos:

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.

A parte importante é "como o ID do contêiner quando adicionado em uma transação".

tão:

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

e depois

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

obterá qualquer fragmento (incrível) mantido em R.id.fragment_holder.

Moral dos alces
fonte
4

Na maioria dos casos, você pode usar a tag do fragmento e também o ID.
Você pode definir o valor do tag em FragmentTransaction.add(Fragment fragment, String tag );. Então você pode usar o comando FragmentManager.findFragmentByTag(String tab)para encontrar o fragmento em questão.

user2014118
fonte
2

Como Tom e outros já mencionaram, existem maneiras de colocar uma etiqueta em um fragmento e usar essa etiqueta para identificação. Um problema subsequente que encontrei com essas soluções é que o fragmento não recebe uma tag até que seja associado à Activity (ou, na verdade, a FragmentManager). O que fazer se for necessário identificar um fragmento antes de ser marcado?

Minhas soluções até agora contam com o truque (Java) mais antigo do mundo: criar um fragmento de modelo minimalista que leva um id em um de seus construtores e fornece um getFragmentId() método que retorna esse id. Em seguida, deixo que os fragmentos que precisam de identificação precoce estendam esse modelo e; voila! Problema resolvido.

Esta solução pode, infelizmente, exigir um conjunto de fragmentos de modelo, um para cada tipo de fragmento ListFragment, DialogFragmentou simples Fragment(POFO ?!) que precisam de identificação antecipada. Mas isso é administrável no caso de fragmentos, eu acho, considerando os ganhos proporcionados.

Desculpe por rasgar feridas curativas :-)

Felicidades!

dbm
fonte
0

Use o seguinte:

Para adicionar um fragmento:

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

Para identificar o fragmento existente:

getFragmentManager().findFragmentByTag(fragmentName);
Jaydev
fonte
A resposta não é relevante para a pergunta. Por favor, atualize a resposta. Happy Coding
CodeWithVikas
-1

Ao usar uma tag, certifique-se de adicionar o

fragmentTransaction.addToBackStack(null); 

método para que seu Fragment seja retomado em vez de destruído conforme mencionado nos guias do desenvolvedor.

Se você não chamar addToBackStack () ao realizar uma transação que remove um fragmento, esse fragmento será destruído quando a transação for confirmada e o usuário não poderá navegar de volta para ele. Ao passo que, se você chamar addToBackStack () ao remover um fragmento, o fragmento será interrompido e posteriormente retomado se o usuário navegar de volta.

Você pode encontrar isso no final desta página .

Perdi cerca de 30 minutos tentando descobrir por que meu Fragment não foi encontrado através de uma simples findFragmentByTag();ligação

Panos Gr
fonte
-2

Além da resposta de Tom, o método replace também oferece suporte à tag fragment, além do método add.

oren zvi
fonte