Android. Как сохранить кнопку, отображаемую как PRESSED, пока действие, созданное этой кнопкой, не будет завершено?
Я имею button_focused
, button_pressed
, а также button_normal
изображений. Когда я нажимаю кнопку, button_pressed
изображение отображается и начинается действие, связанное с нажатием кнопки.
Когда я прекращаю нажимать кнопку, действие продолжается, но кнопка возвращается к button_normal
изображение отображается
Как установить отображаемое изображение кнопки на button_pressed
в течение всего действия, затем сбросьте на button_normal
образ?
Спасибо за ваше время
6 ответов
Я использовал функцию как
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; вместо этого он меняет фон так, что кнопка выглядит нажатой.
Чтобы было немного понятнее, если вам просто нужна кнопка с двумя состояниями:
Вы не нуждаетесь в своем собственном 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);
}
});
Я использовал
NAME_OF_BUTTON.setImageResource(0xvalueofbutton_pressed image listed in R.java);
затем, когда действие заканчивается, я скопировал код и вставил целочисленное значение button_normal
,
Раньше я делал это по-другому, и я не могу найти свои резервные копии или печатные копии своего кода.
Еще раз спасибо за ваши ответы.
Использование (buttonName).setPressed(true)
И убедитесь, что вы сохранили соответствующий XML-файл для рисования, который определяет, какой рисовать использовать для таких состояний, как нажатие, фокус и т. Д.
Старый вопрос, но вот то, что я сделал, кажется проще, чем все вышеперечисленное. В кнопке onclick:
thisButton
.getBackground()
.setColorFilter(getResources().getColor(R.color.colorAccent), PorterDuff.Mode.MULTIPLY);
Мои кнопки используют ресурс с возможностью рисования (не уверен, имеет ли это значение), и когда пользователь нажимает на один из них, я устанавливаю нужный мне цветовой фильтр, который имеет тот же цвет, который я использую для состояния "нажатие", поэтому похоже, что он остается нажатым.
Чтобы очистить его, используйте:
thisButton.getBackground().clearColorFilter();
Просто добавив мои 2 цента в качестве другой альтернативы. Вместо button.setPressed, которая будет терять состояние селектора после того, как пользователь отпустит кнопку, вы можете использовать setSelected(true). Просто убедитесь, что вернулись с setSelected(false), когда вы закончите действие.
btn.setOnClickListener( view -> {
view.setSelected(true);
});
И добавьте селектор рисования в качестве фона для кнопки:
<item android:drawable="@drawable/btn_selected" android:state_selected="true"></item>
Если вы измените изображение в кнопке вручную в методе onClick, то, когда действие завершится, оно сможет вернуть нормальное изображение для этой кнопки. Если действие очень быстрое, изменение не будет отображаться должным образом - возможно, ему также потребуется код задержки.