Answers:
您无法以编程方式设置片段的ID。
但是,String tag
您可以在FragmentTransaction内进行设置,以用于唯一地标识Fragment。
正如Aleksey指出的那样,您可以将ID传递给FragmentTransaction
的add(int, Fragment)
方法。但是,这未指定片段的ID。它指定ViewGroup
要插入的ID Fragment
。这对于我期望的用途不是那么有用,因为它不能唯一地标识Fragment
s,而是ViewGroup
s。这些ID属于可以动态添加一个或多个片段的容器。使用这种方法来标识s时,您需要为插入的每个对象动态地将s 添加到Layout中。那将非常麻烦。Fragment
ViewGroup
Fragment
所以,如果你的问题是如何创建一个片段你动态添加一个唯一的标识符,答案是使用FragmentTransaction
的插件(INT containerViewId,片段片段,字符串标记) 的方法和FragmentManager
的findFragmentByTag(字符串)方法。
在我的一个应用程序中,我被迫动态生成字符串。但是相对于实际的FragmentTransaction来说,它并不昂贵。
标签方法的另一个优点是它可以识别未添加到UI的Fragment。请参见FragmentTransaction的add(Fragment,String)方法。Fragment
s不需要View
s!它们还可以用于在配置更改之间保持短暂状态!
原来,您可能不需要知道片段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中保存的任何(很棒的)片段。
正如汤姆(Tom)和其他人已经提到的,有一些方法可以将标签放在片段上并使用该标签进行识别。这些解决方案遇到的一个后续问题是,片段只有在与Activity相关联(或实际上是与FragmentManager
)。如果需要在标记片段之前识别出片段怎么办?
到目前为止,我的解决方案都依赖于世界上最古老的(Java)技巧:创建一个简约的模板片段,该片段在其构造函数之一中使用id,并提供一个 getFragmentId()
返回该id方法。然后,让需要早期识别的那些片段扩展该模板,然后;瞧!问题解决了。
不幸的是,该解决方案可能需要一组模板片段,每个片段类型一个ListFragment
,DialogFragment
或者Fragment
需要早期识别的普通旧版(POFO ?!)。但是考虑到所提供的收益,在我认为是碎片的情况下,这是可以控制的。
对不起,撕开愈合的伤口:-)
干杯!
使用以下内容:
要添加片段:
getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();
要识别现有片段:
getFragmentManager().findFragmentByTag(fragmentName);
使用标签时,请务必添加
fragmentTransaction.addToBackStack(null);
方法,以便您的Fragment可以恢复,而不是像开发人员指南中提到的那样销毁。
如果在执行删除片段的事务时未调用addToBackStack(),则在提交事务时该片段将被销毁,并且用户无法导航回该片段。而如果您在删除片段时确实调用了addToBackStack(),则该片段将停止,并且如果用户向后导航,该片段将在以后恢复。
您可以在此页面末尾找到它。
我花了大约30分钟的时间试图弄清楚为什么通过一个简单的findFragmentByTag();
电话就找不到我的片段