【问题标题】:Define different themable styles to the same widget types为相同的小部件类型定义不同的主题样式
【发布时间】:2013-08-14 20:46:51
【问题描述】:

我想为 Android 小部件定义不同的主题样式。在下面的示例中,有两个 ImageView 小部件,其中一个使用我的“主题”样式,另一个使用手动样式。我希望以一种我可以省略“base_theme”前缀的方式实现配置文件,以便可以根据活动主题配置自动确定它。

关于编写主题的文档提到了如何更改所有 ImageView 或 Button 的样式,而不是针对具有 style 属性的特定样式。我发现可以通过使用可设置样式的自定义组件来解决我的问题,但我认为有一些更好的方法可以解决我的问题。

base_style.xml

<style name="base_theme" parent="android:Theme.NoTitleBar">
</style>

<style name="base_theme.event_list_filter">
    <item name="android:orientation">horizontal</item>
    <item name="android:layout_width">fill_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_margin">10dp</item>
    <item name="android:background">@drawable/base_white_rounded</item>
</style>

<style name="base_theme.base_event_list_filter_image">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:padding">10dp</item>
    <item name="android:background">@drawable/vr_black_border</item>
</style>

<style name="base_theme.base_event_list_scrollable">
    <item name="android:layout_width">fill_parent</item>
    <item name="android:layout_height">0dp</item>
    <item name="android:layout_weight">1</item>
    <item name="android:background">@drawable/base_white_rounded</item>
</style>

<style name="base_theme.base_event_list_table">
    <item name="android:layout_width">fill_parent</item>
    <item name="android:layout_height">fill_parent</item>
</style>

activity_layout.xml

<LinearLayout style="@style/base_theme.base_event_list_filter" >
    <ImageView
        style="@style/base_theme.base_event_list_filter_image"
        android:src="@drawable/pic0" />

    <ImageView
        ...
        android:src="@drawable/pic1" />
</LinearLayout>

感谢您的帮助,
马切克

【问题讨论】:

    标签: android android-layout android-theme android-styles


    【解决方案1】:

    我找到了解决办法。我希望它能帮助有类似主题问题的人。

    首先我为我的 base_theme 添加了新属性,然后我按照以下方式配置了它们:

    base_style.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <!-- add attributes to your theme -->s
        <declare-styleable name="base_theme">
            <attr name="event_list_filter" format="reference" />
            <attr name="pic0" format="reference" />
        </declare-styleable>
    
        <!-- fill attributes with your own styles/drawables/etc -->
        <style name="base_theme" parent="android:Theme.NoTitleBar">
            <item name="event_list_filter">@style/base_theme.event_list_filter_image</item>
            <item name="pic0">@drawable/base_theme.pic0</item>
        </style>
    
            <!-- define corresponding resource -->
        <style name="base_theme.base_event_list_filter_image">
            <item name="android:layout_width">wrap_content</item>
            <item name="android:layout_height">wrap_content</item>
            <item name="android:padding">10dp</item>
            <item name="android:background">@drawable/vr_black_border</item>
        </style>
    
        <drawable name="base_theme.pic0">@drawable/base_pic0</drawable>
    
    </resources>
    

    另一种布局steel_styles.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <!-- fill attributes with your own styles/drawables/etc -->
        <style name="steel_theme" parent="@style/base_theme">
            <item name="pic0">@drawable/steel_theme.pic0</item>
        </style>
    
        <drawable name="steel_theme.pic0">@drawable/steel_pic0</drawable>
    
    </resources>
    

    活动布局文件activity_layout.xml

    ...
    <ImageView
        style="?attr/event_list_filter_image"
        android:src="?attr/pic0" />
    ...
    

    使用这样的配置pic0 将根据AndroidManifest.xml 中为活动设置的主题而在屏幕上有所不同。

    【讨论】:

    • 由于示例的清晰和简单,我通常发现这很有用。它在展示 format="reference" 类型时特别有用。
    猜你喜欢
    • 2014-03-24
    • 2011-05-28
    • 1970-01-01
    • 2014-07-01
    • 2019-05-12
    • 2012-06-24
    • 2012-02-04
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多