Android – 设置片段ID
如何设置一个Fragment
的Id
以便我可以使用getSupportFragmentManager().findFragmentById(R.id.--)
?
您不能以编程方式设置片段的ID 。
然而,你可以在FragmentTransaction中设置一个String tag
,它可以用来唯一标识一个Fragment。
正如Aleksey指出的那样,您可以将ID传递给FragmentTransaction
的add(int, Fragment)
方法。 但是, 这并不指定片段的ID。 它指定要插入Fragment
的ViewGroup
的ID。 这对于我所期望的目的来说并不是那么有用,因为它并不唯一地标识Fragment
,而是ViewGroup
。 这些ID是可以dynamic添加一个或多个片段的容器 。 使用这种方法来识别Fragment
将需要您dynamic地将ViewGroup
添加到您插入的每个Fragment
的布局。 这将是非常麻烦的。
所以如果你的问题是如何创build一个dynamic添加的Fragment的唯一标识符,答案是使用FragmentTransaction
的add(int containerViewId,Fragment fragment,String tag)方法和FragmentManager
的findFragmentByTag(String)方法。
在我的一个应用程序中,我被迫dynamic地生成string。 但是,相对于实际的FragmentTransaction而言,这并不是那么昂贵。
标记方法的另一个优点是它可以识别未被添加到UI的片段。 请参阅FragmentTransaction的add(Fragment,String)方法。 Fragment
s不需要View
s! 它们也可以用来在configuration更改之间保持短暂状态!
原来你可能不需要知道片段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举行。
在大多数情况下,您可以使用片段标签以及ID。
您可以在FragmentTransaction.add(Fragment fragment, String tag );
设置标签值FragmentTransaction.add(Fragment fragment, String tag );
。 然后,您可以使用命令FragmentManager.findFragmentByTag(String tab)
来查找有问题的片段。
正如Tom和其他人已经提到的那样,有一些方法可以在一个片段上添加一个标签,并使用该标签进行识别。 我遇到的这些解决scheme的后续问题是,片段在与Activity(或实际上, FragmentManager
)关联之前不会获得标签。 如果需要在标记之前识别片段,该怎么办?
到目前为止,我的解决scheme都依赖于世界上最古老的(Java)技巧:创build一个简约的模板片段,在其构造函数之一中提供一个id,并提供返回该id的getFragmentId()
方法。 然后让那些需要及早识别的片段扩展这个模板, 瞧! 问题解决了。
不幸的是,这个解决scheme可能需要一组模板片段,一个用于每个片段types,一个需要及早识别的ListFragment
, DialogFragment
或普通旧Fragment
(POFO ?!)。 但考虑到所提供的收益,我认为这是可以控制的。
抱歉撕毁愈合伤口:-)
干杯!
使用以下内容:
要添加一个片段:
getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();
要识别现有的片段:
getFragmentManager().findFragmentByTag(fragmentName);
除了Tom的回答之外,replace方法还支持fragment标签,另外还有add方法。