应用主题,根据应用主题名称更改和ImageView src。

7

我正在寻找一个解决方案来解决我的问题,但是我无法找到任何地方,即使在谷歌上搜索也是如此。

我正在编写一个使用主题的Android应用程序,用户可以动态切换它们,并重新启动应用程序以应用所选择的主题。这个功能运行良好。

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

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

感谢所有回答我的问题的人,对我的英语表示抱歉! :)


你找到解决方案了吗?我也有类似的需求。 - PC.
1个回答

8
最近,我有一个需求需要根据主题更改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"/>

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

我们在项目中尝试了这种方法,它很有效。谢谢! - r1k0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接