如果我用这段代码替换(假设)一个片段的TextView:
transaction.replace(R.id.TextView01, fragment1);
新片段(现在在布局中可见)是否与被替换的片段具有相同的ID? (在这种情况下,它是R.id.TextView01)。
这可能看起来像废话,但我将此操作设置为按钮上的操作并重复按下它不会导致任何错误。
那么,它是否具有被替换的id的id或者当我点击几次时它不会被替换(因为片段已经获得了它的唯一ID)?
答案 0 :(得分: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所说,将TextView
替换为Fragment
真是“丑陋”,甚至更多地使用LinearLayout
,RelativeLayout
等视图组替换。显示片段的“正确”方式是FrameLayout
:
旨在屏蔽屏幕上的某个区域以显示单个项目。
如果您搜索一点FrameLayout
,LinearLayout
,RelativeLayout
等,请延伸ViewGroup
,但唯一可以包含片段并重叠视图的是FrameLayout
{{1}} 1}}(就像一个特殊的ViewGroup)。
答案 1 :(得分:0)
Fragments
不是Views
。视图应具有唯一ID,并且片段本身应具有唯一ID。但是在大多数情况下,片段可能具有视图ID。
在您的情况下,是的,他们有相同的ID。
但我认为这可能是一个额外的问题。当Fragments
视图膨胀时,视图将作为提供的ID中的子项添加。由于您的视图仅为TextView
且不支持子视图,因此我不确定此处是否添加了actually
片段。