片段 - 替换容器,如果 id 不是唯一的
Posted
技术标签:
【中文标题】片段 - 替换容器,如果 id 不是唯一的【英文标题】:Fragment - replace container, if id is not unique 【发布时间】:2016-02-15 07:09:08 【问题描述】:我的布局有两个具有相同 ID 的视图。如果我想找到视图,我只需调用parentView1.findViewById(R.id.content)
或parentView2.findViewById(R.id.content)
即可获得正确的视图。
如果我想用片段替换容器,我可以以某种方式定义要替换的容器吗?
【问题讨论】:
为什么要使用 2 个相同的 id? 我正在使用一个库,我在一个视图中使用了两次,它的视图使用相同的内部 id,因此我想有选择地替换一个子视图... 你使用哪个库? 我知道我的用例的解决方案,但我想知道是否存在另一个...我使用 MaterialDrawer 库,我一次使用 2 个抽屉... 【参考方案1】:片段管理器只接受 id,所以我认为答案是否定的,你不能指定容器。但是你仍然可以找到它们。
作为一种解决方法,您可以用片段包装容器,然后在这些片段中,ID 将是唯一的;所以你可以做类似fragment1.replaceContent(...)
的事情,其中.replaceContent(...)
是你自己的方法。 Ofc,您需要确保您的引用正确,状态保存等。
【讨论】:
【参考方案2】:您应该将相同的 id 布局包装在父布局中。然后将第二个容器的 id 设置为不同的整数。例如布局文件如下所示:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical"
android:id="@+id/parent_one">
<include layout="@layout/container" />
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical"
android:id="@+id/parent_two">
<include layout="@layout/container"/>
</LinearLayout>
</LinearLayout>
您将首先使用父 ID 访问它们。然后将第二个容器的 id 设置为不同的。例如:
val containerOneId = parent_one.container.id
val containerTwoId = 1
parent_two.container.id = containerTwoId
openFragment(TestFragment().apply
val b = Bundle()
b.putString(TestFragment.ARG, "Fragment one")
arguments = b
, containerOneId)
openFragment(TestFragment().apply
val b = Bundle()
b.putString(TestFragment.ARG, "Fragment two")
arguments = b
, containerTwoId)
相同的访问逻辑,但在 Java 中(如果您不使用 Kotlin)
LinearLayout parentOne = (LinearLayout) findViewById(R.id.parent_one);
LinearLayout parentTwo = (LinearLayout) findViewById(R.id.parent_two);
FrameLayout containerOne = parentOne.findViewById(R.id.container);
FrameLayout containerTwo = parentTwo.findViewById(R.id.container);
int containerOneId = containerOne.getId();
int containerTwoId = 1;
containerTwo.setId(containerTwoId);
openFragment(new TestFragment(), containerOneId);
openFragment(new TestFragment(), containerTwoId);
【讨论】:
以上是关于片段 - 替换容器,如果 id 不是唯一的的主要内容,如果未能解决你的问题,请参考以下文章
在 PHP 中验证唯一的用户 ID,如果不是唯一的则返回错误 [重复]
Grails 新手 - 脚手架问题 - 用可读值替换唯一 ID?
如果我在 Apollo Client 中使用 dataIdFromObject 设置了唯一标识符,是不是需要 graphql 的 ID 类型