用片段替换某些东西
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
替换TextView
。 TextView
是一个相当愚蠢的 UI 小部件,而 Fragment
的智能接近于 Activity
。我可以理解用另一个Fragment
替换只包含一个TextView
的Fragment
,但不能用Fragment
替换TextView
。另外,不...TextView
的 id 是它自己的,无论它是否可见。
【参考方案1】:
当您执行replace(id, fragment)
时,您不会替换id
,而是替换view
。第一个参数是int containerViewId
,它用于:
要替换片段的容器的标识符
这只是容器。如您所知,替换方法是remove
和add
方法的组合。当您查看remove
方法时,您可以阅读:
删除现有的片段。如果它被添加到容器中,它的视图也会从该容器中删除。
你使用remove(Fragment fragment)
,你不使用任何id
。此外,“从该容器中”表示容器未在布局中删除,因此您不要使用任何 id
并且不要使用容器 ID。
拥有“id”的唯一方法是使用:
replace(int containerViewId, Fragment fragment, String tag)
String tag
允许您使用findFragmentByTag(String)
检索此片段。
最后,正如@Squonk 所说,用Fragment
替换TextView
真的很“丑陋”,甚至用LinearLayout
、RelativeLayout
等视图组替换更多。显示片段的唯一“正确”方式是FrameLayout
其中:
被设计成在屏幕上遮挡一个区域以显示单个项目。
如果您搜索一点FrameLayout
、LinearLayout
、RelativeLayout
等,请扩展ViewGroup
,但唯一可以包含片段并与视图重叠的是FrameLayout
(如特殊的视图组)。
【讨论】:
【参考方案2】:Fragments
不是Views
。视图应该有唯一的 id,片段本身应该有唯一的 id。但在大多数情况下,Fragment 可能具有 Views id。
在您的情况下,是的,它们具有相同的 ID。
但我认为它们在这里可能是一个额外的问题。当Fragments
视图膨胀时,该视图将作为子项添加到提供的 id 中。由于您的视图只是 TextView
并且它不支持子视图,因此我不确定 Fragment 是否是在此处添加的 actually
。
【讨论】:
以上是关于用片段替换某些东西的主要内容,如果未能解决你的问题,请参考以下文章