Android.Как сохранить кнопку, отображаемую как PRESSED, до тех пор, пока действие, созданное этой кнопкой, не будет завершено? - PullRequest
4 голосов
/ 13 января 2011

У меня есть button_focused, button_pressed и button_normal изображения. Когда я нажимаю кнопку, отображается изображение button_pressed и начинается действие, связанное с нажатием кнопки.

Когда я прекращаю нажимать кнопку, действие продолжается, но кнопка возвращается к button_normal отображаемому изображению.

Как я могу установить отображаемое изображение кнопки на button_pressed в течение всего действия, а затем сбросить на button_normal изображение?

Спасибо за ваше время

Ответы [ 6 ]

3 голосов
/ 07 октября 2013

Я использовал такую ​​функцию, как

void setHighlighted(boolean highlight) {
    button.setBackgroundResource( highlight
                                ? R.drawable.bbg_pressed
                                : R.drawable.button_background);
}

где button_background - это селектор, определенный в button_backgroung.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true" android:drawable="@drawable/bbg_pressed"></item>
    <item android:state_focused="true" android:drawable="@drawable/bbg_selected"></item>
    <item android:drawable="@drawable/bbg_normal"></item>
</selector>

То есть этот код не мешает нажатому состоянию, используемому платформой Android; вместо этого он меняет фон так, что кнопка выглядит нажатой.

2 голосов
/ 01 марта 2015

Чтобы сделать это немного понятнее, если вам просто нужна кнопка с двумя состояниями:

Вам не нужно свое button.xml. Вы можете работать с обычным Android.

button.setPressed(true) не будет работать, если вы нажмете кнопку, потому что Android сбросит его, как только вы отпустите кнопку. Попробуйте установить другие кнопки setPressed, чтобы увидеть эффект.

Это означает, что для использования на той же кнопке она должна быть установлена ​​с задержкой. Вот рабочий пример. Конечно, упомянутый подход (по длинному идентификатору 18 ..) к изменению фона тоже работает.

   private final Handler mHandler = new Handler();
   rootView.findViewById(R.id.yourButton).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            boolean pressed = false;
            if (v.getTag() instanceof Boolean)
                pressed = (boolean) v.getTag();
            final boolean newPressed = !pressed;
            // setTag to store state
            v.setTag(newPressed);
            final View vRun = v;
            Runnable run = new Runnable() {
                @Override
                public void run() {
                    vRun.setPressed(newPressed);
                }
            };
            mHandler.post(run);
            // mHandler.postDelayed(run, 5);
        }
    });
1 голос
/ 06 марта 2018

Просто добавив мои 2 цента в качестве другой альтернативы.Вместо button.setPressed, которая будет терять состояние селектора после того, как пользователь отпустит кнопку, вы можете использовать setSelected (true).Просто убедитесь, что вернулись с setSelected (false), когда закончите действие.

        btn.setOnClickListener( view ->  {
        view.setSelected(true);
    });

И добавьте селектор рисования в качестве фона для кнопки:

<item android:drawable="@drawable/btn_selected" android:state_selected="true"></item>
1 голос
/ 11 апреля 2011

Используйте (buttonName).setPressed(true)

И убедитесь, что вы сохранили соответствующий XML-файл для рисованного объекта, который определяет, который можно использовать для таких состояний, как нажатие, фокус и т. Д.:

1 голос
/ 13 января 2011

Я использовал

NAME_OF_BUTTON.setImageResource(0xvalueofbutton_pressed image listed in R.java);

, затем, когда действие прекращается, я скопировал код и вставил целочисленное значение button_normal.

Я делал это раньше и не могу найти свои резервные копииили печатные копии моего кода.

Еще раз спасибо за ваши ответы.

1 голос
/ 13 января 2011

Если вы измените изображение в кнопке вручную в методе onClick, то, когда действие завершится, оно сможет вернуть нормальное изображение для этой кнопки. Если действие выполняется очень быстро, изменение не будет отображаться должным образом - возможно, также потребуется код задержки.

...