Android - 设置片段ID

时间:2012-02-20 14:51:55

标签: android android-fragments

如何设置Fragment Id以便我可以使用getSupportFragmentManager().findFragmentById(R.id.--)

7 个答案:

答案 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()方法。然后我让那些需要早期识别的片段扩展了该模板;瞧!问题解决了。

遗憾的是,此解决方案可能需要一组模板片段,每个片段类型一个,ListFragmentDialogFragment或普通旧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();通话来找出为什么找不到我的片段