【问题标题】:Android: Override own XML View in XMLAndroid:在 XML 中覆盖自己的 XML 视图
【发布时间】:2012-07-30 12:46:48
【问题描述】:

我正在寻找一种在 android 中覆盖我自己的 XML 视图的方法。 所以我只需要指定一次设置(如背景、边框、默认内容) - 并再次使用它。

问题是我找不到任何关于它的信息。 (我发现的东西是关于在XML中使用java类来覆盖,这不是我想要的)

这是一些不起作用的代码,但我希望它对你解释得足够好:

main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <field android:text="@string/str1" />
    <field android:text="@string/str2" />
    <field android:text="@string/str3" />
    <field android:text="@string/str4" />
    <field android:text="@string/str5" />
</LinearLayout>

code representing field (field.xml):
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/field"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@layout/field_background"
    android:text="@string/default_string"/>

正如您所见,字段本身已通过一次自定义定义并多次使用。 (另一个字符串作为文本集)

这根本不起作用,但我希望有人知道一种方法可以使这样的事情起作用。 (无需编码,只需 XML)

谢谢, 丹尼斯

【问题讨论】:

    标签: android xml styles overriding


    【解决方案1】:

    我不知道如何在没有代码的情况下做你想做的事。我会定义我自己的custom component。另请参阅Different formats for different Textview defined by Custom style,它展示了如何设置您想要的 TextViews 样式。

    【讨论】:

      【解决方案2】:

      这里不需要自定义组件。如果我理解您的问题,样式应该足以满足您的需求。

      只需在 LinearLayout 中定义一系列 TextView,并让它们从您可以定义为 here 的样式中继承公共部分(layout_widthlayout_height 等)。

      根据需要,唯一更改的部分将是android:text

      【讨论】:

        【解决方案3】:

        我建议你设置一个样式。在res/values 的某个文件(通常为styles.xml)中,为您的字段添加样式:

        <style name="DefaultTextFieldStyle">
            <item name="android:id">@+id/field</item>
            <item name="android:layout_width">fill_parent</item>
            <item name="android:layout_height">wrap_content</item>
            <item name="android:background">@layout/field_background</item>
        </style>
        

        然后在main.xml:

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <TextView style="@style/DefaultTextFieldStyle"
                android:text="@string/str1" />
            <TextView style="@style/DefaultTextFieldStyle"
                android:text="@string/str2" />
            <TextView style="@style/DefaultTextFieldStyle"
                android:text="@string/str3" />
            <TextView style="@style/DefaultTextFieldStyle"
                android:text="@string/str4" />
            <TextView style="@style/DefaultTextFieldStyle"
                android:text="@string/str5" />
        </LinearLayout>
        

        我刚刚复制了你的值,但是在一个布局中为多个视图设置相同的 android:id 值是错误的,而且将布局作为背景很奇怪。

        【讨论】:

        • 我不认为编译器会让你在样式中定义android:id,无论如何这个想法是正确的,我同意它。我还将添加样式的父级,以便保证“常见”TextField 行为。
        • @Shine - 我刚刚尝试定义一个包含 &lt;item name="android:id"&gt;@+id/foo&lt;/item&gt; 的样式,编译器和 Android Lint 都对此非常满意。我没有测试 id 值是否真的会应用于视图,但我不明白为什么它不会。
        • 因为,正如您所说,多个视图具有相同的 android:id 值是错误的。我认为这是一个“概念”错误,但没关系 :)
        • 样式完成了这项工作。 :) 我在“父”TextView 中设置的 android:id 是因为我认为子节点应该用它来识别它。 (但显然不是)但是,非常感谢这个解决方案。 :)
        猜你喜欢
        • 2011-05-06
        • 1970-01-01
        • 2017-11-19
        • 1970-01-01
        • 2012-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-06
        相关资源
        最近更新 更多