Jak ustawić tag fragmentu według kodu?


137

Nie znalazłem setTag(String tagName)w Fragmentklasie czegoś podobnego do metody . Jedynym sposobem na ustawienie Fragmenttagu, który znalazłem, jest wykonanie a FragmentTransactioni przekazanie nazwy tagu jako parametru.

Czy to jedyny sposób, aby jawnie ustawić Fragmenttag według kodu?

Odpowiedzi:


118

Tak. Tak więc jedynym sposobem jest w momencie zawarcia transakcji, na przykład przy użyciu add, replacelub jako część układu.

Ustaliłem to poprzez zbadanie źródeł zgodności, ponieważ krótko szukałem podobnych w pewnym momencie w przeszłości.


2
Twoja odpowiedź leży [tutaj] [1] w poście na stackoverflow [1]: stackoverflow.com/questions/9363072/android-set-fragment-id
SME

2
Skorzystaj FragmentTransaction za add (int containerViewId, fragment Fragment, String tag) jak opisano tutaj: stackoverflow.com/a/13244471/4002895 @PJL Zedytuj answer.This odpowiedzieć mylące ludzi
Dasar

To dość niewygodne.
Ian Wambai

75

Możesz ustawić znacznik na fragmentację w następujący sposób:

Fragment fragmentA = new FragmentA();
getFragmentManager().beginTransaction()
    .replace(R.id.MainFrameLayout,fragmentA,"YOUR_TARGET_FRAGMENT_TAG")
    .addToBackStack("YOUR_SOURCE_FRAGMENT_TAG").commit(); 

7
Gdzie używam tego kodu? W getItem w FragmentPagerAdapter?
Dr Jacky

35

Możesz umieścić tag w pliku XML układu działania.

Zaopatrz się android:tag attributew unikalny ciąg.

Tak samo, jak przypisujesz identyfikator w formacie XML układu.

    android:tag="unique_tag"

link do podręcznika programisty


32
To zadziałałoby, gdyby ktoś używał pliku układu. Ale to pytanie odnosi się do dynamicznego ustawiania tagu w Javie.
IgorGanapolsky

1
to była odpowiedź, której potrzebowałem, ponieważ czasami podczas korzystania z niektórych bibliotek nie masz kontroli nad transakcjami fragmentarycznymi, więc nie możesz programowo ustawić tagu. Dzięki!
RJFares

3

Możesz także zdobyć wszystkie fragmenty w ten sposób:

W przypadku fragmentów v4

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

Dla app.fragment

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

0

To najlepszy sposób, jaki znalazłem:

   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");
        }
    }
}

-1

Wiem, że to było 6 lat temu, ale jeśli ktoś ma ten sam problem, zrób tak, jak ja:

Utwórz Fragmentklasę niestandardową z polem znacznika:

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

Przed dodaniem fragmentu do sectionPagerAdapterzestawu tag tak po prostu:

 MyFragment mfrag= new MyFragment();
 mfrag.setMyTag("TAG_GOES_HERE");
 sectionPagerAdapter.AddFragment(mfrag);

Pytanie nie dotyczyło ustawienia właściwości we fragmencie. Chodziło o możliwość odzyskania istniejącej instancji Fragment bez zachowywania odniesienia .
mkuech

-22

Możesz dodać znacznik jako właściwość Fragmentargumentów. Zostanie automatycznie przywrócony, jeśli fragment zostanie zniszczony, a następnie odtworzony przez system operacyjny .

Przykład : -

    final Bundle args = new Bundle();
    args.putString("TAG", "my tag");
    fragment.setArguments(args);

Mam to, co masz na myśli. Dzięki!
devhermluna

Co dostałeś?! To nie jest sposób, w jaki ustawiłeś tag dla Fragment nie przez długi czas
Farid
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.