【问题标题】:Replacing something with a fragment用片段替换某些东西
【发布时间】:2014-05-03 14:30:54
【问题描述】:

如果我用这段代码用片段替换(比方说)TextView:

transaction.replace(R.id.TextView01, fragment1);

新片段(现在在布局中可见)是否具有与替换片段相同的 id? (在这种情况下,它是 R.id.TextView01)。

这似乎是无稽之谈,但我将此操作设置为按钮上的操作,并且重复按下它不会导致任何错误。

那么,它是否有被替换的 id 或者当我点击几次时它没有替换(因为片段有它的唯一 id)?

【问题讨论】:

  • 在设置新的片段时,还应该给它一个字符串标签,供以后参考;
  • 据我所知,替换的事务方法有两种:replace(id, fragment, tag) 和replace(id, fragment)。第二个是标签设置为空(根据文档)。那么应该引用哪个id呢?
  • 有点困惑为什么要用Fragment 替换TextViewTextView 是一个相当愚蠢的 UI 小部件,而 Fragment 的智能接近于 Activity。我可以理解用另一个Fragment 替换只包含一个TextViewFragment,但不能用Fragment 替换TextView。另外,不...TextView 的 id 是它自己的,无论它是否可见。

标签: android layout android-fragments fragment


【解决方案1】:

当您执行replace(id, fragment) 时,您不会替换id,而是替换view。第一个参数是int containerViewId,它用于:

要替换片段的容器的标识符

这只是容器。如您所知,替换方法是removeadd 方法的组合。当您查看remove 方法时,您可以阅读:

删除现有的片段。如果它被添加到容器中,它的视图也会从该容器中删除。

你使用remove(Fragment fragment),你不使用任何id。此外,“从该容器中”表示容器未在布局中删除,因此您不要使用任何 id 并且不要使用容器 ID。
拥有“id”的唯一方法是使用:

replace(int containerViewId, Fragment fragment, String tag)  

String tag 允许您使用findFragmentByTag(String) 检索此片段。
最后,正如@Squonk 所说,用Fragment 替换TextView 真的很“丑陋”,甚至用LinearLayoutRelativeLayout 等视图组替换更多。显示片段的唯一“正确”方式是FrameLayout 其中:

被设计成在屏幕上遮挡一个区域以显示单个项目。

如果您搜索一点FrameLayoutLinearLayoutRelativeLayout 等,请扩展ViewGroup,但唯一可以包含片段并与视图重叠的是FrameLayout(如特殊的视图组)。

【讨论】:

    【解决方案2】:

    Fragments 不是Views。视图应该有唯一的 id,片段本身应该有唯一的 id。但在大多数情况下,Fragment 可能具有 Views id。

    在您的情况下,是的,它们具有相同的 ID。

    但我认为它们在这里可能是一个额外的问题。当Fragments 视图膨胀时,该视图将作为子项添加到提供的 id 中。由于您的视图只是 TextView 并且它不支持子视图,因此我不确定 Fragment 是否是在此处添加的 actually

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-12
      • 2021-08-13
      • 2010-12-07
      相关资源
      最近更新 更多