Android: как программно обновить селектор (StateListDrawable)

Я хочу программно изменить селектор кнопки.

Я могу сделать это с помощью xml-файла, который приведен ниже

       

Я хочу сделать то же самое программно. Я попробовал что-то вроде приведенного ниже

 private StateListDrawable setImageButtonState(int index) { StateListDrawable states = new StateListDrawable(); states.addState(new int[] {android.R.attr.stateNotNeeded},R.drawable.btn_off); states.addState(new int[] {android.R.attr.state_pressed, android.R.attr.state_enabled},R.drawable.btn_off); states.addState(new int[] {android.R.attr.state_focused, android.R.attr.state_enabled},R.drawable.btn_on); states.addState(new int[] {android.R.attr.state_enabled},R.drawable.btn_on); return states; } 

но это не сработало.

И как установить android:state_enabled="false" или android:state_enabled="true" программно.

Вам нужно использовать отрицательное значение необходимого состояния. Например:

 states.addState(new int[] {-android.R.attr.state_enabled},R.drawable.btn_disabled); 

Обратите внимание на знак «-» перед android.R.attr.state_enabled .

Очень поздний ответ здесь, но в случае, если у кого-либо возникают проблемы с программным обеспечением StateListDrawable. Тогда, как и в XML-файлах, порядок, в котором вы устанавливаете состояния в StateListDrawable, важен.

Например, это будет работать, как ожидалось:

 StateListDrawable sld = new StateListDrawable(); sld.addState(new int[] { android.R.attr.state_pressed }, new ColorDrawable(Color.GRAY)); sld.addState(new int[] {}, new ColorDrawable(Color.GREEN)); 

Это не будет:

 StateListDrawable sld = new StateListDrawable(); sld.addState(new int[] {}, new ColorDrawable(Color.GREEN)); sld.addState(new int[] { android.R.attr.state_pressed }, new ColorDrawable(Color.GRAY)); 

Недостаточно комментариев для комментариев, но принятый ответ не сработал для меня.

Моя цель заключалась в том, чтобы дизайнеры устанавливали разрешенные, отключенные и прессованные цвета фона на какой-либо кнопке. Я намеревался использовать их для тестирования цветов на разных дисплеях.

Я заметил, что некоторые другие люди упомянули, что для них это тоже не сработало.

Государства, которые должны быть определены,

  • не нажата и не активирована, это то, что вы видите, когда кнопка включена и не нажата.
  • нажата и включена, это то, что вы видите, когда кнопка нажата и включена
  • не включено. Это то, что вы видите, когда кнопка отключена

Вот некоторый код, который даст вам представление о состояниях. Я использую Color.Parse () для генерации ints для цветов, затем передаю их этому методу, чтобы получить StateListDrawable.

 private StateListDrawable createDrawable(int enabled, int pressed, int disabled) { StateListDrawable stateListDrawable = new StateListDrawable(); stateListDrawable.addState(new int[] { -android.R.attr.state_pressed, android.R.attr.state_enabled }, new ColorDrawable(enabled)); stateListDrawable.addState(new int[] { android.R.attr.state_pressed, android.R.attr.state_enabled }, new ColorDrawable(pressed)); stateListDrawable.addState(new int[] { -android.R.attr.state_enabled }, new ColorDrawable(disabled)); return stateListDrawable; } 

Я собираюсь ответить на ваш вопрос «Как программно обновить селектор для КНОПКИ?» предлагая переключить кнопку для LinearLayout со встроенными ImageView и TextView . Для этого есть ряд преимуществ, особенно если позже вы решите настроить свои представления. В результате этого коммутатора нет потери функциональности. Вы по-прежнему сможете присоединять тех же прослушивателей событий, которые вы можете прикрепить к кнопке, но сможете избежать кошмаров кнопок / вкладок. Вот соответствующий код из layout.xml

      

Затем у меня есть селекторный файл с именем custom_image.xml, расположенный в папке с возможностью переноса. Вот содержание файла селектора

       

Три файла исходного изображения (disabled_img.png, unselected_img.png, selected_img.png) также находятся в папке с возможностью переноса.

Теперь вернемся к вашему Java-коду. Нет необходимости в фанки StateListDrawable мусор по многим причинам. Во-первых, он просто выглядит уродливым, и его трудно поддерживать. Но самое главное, это противоречит принципам сохранения вашей логики отдельно от вашей презентации. Если вы управляете своими доступными ресурсами в Java-коде, вы знаете, что делаете что-то фундаментально неправильно.

Вот что я предлагаю вместо этого. Всякий раз, когда вы хотите, чтобы ваша кнопка была выбрана, вы просто добавляете этот однострочный слой:

 ((LinearLayout)findViewById(R.id.button)).setSelected(true); 

Или если вы хотите, чтобы кнопка находилась в отключенном состоянии, вот еще один однострочный:

 ((ImageView)findViewById(R.id.background)).setEnabled(false); 

Обратите внимание, что в этом последнем примере я указываю отключенное состояние в ImageView внутри LinearLayout. По какой-то причине, когда вы меняете состояние включения / отключения LinearLayout, селектор не запускается. Он отлично работает, когда вы делаете это на ImageView.

Я не знаю, как вы добавляете StateListDrawable , так как кода здесь нет. Но обязательно проверьте документацию и добавьте setState() .

Вы можете установить свойства из представления, например, yourView.setEnabled(true)

Надеюсь, это поможет

Interesting Posts

Как обрабатывать как отдельный элемент, так и массив для одного и того же свойства с помощью JSON.net

Просмотр запланированных записей удаленно

Как сериализовать несериализуемое в Java?

Преобразование XDocument в XmlDocument и наоборот

Как создать прозрачный демонстрационный экран для Android-приложения?

Не удается создать массив LinkedLists в Java …?

Scala подчеркивает минимальную функцию

Как вернуть «Режим браузера» в IE11?

Сделать hibernate игнорировать переменные classа, которые не отображаются

Перетаскивание из источника данных в окно WPF не работает

GIMP 2.6.11 на Windows 7 64-битный не может открывать файлы PNG

Как добавить параметр «подтвердить удаление» в ASP.Net Gridview?

Как бы вы превратили планшет в клавиатуру + простой в использовании сенсорный экран (зеркало на рабочем столе) (а не тачпад) для настольного ПК?

Как определить серверную сторону, отключены ли cookies

Как работает большой читатель RSS (netvibes, читатель Google …)

Давайте будем гением компьютера.