Темы приложения, изменения и ImageView src на основе имени темы приложения

Я пытаюсь найти решение для моей проблемы, но я не могу найти нигде, даже гуглить по нему.

Я пишу приложение для Android, которое использует темы, пользователь может динамически переключать их, и приложение перезапускается, чтобы применить выбранную. Это работает хорошо.

Но я не могу найти способ изменить элемент изображения в зависимости от выбранной темы. Я не могу понять, как приложения для Android используют темы, я не могу изменить файл динамически, а только изменить имя темы в объекте приложения, а в теге стиля темы я не могу указать src для одного imageview.

Я могу удовлетворить требования моего приложения, используя только свойство windowbackground. Но я не могу сделать это пропорционально, используя свойство scaletype, также используя гравитацию в растровом изображении. Я не могу понять, как уменьшить его внутри окон, управляющих пропорциями изображения.

Спасибо всем, кто ответил на мой вопрос, и извините за мой английский!:)

1 ответ

Недавно у меня было требование изменить 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"/>

Самое интересное, что эту концепцию можно применить к любому элементу управления или любому атрибуту:)

Другие вопросы по тегам