【问题标题】:How does an android:attr style work?android:attr 样式是如何工作的?
【发布时间】:2012-06-03 09:24:40
【问题描述】:

我正在尝试通过布局构建 Android UI。我从以下内容开始:

<TextView
    android:id="@+id/..."
    android:layout_marginTop="8dip"
    android:text="..."
    style="?android:attr/listSeparatorTextViewStyle"/>

这看起来不错(全部大写,字体更小,下方的分隔条)。现在想扩展样式,所以改成如下:

<TextView
    android:id="@+id/..."
    android:layout_marginTop="8dip"
    android:text="..."
    style="@style/section_title"/>

风格为:

<style name="section_title" parent="@android:attr/listSeparatorTextViewStyle">
    <item name="android:layout_width">fill_parent</item>
    <item name="android:layout_height">wrap_content</item>
</style>

这不起作用(字体正确,但分隔线不见了)。

怎么会……那个?

【问题讨论】:

    标签: android


    【解决方案1】:

    使用时:

    style="?android:attr/listSeparatorTextViewStyle"
    

    您正在使用此属性指向的样式 (listSeparatorTextViewStyle)。如果您查看平台themes.xml,您会看到该属性实际使用的样式是Widget.TextView.ListSeparator.White。所以这是您应该以自定义样式扩展的style

    不幸的是,这种风格是私有的,你不能扩展它,或者你不应该扩展它(参考,见谷歌的this bug report)。您最好的选择是复制整个样式,Widget.TextView.ListSeparator.WhiteWidget.TextView.ListSeparator 也不是公开的,因此也必须复制它),在您的自定义样式中并使用它而不是从 android 平台扩展样式(请参阅上面链接中的this response)。

    【讨论】:

    • 现在说得通了。不过,这似乎是一个丑陋的解决方案。为了匹配系统风格,我必须为每个版本的 Android 提供(可能)不同的风格,如果制造商以换肤的名义改变了这种风格,我很不走运,只是无法匹配该设备的系统样式。
    • @Hounshell 您可以使用自定义主题并为listSeparatorTextViewStyle 属性设置自己的样式。有了这个,你自己的风格将出现在每个安卓平台上。当然,这仍然会使您容易受到手机制造商更改某些样式的影响(唯一真正的问题是背景可绘制属性)。您没有说如何您的布局究竟是如何使用这种风格的,但请记住,用户可能会在应用程序中考虑一些 UI 差异。
    • @GopalSinghSirvi 你去看看sdk中的themes.xml和styles.xml文件。
    • 其实这个属性指向的样式是主题相关的。 Widget.TextView.ListSeparator.WhiteTheme.Holo.Light 主题映射到的,其他主题会有所不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    相关资源
    最近更新 更多