Android – 设置片段ID

如何设置一个FragmentId以便我可以使用getSupportFragmentManager().findFragmentById(R.id.--)

您不能以编程方式设置片段的ID

然而,你可以在FragmentTransaction中设置一个String tag ,它可以用来唯一标识一个Fragment。

正如Aleksey指出的那样,您可以将ID传递给FragmentTransactionadd(int, Fragment)方法。 但是, 这并不指定片段的ID。 它指定要插入FragmentViewGroup的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,一个需要及早识别的ListFragmentDialogFragment或普通旧Fragment (POFO ?!)。 但考虑到所提供的收益,我认为这是可以控制的。

抱歉撕毁愈合伤口:-)

干杯!

使用以下内容:

要添加一个片段:

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

要识别现有的片段:

 getFragmentManager().findFragmentByTag(fragmentName); 

除了Tom的回答之外,replace方法还支持fragment标签,另外还有add方法。