Intereting Posts
Вызвать фрагмент из фрагмента Транзитные зависимости не разрешены для aar-библиотеки с использованием gradle Android LatinIME build Варианты Qt для архитектур mips, arm, x86 отсутствуют Приложение Gmail 5.0 не работает с «Разрешением, запрещенным для вложения», когда оно получает намерение ACTION_SEND Можете ли вы создать приложение React Native (приложение для Android) на Ubuntu? Заголовок Content-Length уже присутствует Android Hierarchy Viewer не показывает тайминги для рендеринга Конвертировать ArrayList <MyCustomClass> в JSONArray Android ndk-build iostream: нет такого файла или каталога Android Throwing OutOfMemoryError «Не удалось выделить выделение по 164 байта с 44 свободными байтами и 44B до OOM» (рекурсивный случай) Jni Учебник для Android Установить выбранный по умолчанию элемент диалогового окна оповещений ListView в Android Возможно ли установить Android Studio на ChromeBook? Как узнать, какое приложение было выбрано Intent.createChooser?

Заменить селекторные изображения программно

У меня есть ImageView, у которого есть ресурс для рисования, установленный на селектор. Как программно получить доступ к селектору и изменить изображения выделенного и невыделенного состояния?

Вот код селектора:

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/iconSelector"> <!-- pressed --> <item android:state_pressed="true" android:drawable="@drawable/btn_icon_hl" /> <!-- focused --> <item android:state_focused="true" android:drawable="@drawable/btn_icon_hl" /> <!-- default --> <item android:drawable="@drawable/btn_icon" /> </selector> 

Я хочу, чтобы заменить btn_icon_hl и btn_icon на другие изображения.

Solutions Collecting From Web of "Заменить селекторные изображения программно"

Насколько мне удалось найти (я тоже пытался сделать что-то подобное), невозможно изменить одно состояние после того, как StateListDrawable уже определен. Однако вы можете определить NEW через код:

 StateListDrawable states = new StateListDrawable(); states.addState(new int[] {android.R.attr.state_pressed}, getResources().getDrawable(R.drawable.pressed)); states.addState(new int[] {android.R.attr.state_focused}, getResources().getDrawable(R.drawable.focused)); states.addState(new int[] { }, getResources().getDrawable(R.drawable.normal)); imageView.setImageDrawable(states); 

И вы могли бы просто держать двух из них под рукой или создать другой, какой вам нужно.

У меня была та же проблема, и я сделал еще один шаг для ее решения. Однако единственная проблема заключается в том, что вы не можете указать NavStateListDrawable в xml, поэтому вам нужно установить фон вашего элемента пользовательского интерфейса через код. Затем метод onStateChange должен быть переопределен, чтобы каждый раз, когда был изменен уровень основного drawable, вы также обновляете уровень списка дочерних уровней.

При построении NavStateListDrawable вам необходимо передать уровень значка, который вы хотите отобразить.

 public class NavStateListDrawable extends StateListDrawable { private int level; public NavStateListDrawable(Context context, int level) { this.level = level; //int stateChecked = android.R.attr.state_checked; int stateFocused = android.R.attr.state_focused; int statePressed = android.R.attr.state_pressed; int stateSelected = android.R.attr.state_selected; addState(new int[]{ stateSelected }, context.getResources().getDrawable(R.drawable.nav_btn_pressed)); addState(new int[]{ statePressed }, context.getResources().getDrawable(R.drawable.nav_btn_selected)); addState(new int[]{ stateFocused }, context.getResources().getDrawable(R.drawable.nav_btn_focused)); addState(new int[]{-stateFocused, -statePressed, -stateSelected}, context.getResources().getDrawable(R.drawable.nav_btn_default)); } @Override protected boolean onStateChange(int[] stateSet) { boolean nowstate = super.onStateChange(stateSet); try{ LayerDrawable defaultDrawable = (LayerDrawable)this.getCurrent(); LevelListDrawable bar2 = (LevelListDrawable)defaultDrawable.findDrawableByLayerId(R.id.nav_icons); bar2.setLevel(level); }catch(Exception exception) { } return nowstate; } } 

Для всех разворачиваемых состояний навигационной кнопки у меня есть что-то вроде следующего.

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/top_bar_default" > </item> <item android:id="@+id/nav_icons" android:bottom="0dip"> <level-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:maxLevel="0" > <bitmap android:src="@drawable/top_bar_icon_back" android:gravity="center" /> </item> <item android:maxLevel="1" > <bitmap android:src="@drawable/top_bar_icon_nav" android:gravity="center" /> </item> <item android:maxLevel="2" > <bitmap android:src="@drawable/top_bar_icon_settings" android:gravity="center" /> </item> <item android:maxLevel="3" > <bitmap android:src="@drawable/top_bar_icon_search" android:gravity="center" /> </item> </level-list> </item> </layer-list> 

Я собирался опубликовать это как вопрос и ответ, но, увидев, как вы задали самый вопрос, вы здесь. Обратите внимание, что это избавляет вас от множества определений файлов xml. Я снизился примерно с 50-100 xml определений примерно до 4 !.