【问题标题】:How to include a layout twice in Android?如何在 Android 中包含两次布局?
【发布时间】:2010-12-04 18:36:14
【问题描述】:

Android 的<include /> 元素允许您包含其他 XML 布局。对于跨多个活动的通用标题很有用。

但是,如果您想在同一个视图中多次包含一个布局怎么办?例如,我有一个精心设计的布局,我想在我的视图中显示 3 次。这些实例中的每一个都需要不同的值。因为include 基本上是一个把那个XML 粘贴到这里,所以我需要更强大的东西。

有什么机制可以做到这一点吗?

(我的解释是否正确?)

【问题讨论】:

    标签: android layout include


    【解决方案1】:

    http://www.coboltforge.com/2012/05/tech-stuff-layout/ 的一篇博文(现在已离线,但可以在 https://web.archive.org/web/20160425233147/http://www.coboltforge.com/2012/05/tech-stuff-layout/ 找到)准确解释了该问题(包含多次相同的布局 XML)以及如何解决它!

    编辑

    当您按 id 搜索时,您总是会找到第一个项目,因此第二个小部件是隐藏的。

    不过可以解决

    <include> -- id1
        -- stuff
    </include>
    <include> -- id2
        -- stuff
    </include>
    

    所以我们可以通过首先查找 id2 / id1 来找到子元素。

    View include_1 = findViewById(R.id.id1); 
    View include_2 = findViewById(R.id.id2); 
    

    最后

    include_2.findViewById(R.id.elementx );
    

    【讨论】:

    • 一个小警告是,Android lint 似乎仍然对此提出警告:DuplicateIncludedIds: Duplicate ids across layouts combination with include tags
    【解决方案2】:

    有什么机制可以做到这一点吗?

    创建自定义View。例如,Here is a project 我有一个 ColorMixer 自定义小部件。如果您愿意,您可以在一个活动布局中包含几个这样的ColorMixers。每个都可以有自己的参数来调整其操作。

    【讨论】:

    【解决方案3】:

    另一种方法是在 xml 中设置“模板”布局并使用LayoutInflater 对其进行扩展,并根据需要多次添加到您的视图中,并在每个视图中插入自定义值。 Here 是使用 Layout inflater 创建自定义 Toast 视图的示例。

    【讨论】:

      【解决方案4】:

      可以使用android:id指定包含布局的根视图的id;如果定义了一个,它还将覆盖包含布局的 id。同样,您可以覆盖所有布局参数。

      基于提供的android:id,您可以通过 id 获取部分,然后您可以再次根据刚刚检索到的部分通过 id 获取元素。这样,您将能够分两步在每个父视图中查找具有相同 id 的所有子视图。

      【讨论】:

      • 孩子同一个id会不会惹麻烦?例如,当屏幕方向发生变化时,只有具有 id 的视图才会自动保存其状态。如果两个视图具有相同的 id 会导致问题吗?
      • 是的。正如我所怀疑的那样,它会引起问题。如果我将 EditText 放入布局中并从我的主布局中包含两次,则当我旋转屏幕时,第二个 EditText 的文本将被复制到第一个中(与两个视图具有相同 id 而没有 &lt;include&gt; 时相同)。如果 EditText 位于包含布局的 root 中,则它的 id 会被 &lt;include&gt; 标签中的 id 替换。
      • 酷。谢谢。将此作为错误发布,并给我投票的链接。
      • @Pentium10 我想我不会。我什至不确定这实际上是一个错误。我虽然 android:id 首先应该是唯一的(尽管我可能错了)这导致我怀疑这种行为。如果打开了一个错误,但我很想知道它会得到什么响应。
      猜你喜欢
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 2021-04-10
      • 2011-05-02
      • 2013-09-30
      • 1970-01-01
      相关资源
      最近更新 更多