Как установить тег фрагмента по коду?

137

Ничего подобного setTag(String tagName)в Fragmentклассе я не нашел . Единственный способ установить Fragmentтег, который я нашел, - это выполнить FragmentTransactionи передать имя тега в качестве параметра.

Это единственный способ явно установить Fragmentтег по коду?

Аксель М. Гарсия
источник

Ответы:

118

Да. Таким образом, единственный путь во время операции, например , с использованием add, replaceили как часть макета.

Я определил это путем изучения источников совместимости, поскольку в какой-то момент в прошлом я кратко искал похожие.

PJL
источник
2
Ваш ответ находится [здесь] [1] в сообщении о stackoverflow [1]: stackoverflow.com/questions/9363072/android-set-fragment-id
SME
2
Используйте добавление FragmentTransaction (int containerViewId, Fragment fragment, String tag), как описано здесь: stackoverflow.com/a/13244471/4002895 @PJL Пожалуйста, отредактируйте свой ответ.
Этот
Это довольно неудобно.
Ян Вамбай
75

Вы можете установить тег для фрагмента следующим образом:

Fragment fragmentA = new FragmentA();
getFragmentManager().beginTransaction()
    .replace(R.id.MainFrameLayout,fragmentA,"YOUR_TARGET_FRAGMENT_TAG")
    .addToBackStack("YOUR_SOURCE_FRAGMENT_TAG").commit(); 
Дэвид
источник
7
Где я использую этот код? В getItem в FragmentPagerAdapter?
Доктор Джеки
35

Вы можете предоставить тег внутри XML-файла макета активности.

Поставьте android:tag attributeуникальную строку.

Так же, как вы назначаете идентификатор в макете xml.

    android:tag="unique_tag"

ссылка на руководство разработчика

Куул
источник
33
Это сработало бы, если бы вы использовали файл макета. Но этот вопрос относится к динамической установке тега в Java.
Игорь Ганапольский
1
это был ответ, который мне был нужен, потому что иногда при использовании некоторых библиотек у вас нет контроля над транзакциями фрагментов, поэтому вы не можете программно установить тег. Благодарность!
RJFares
3

Вы также можете получить все фрагменты так:

Для фрагметов v4

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

Для app.fragment

List<Fragment> allFragments = getFragmentManager().getFragments();
Крис Фремген
источник
1

Это лучший способ, который я нашел:

   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

Я знаю, что это было 6 лет назад, но если кто-то столкнулся с той же проблемой, сделайте то же, что и я:

Создайте собственный Fragmentкласс с полем тега:

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

Перед добавлением фрагмента в sectionPagerAdapterнабор тег просто так:

 MyFragment mfrag= new MyFragment();
 mfrag.setMyTag("TAG_GOES_HERE");
 sectionPagerAdapter.AddFragment(mfrag);
Th3Wolf
источник
-22

Вы можете добавить тег как свойство для Fragmentаргументов. Он будет автоматически восстановлен, если фрагмент будет уничтожен, а затем воссоздан ОС .

Пример : -

    final Bundle args = new Bundle();
    args.putString("TAG", "my tag");
    fragment.setArguments(args);
farid_z
источник
Я так и понял. Благодарность!
northernlights
Что ты получил?! Это не то, как вы устанавливаете тег для фрагмента не слишком долго
Фарид