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

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

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

【问题讨论】:

    标签: android android-3.0-honeycomb android-fragments


    【解决方案1】:

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

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

    【讨论】:

    【解决方案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);
          

          【讨论】:

          【解决方案8】:

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

          示例:-

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

          【讨论】:

          • 我明白你的意思。谢谢!
          • 你得到了什么?!这不是你为 Fragment 设置标签的方式,而不是远景
          • 这不是你设置标签的方式。
          猜你喜欢
          • 2016-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-16
          • 2018-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多