Это первое место, где я вижу, что отрицательные значения должны использоваться для состояний, для которых установлено значение false. В документации не очень ясно об этом. Спасибо за чаевые!

я есть 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 с другими изображениями.

 bigstones15 янв. 2011 г., 02:46
не будет ли проще иметь два селектора и поменять их местами?
 Emile15 янв. 2011 г., 15:06
Проблема в том, что вы можете получить сотни XML-файлов.

Ответы на вопрос(2)

Решение Вопроса

нет способа изменить одно состояние после того, как 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);

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

 dropsOfJupiter16 янв. 2011 г., 05:43
на самом деле я нашел его setImageDrawable () Большое спасибо, что он сработал и спас мне около 40 XML-файлов!
 dropsOfJupiter16 янв. 2011 г., 05:32
Я не смог добавить это в просмотр изображений. setState недоступен для него.
 dropsOfJupiter16 янв. 2011 г., 08:15
Итак, у меня есть еще одно примечание к этому. Я надеялся, что ты сможешь ответить. У меня есть этот селектор на ImageView, который находится внутри пользовательского элемента управления. Пользовательский элемент управления также имеет селектор в качестве фона. Таким образом, селектор всего элемента управления работает, а селектор ImageView - нет. Есть ли что-то, что я делаю не так? Есть ли последовательность?
 KK_07k11A058519 июн. 2012 г., 14:34
Я использую тот же код. всегда остается изображение, которое я указал в ----> new int [] {}. где я был не прав ??
 kcoppock16 янв. 2011 г., 16:04
Пожалуйста! Да, я не знаю, почему я поставил setState, должно быть setImageDrawable, вы правы. Что касается вашего другого вопроса, я бы предложил опубликовать новый вопрос с кодом для вашего пользовательского элемента управления и его селектором, я не уверен в ответе на это.

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

При создании 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 !.

 ryvianstyron30 окт. 2012 г., 14:29
Привет, Эмили, есть ли возможность, что drawables в качестве фона кнопки не будет отображаться в первый раз по любой причине. В настоящее время у меня возникает проблема, когда мне нужно коснуться области кнопки, чтобы появился фон, или отключиться и переключиться обратно на активность. (Это происходит только на экране HDDP, но отлично работает на моем MDPI). Я верю, что у других тоже может быть эта проблема. Ваш код проверен для всех плотностей экрана?
 Emile15 янв. 2011 г., 05:40
Код navstatelistdrawable эффективно делает селектор xml избыточным.
 ryvianstyron09 нояб. 2012 г., 21:03
Спасибо, я не совсем понимаю, что я делал неправильно, но в итоге у меня было следующее: buttonStates = new StateListDrawable (); buttonStates.addState (new int [] {statePressed}, ApplicationConstants.moduleImageLoader.findImageByName (drawable_pressed)); buttonStates.addState (new int [] {- ​​stateFocused, -statePressed, -stateSelected}, ApplicationConstants.moduleImageLoader.findImageByName (drawable_normal));
 eocanha02 окт. 2013 г., 15:34
Это первое место, где я вижу, что отрицательные значения должны использоваться для состояний, для которых установлено значение false. В документации не очень ясно об этом. Спасибо за чаевые!
 Emile02 нояб. 2012 г., 13:12
Привет, нет, это было написано довольно давно и было только для одного устройства в то время. Я не уверен, какая проблема может возникнуть, хотя, насколько я знаю, множественные плотности экрана и макеты не должны представлять проблему.

Ваш ответ на вопрос