7

我正在尝试为我的问题找到解决方案,但我找不到任何地方,甚至在谷歌上搜索它。

我正在编写一个使用主题的 android 应用程序,用户可以动态地切换它们,然后应用程序重新启动以应用所选主题。这运作良好。

但是,我找不到根据所选主题更改 imageview 元素的方法。我无法理解 android 应用程序使用主题的方式,我无法动态更改文件,而只能更改应用程序对象中的主题名称,并且在主题样式标签中我无法指定单个 imageview 的 src。

我也可以仅使用 windowbackground 属性来满足我的应用程序要求。但是,我无法使用 scaletype 属性使其按比例拉伸,也无法在 bitmapdrawable 中使用重力,我无法理解如何使其在保持图像比例的窗口内缩小。

感谢所有回答我问题的人,对不起我的英语!:)

4

1 回答 1

7

最近有个需求,ImageView要根据主题换图。我使用的是ExpandableListView和使用ImageView作为组指示器,而不是开箱即用的组指示器。由于我的应用程序同时支持浅色和深色主题,我想将组指示器、操作栏图标也切换为浅色和深色版本。

方法如下:

res/values/attrs.xml在文件中为要根据主题更改的每个 ImageView 或 ActionBar 图标声明自定义属性:

<declare-styleable name="customAttrs">
    <attr name="actionSearchIcon" format="reference" />
    <attr name="actionAcceptIcon" format="reference" />
    <attr name="actionRefreshIcon" format="reference" />
    <attr name="groupIndicatorIcon" format="reference" />
</declare-styleable>

根据您的目标版本,在主题文件中res/values/styles.xml定义相同的属性指向适当的可绘制对象。例如下面,Black主题指向与深色主题相关的可绘制对象,Light主题指向与浅色主题相关的可绘制对象。

<style name="Black" parent="@style/Theme.AppCompat">
    <item name="actionSearchIcon">@drawable/ic_action_search</item>
    <item name="actionAcceptIcon">@drawable/ic_action_accept</item>
    <item name="actionRefreshIcon">@drawable/navigation_refresh</item>
    <item name="groupIndicatorIcon">@drawable/group_indicator</item>
</style>


<style name="Light" parent="@style/Theme.AppCompat.Light">
    <item name="actionSearchIcon">@drawable/ic_action_search_light</item>
    <item name="actionAcceptIcon">@drawable/ic_action_accept_light</item>
    <item name="actionRefreshIcon">@drawable/navigation_refresh_light</item>
    <item name="groupIndicatorIcon">@drawable/group_indicator_light</item>
</style>

最后,进入实际布局,将相关属性指向您定义的属性,而不是直接指向可绘制对象。例如对于 ActionBar 图标:

<item
android:id="@+id/action_refresh"
android:icon="?attr/actionRefreshIcon"
android:orderInCategory="107"
android:title="@string/action_refresh"
app:showAsAction="always"/>

<item
android:id="@+id/action_accept"
android:icon="?attr/actionAcceptIcon"
android:orderInCategory="108"
android:title="@string/action_accept"
app:showAsAction="always"/>

<item
android:id="@+id/action_search"
android:icon="?attr/actionSearchIcon"
android:orderInCategory="50"
android:title="@string/action_search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="collapseActionView|always"/>

或者在 ImageView 的情况下:

<ImageView
android:id="@+id/group_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:contentDescription="@string/app_name"
android:src="?attr/groupIndicatorIcon"/>

令人兴奋的部分是这个概念可以应用于任何控件或任何属性:)

于 2014-06-04T17:36:44.607 回答