Как изменить состояние кнопки по умолчанию в Android, не затрагивая нажатые и выбранные состояния? - PullRequest
2 голосов
/ 05 октября 2010

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

Есть ли способ установить фоновое состояние по умолчанию для ImageButton'sрисовать, не затрагивая нажатые и выбранные состояния?

Я пытался сделать это с помощью селектора, но он не позволяет вам использовать рисованные объекты по умолчанию для некоторых состояний - вы должны установить все состояниясам.Поскольку нет API для извлечения нажатых / выбранных отрисовок по умолчанию для устройства, я не знаю, как установить нажатые / выбранные состояния.

Я также пытался получить объект StateListDrawable для кнопки, которую система создает, когдаВы не используете селектор, а затем измените его, измените состояние по умолчанию.Это тоже не сработало.

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

Спасибо!Том Б.

Ответы [ 2 ]

5 голосов
/ 05 октября 2010

Tom

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

<selector
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/custombutton">

    <item
        android:state_focused="true"
        android:drawable="@drawable/focused_button" />
    <item
        android:state_pressed="true"
        android:drawable="@drawable/pressed_button" />
    <item
        android:state_pressed="false"
        android:state_focused="false"
        android:drawable="@drawable/normal_button" />
</selector>

Поместите это в свой каталог drawables и загрузите его как обычный drawable для фона ImageButton. Самое сложное для меня - это создание реальных изображений.

Edit:

Только что покопался в источнике EditText, и вот как они установили фон для рисования:

public EditText(/*Context context, AttributeSet attrs, int defStyle*/) {
    super(/*context, attrs, defStyle*/);

            StateListDrawable mStateContainer = new StateListDrawable();

            ShapeDrawable pressedDrawable = new ShapeDrawable(new RoundRectShape(10,10));
            pressedDrawable.getPaint().setStyle(Paint.FILL);
            pressedDrawable.getPaint().setColor(0xEDEFF1);


            ShapeDrawable focusedDrawable = new ShapeDrawable(new RoundRectShape(10,10));
            focusedDrawable.getPaint().setStyle(Paint.FILL);
            focusedDrawable.getPaint().setColor(0x5A8AC1);

            ShapeDrawable defaultDrawable = new ShapeDrawable(new RoundRectShape(10,10));
            defaultDrawable.getPaint().setStyle(Paint.FILL);
            defaultDrawable.getPaint().setColor(Color.GRAY);



            mStateContainer.addState(View.PRESSED_STATE_SET, pressedDrawable);
            mStateContainer.addState(View.FOCUSED_STATE_SET, focusedDrawable);
            mStateContainer.addState(StateSet.WILD_CARD, defaultDrawable);

            this.setBackgroundDrawable(mStateContainer);
}

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

http://www.google.com/codesearch/p?hl=en#ML2Ie1A679g/src/android/widget/EditText.java

0 голосов
/ 15 июля 2017
StateListDrawable replace = new StateListDrawable();

Drawable old = getBackground();
replace.addState(FOCUSED_STATE_SET, old);
replace.addState(SELECTED_STATE_SET, old);
replace.addState(PRESSED_STATE_SET, old);

replace.addState(StateSet.WILD_CARD, new ColorDrawable(Color.TRANSPARENT));

if (Build.VERSION.SDK_INT >= 16) {
    setBackground(replace);
} else {
    setBackgroundDrawable(replace);
}
...