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