如何通过代码设置片段标签?

Posted

技术标签:

【中文标题】如何通过代码设置片段标签?【英文标题】:How to set a Fragment tag by code? 【发布时间】:2011-09-16 11:31:15 【问题描述】:

我在Fragment 类中没有找到类似setTag(String tagName) 的方法。我发现设置Fragment 标签的唯一方法是执行FragmentTransaction 并将标签名称作为参数传递。

这是通过代码显式设置Fragment标签的唯一方法吗?

【问题讨论】:

【参考方案1】:

是的。所以唯一的方法是在交易时,例如使用addreplace,或作为布局的一部分。

我通过检查兼容性来源确定了这一点,因为我在过去的某个时间短暂地寻找过类似的东西。

【讨论】:

您的答案在于 [here][1] 在 *** [1] 上的帖子中:***.com/questions/9363072/android-set-fragment-id 使用 FragmentTransaction 的 add(int containerViewId, Fragment fragment, String tag) 如下所述:***.com/a/13244471/4002895@PJL 请编辑你的答案。这个答案误导了人们 那很不方便。【参考方案2】:

你可以这样设置tag到fragment:

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

【讨论】:

我在哪里使用此代码?在 FragmentPagerAdapter 的 getItem 中?【参考方案3】:

您可以在活动布局 xml 文件中提供标签。

android:tag attribute 提供一个唯一的字符串。

就像在布局 xml 中分配一个 id。

    android:tag="unique_tag"

link to developer guide

【讨论】:

如果使用布局文件,这将起作用。但是这个问题是指在Java中动态设置标签。 这是我需要的答案,因为有时在使用某些库时,您无法控制片段事务,因此您无法以编程方式设置标签。谢谢!【参考方案4】:

你也可以像这样获取所有片段:

适用于 v4 片段

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

对于 app.fragment

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

【讨论】:

【参考方案5】:

这是我找到的最好方法:

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

【讨论】:

【参考方案6】:

如果您使用DialogFragment(不是Fragment),现在有一种更简单的方法可以实现这一点:

val yourDialogFragment = YourDialogFragment()
yourDialogFragment.show(
    activity.supportFragmentManager,
    "YOUR_TAG_FRAGMENT"
)

在底层,show() 方法确实创建了一个FragmentTransaction 并使用add() 方法添加了标签。但在我看来,使用show() 方法要方便得多。

您也可以使用Kotlin Extension 将其缩短为Fragment :)

【讨论】:

【参考方案7】:

我知道已经是 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);

【讨论】:

问题不在于在片段上设置属性。 It was about being able to retrieve an existing Fragment instance without keeping a reference around. @Th3Wolf,谢谢。你的回答解决了我的问题....【参考方案8】:

您可以将标记添加为Fragment 参数的属性。如果片段被销毁然后由OS重新创建,它将自动恢复。

示例:-

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

【讨论】:

我明白你的意思。谢谢! 你得到了什么?!这不是你为 Fragment 设置标签的方式,而不是远景 这不是你设置标签的方式。

以上是关于如何通过代码设置片段标签?的主要内容,如果未能解决你的问题,请参考以下文章

如何将默认代码设置为 Chrome 控制台?

如何通过 viewModels 获取 viewModel? (片段-ktx)

如何在 FragmentPagerAdapter 中添加片段标签以便稍后引用片段?

刷新标签片段和 viewpager

OnDetach/onAttach 片段重新创建片段活动

Android TabLayout ViewPager 不会在 backstack 上膨胀标签片段