用片段替换某些东西

Posted

技术标签:

【中文标题】用片段替换某些东西【英文标题】: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 是它自己的,无论它是否可见。 【参考方案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

【讨论】:

以上是关于用片段替换某些东西的主要内容,如果未能解决你的问题,请参考以下文章

在片段替换上显示/隐藏 Android 软键盘

TypeScript:用其他东西替换命名空间

用图像和其他东西替换动态内容

根据字符串名称而不是列表视图项位置替换片段并启动活动

我可以用其他可以创建 webhook 来捕获钩子的东西替换 zapier

用NumPy数组中的```[i,i,i]```快速替换元素i的pythonic方法?