Задать цвет текста кнопки программно

132
30 декабря 2019, 04:10

Написал калькулятор, в котором для обработки нажатий используется интерфейс OnClickListener. Внешний вид калькулятора прописал в xml файле, а в файле джава уже написал реализацию работы. При нажатии на кнопку она меняет цвет на черный. Работает это через метод v.setBackgoundColor(Color.BLACK). Но когда это происходит текст на кнопке сливается с фоном и теряется. Для задачи цвета текста на кнопке в xml есть атрибут textColor. Есть ли его аналог для программного изменения цвета текста во время нажатия кнопки? P.s. Моя реализация через метод setBackgroundColor() изменяет цвет кнопки, пока не будет нажата другая кнопка. Есть ли способ заставить ее изменять цвет, только пока палец касается ее?

Answer 1

Стоило задать вопрос и я смог ответить на него сам. Загвоздка заключалась в том что метод setBackgroundColor() применялся к типу View без его приведения к другому типу(например Button), а вот метод setTextColor к типу View уже нельзя применить, и сначала необходимо выполнить преобразование ((Button) v).setTextColor() и тогда все заработает. Но учитывая что я хотел чтобы цвет менялся только на время касания, удобнее оказалось добавить обработчик OnTouchListener и переопределить метод onTouch:

@Override
public boolean onTouch(View v, MotionEvent event) {
    if(event.getAction() == MotionEvent.ACTION_DOWN){
        ((TextView) v).setTextColor(Color.WHITE);
        v.setBackgroundColor(Color.BLACK);
        return false;
    }
    if(event.getAction() == MotionEvent.ACTION_UP){
        ((TextView) v).setTextColor(Color.BLACK);
        v.setBackgroundColor(Color.WHITE);
        return false;
    }
    return false;
}

Важная деталь - если поставить возвращаемое значение true, то действие не дойдет до слушателя OnClickListener и написанный в нем код не выполнится. Если у вас есть одновременно 2 этих обработчика, обязательно поставьте возвращаемое значение false

Answer 2
btn.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN: // нажатие
                        btn.setTextColor(Color.parseColor("#AF1F3F"));
                        break;
                    case MotionEvent.ACTION_UP:
                        btn.setTextColor(Color.parseColor("#000000"));
                        break;// отпускание
                }
                return false;
            }
        });
READ ALSO
Как сделать “Рестарт” для кнопок разом?

Как сделать “Рестарт” для кнопок разом?

Разрабатываю игру в качестве обученияВся игра идет через кнопки

157
Кастомный адаптер для спиннера

Кастомный адаптер для спиннера

Сделал кастомный адаптер для спиннераПри раскрытии спиннера метод getDropDownView вызывается непрерывно циклически, даже если список не трогать

113
Парсинг данных с помощью firebase

Парсинг данных с помощью firebase

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

165
SphinxQL jdbc как использовать

SphinxQL jdbc как использовать

Настроил sphinx , проиндексировалВ общем все работает , но только через консоль

114