Android-设置片段ID


110

我如何可以设置FragmentId,这样我可以使用getSupportFragmentManager().findFragmentById(R.id.--)


您可以在布局xml文件中设置它
Vladimir Eremeev

Answers:


116

您无法以编程方式设置片段的ID

但是,String tag您可以在FragmentTransaction内进行设置,以用于唯一地标识Fragment。

正如Aleksey指出的那样,您可以将ID传递给FragmentTransactionadd(int, Fragment)方法。但是,这未指定片段的ID。它指定ViewGroup要插入的ID Fragment。这对于我期望的用途不是那么有用,因为它不能唯一地标识Fragments,而是ViewGroups。这些ID属于可以动态添加一个或多个片段的容器。使用这种方法来标识s时,您需要为插入的每个对象动态地将s 添加到Layout中。那将非常麻烦。FragmentViewGroupFragment

所以,如果你的问题是如何创建一个片段你动态添加一个唯一的标识符,答案是使用FragmentTransaction插件(INT containerViewId,片段片段,字符串标记) 的方法和FragmentManagerfindFragmentByTag(字符串)方法。

在我的一个应用程序中,我被迫动态生成字符串。但是相对于实际的FragmentTransaction来说,它并不昂贵。

标签方法的另一个优点是它可以识别未添加到UI的Fragment。请参见FragmentTransaction的add(Fragment,String)方法。Fragments不需要Views!它们还可以用于在配置更改之间保持短暂状态!


如果我使用标签而不是片段的ID,该如何使用需要片段资源ID的替换调用?
Namratha 2013年

12
@TomDignan将要添加到ViewPager中的片段怎么样?如何设置他的标签?在这种情况下,我无法使用交易。
GuilhE 2015年

1
@GuilhE活动提供了一个addFragment()方法,您可以从viewpager中进行引用。保留标签之前,可以使用哈希映射来完成。
托马斯·迪格南2015年

1
可以稍微修改一下答案以强调您可以在xml布局中设置id吗?因为我本人没有阅读其他问题,并且给人的印象是根本没有办法为片段设置id……
Ivan

41

原来,您可能不需要知道片段ID。

从文档:

public abstract Fragment findFragmentById (int id)

Finds a fragment that was identified by the given id either
when inflated from XML or as the container ID when added in
a transaction.

重要的部分是“作为事务处理中添加时的容器ID”。

所以:

getSupportFragmentManager()
    .beginTransaction()
    .add(R.id.fragment_holder, new AwesomeFragment())
    .commit();

然后

AwesomeFragment awesome = (AwesomeFragment)
     getSupportFragmentManager()
          .findFragmentById(R.id.fragment_holder);

将获得R.id.fragment_holder中保存的任何(很棒的)片段。


4

在大多数情况下,您可以使用片段标记以及ID。
您可以在中设置标签值FragmentTransaction.add(Fragment fragment, String tag );。然后,您可以使用命令FragmentManager.findFragmentByTag(String tab)查找有问题的片段。


2

正如汤姆(Tom)和其他人已经提到的,有一些方法可以将标签放在片段上并使用该标签进行识别。这些解决方案遇到的一个后续问题是,片段只有在与Activity相关联(或实际上是与FragmentManager)。如果需要在标记片段之前识别出片段怎么办?

到目前为止,我的解决方案都依赖于世界上最古老的(Java)技巧:创建一个简约的模板片段,该片段在其构造函数之一中使用id,并提供一个 getFragmentId()返回该id方法。然后,让需要早期识别的那些片段扩展该模板,然后;瞧!问题解决了。

不幸的是,该解决方案可能需要一组模板片段,每个片段类型一个ListFragmentDialogFragment或者Fragment需要早期识别的普通旧版(POFO ?!)。但是考虑到所提供的收益,在我认为是碎片的情况下,这是可以控制的。

对不起,撕开愈合的伤口:-)

干杯!


0

使用以下内容:

要添加片段:

getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();

要识别现有片段:

getFragmentManager().findFragmentByTag(fragmentName);

答案与问题无关。请更新答案。快乐编码
CodeWithVikas 19/12/19

-1

使用标签时,请务必添加

fragmentTransaction.addToBackStack(null); 

方法,以便您的Fragment可以恢复,而不是像开发人员指南中提到的那样销毁。

如果在执行删除片段的事务时未调用addToBackStack(),则在提交事务时该片段将被销毁,并且用户无法导航回该片段。而如果您在删除片段时确实调用了addToBackStack(),则该片段将停止,并且如果用户向后导航,该片段将在以后恢复。

您可以在此页面末尾找到它。

我花了大约30分钟的时间试图弄清楚为什么通过一个简单的findFragmentByTag();电话就找不到我的片段


-2

除汤姆的回答外,replace方法除add方法外还支持fragment标签。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.