Como definir uma marca de fragmento por código?

137

Eu não encontrei algo parecido com setTag(String tagName)método na Fragmentclasse. A única maneira de definir uma Fragmentmarca que encontrei é fazendo FragmentTransactione passando um nome de marca como parâmetro.

Essa é a única maneira de definir explicitamente uma Fragmenttag por código?

Axel M. Garcia
fonte

Respostas:

118

Sim. Portanto, a única maneira é no momento da transação, por exemplo add, usar ,replace , ou como parte do layout.

Eu determinei isso através de um exame das fontes de compatibilidade, enquanto eu procurava brevemente semelhante em algum momento no passado.

PJL
fonte
2
A sua resposta mentiras [aqui] [1] no post sobre stackoverflow [1]: stackoverflow.com/questions/9363072/android-set-fragment-id
SME
2
Add do uso FragmentTransaction (int containerViewId, fragmento Fragmento, String tag), como descrito aqui: stackoverflow.com/a/13244471/4002895 @PJL Edite seus answer.This responder enganando as pessoas
dasar
Isso é bastante inconveniente.
Ian Wambai
75

Você pode definir a tag para fragmentar desta maneira:

Fragment fragmentA = new FragmentA();
getFragmentManager().beginTransaction()
    .replace(R.id.MainFrameLayout,fragmentA,"YOUR_TARGET_FRAGMENT_TAG")
    .addToBackStack("YOUR_SOURCE_FRAGMENT_TAG").commit(); 
David
fonte
7
Onde eu uso esse código? Em getItem em FragmentPagerAdapter?
Dr.jacky
35

Você pode fornecer uma tag dentro do arquivo xml do layout da atividade.

Forneça android:tag attributeuma string única.

Assim como você atribuiria um ID em um layout xml.

    android:tag="unique_tag"

link para o guia do desenvolvedor

Kuool
fonte
32
Isso funcionaria se alguém estivesse usando um arquivo de layout. Mas essa pergunta se refere à configuração dinâmica da tag em Java.
IgorGanapolsky
1
essa era a resposta que eu precisava, porque às vezes, enquanto estiver usando algumas bibliotecas, você não tem controle sobre transações de fragmentos, portanto não pode definir programaticamente a tag. Obrigado!
RJFares
3

Você também pode obter todos os fragmentos assim:

Para fragmentos v4

List<Fragment> allFragments = getSupportFragmentManager().getFragments();

Para app.fragment

List<Fragment> allFragments = getFragmentManager().getFragments();
Chris Fremgen
fonte
0

Esta é a melhor maneira que encontrei:

   public class MainActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState == null) {
          // Let's first dynamically add a fragment into a frame container
          getSupportFragmentManager().beginTransaction(). 
              replace(R.id.flContainer, new DemoFragment(), "SOMETAG").
              commit();
          // Now later we can lookup the fragment by tag
          DemoFragment fragmentDemo = (DemoFragment) 
              getSupportFragmentManager().findFragmentByTag("SOMETAG");
        }
    }
}
Kingsley Mitchell
fonte
-1

Eu sei que já faz 6 anos, mas se alguém está enfrentando o mesmo problema, como eu fiz:

Crie uma Fragmentclasse personalizada com um campo de tag:

public class MyFragment extends Fragment {
 private String _myTag;
 public void setMyTag(String value)
 {
   if("".equals(value))
     return;
   _myTag = value;
 }
 //other code goes here
}

Antes de adicionar o fragmento ao sectionPagerAdapterconjunto, a tag da seguinte maneira:

 MyFragment mfrag= new MyFragment();
 mfrag.setMyTag("TAG_GOES_HERE");
 sectionPagerAdapter.AddFragment(mfrag);
Th3Wolf
fonte
A pergunta não era sobre definir uma propriedade em um fragmento. Tratava-se de conseguir recuperar uma instância existente do Fragment sem manter uma referência por perto .
mkuech 25/03
-22

Você pode adicionar a tag como uma propriedade para os Fragmentargumentos. Ele será restaurado automaticamente se o fragmento for destruído e depois recriado pelo sistema operacional .

Exemplo : -

    final Bundle args = new Bundle();
    args.putString("TAG", "my tag");
    fragment.setArguments(args);
farid_z
fonte
Eu entendi o que você quis dizer. Obrigado!
Devhermluna
O que você conseguiu ?! Isso não é como você definir um tag para Fragment não por um tiro longo
Farid