【问题标题】:Fragment - replace container, if id is not unique片段 - 替换容器,如果 id 不是唯一的
【发布时间】:2016-02-15 07:09:08
【问题描述】:

我的布局有两个具有相同 ID 的视图。如果我想找到视图,我只需调用parentView1.findViewById(R.id.content)parentView2.findViewById(R.id.content) 即可获得正确的视图。

如果我想用片段替换容器,我可以以某种方式定义要替换的容器吗?

【问题讨论】:

  • 为什么要使用 2 个相同的 id?
  • 我正在使用一个库,我在一个视图中使用了两次,它的视图使用相同的内部 id,因此我想有选择地替换一个子视图...
  • 你使用哪个库?
  • 我知道我的用例的解决方案,但我想知道是否存在另一个...我使用 MaterialDrawer 库,我一次使用 2 个抽屉...

标签: android transactions fragment fragmentmanager


【解决方案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_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
     <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:id="@+id/parent_one">
    
        <include layout="@layout/container" />
    
    </LinearLayout>
    
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        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);
    

    【讨论】:

      猜你喜欢
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 2012-04-21
      • 1970-01-01
      • 2020-07-22
      • 2011-08-19
      • 2019-10-02
      相关资源
      最近更新 更多