Respostas:
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 FragmentTransaction
o add(int, Fragment)
método de. No entanto, isso não especifica o ID de um fragmento. Ele especifica o ID de um ViewGroup
no qual inserir Fragment
. Isso não é tão útil para o propósito que espero que você tenha, porque não identifica exclusivamente Fragment
s, mas ViewGroup
s. Esses IDs são de contêineres aos quais um ou mais fragmentos podem ser adicionados dinamicamente. Usar tal método para identificar Fragment
s exigiria que você adicionasse ViewGroup
s dinamicamente ao Layout para cada Fragment
inserçã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 . Fragment
s não precisa ter View
s! Eles também podem ser usados para manter o estado efêmero entre as alterações de configuração!
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.
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.
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
, DialogFragment
ou 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!
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);
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