Как отключить кнопку Android?
Я создал макет, который содержит две кнопки: Next и Previous. Между кнопками я создаю некоторые динамические представления. Поэтому при первом запуске приложения я хочу отключить кнопку "предыдущий", так как не будет никаких предыдущих представлений. Я также хочу отключить кнопку "Далее", когда нет больше представлений для отображения. Есть ли вообще отключить кнопки?
9 ответов
вы пробовали это?
myButton.setEnabled(false);
обновление: благодаря Гвен. Чуть не забыл об этом!--1--> можно установить в XML-макете, чтобы определить, может ли кнопка быть кликабельной или нет.
вы не можете включить или отключить его в своем XML (так как ваш макет установлен во время выполнения), но вы можете установить, можно ли его щелкнуть при запуске действия с android:clickable
.
вы просто пишете одну строку кода в своей деятельности
Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(false);
когда вы хотите включить ту же кнопку, просто напишите
Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
в Java, как только у вас есть ссылка на кнопку:
Button button = (Button) findviewById(R.id.button);
включить/отключить кнопку, Вы можете использовать:
button.setEnabled(false);
button.setEnabled(true);
или:
button.setClickable(false);
button.setClickable(true);
поскольку вы хотите отключить кнопку с самого начала, вы можете использовать .setEnabled (false); в методе onCreate. В противном случае из XML можно напрямую использовать:
android:clickable = "false"
так:
<Button
android:id="@+id/button"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/button_text"
android:clickable = "false" />
В моем случае,
myButton.setEnabled(false);
myButton.setEnabled(true);
работает нормально, и он включает и отключает кнопку, как и должно. Но как только состояние кнопки становится отключенным, оно никогда не возвращается к включенному состоянию снова, хотя оно кликабельно. Я попытался обесценивать и освежать привлекательное состояние, но не повезло.
myButton.invalidate();
myButton.refreshDrawableState();
Если у вас или у кого-то есть аналогичная проблема, то для меня работает установка фона drawable снова. Работает на любом уровне API.
myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
в Котлине, если вы ссылаетесь на вид кнопки с идентификатором, то, включить / отключить кнопку, как
макет.в XML
<Button
android:id="@+id/btn_start"
android:layout_width="100dp"
android:layout_height="50dp"
android:text="@string/start"
android:layout_alignParentBottom="true"/>
активности.kt
btn_start.isEnabled = true //to enable button
btn_start.isEnabled = false //to disable button
сначала в xml сделайте кнопку как android:clickable="false"
<Button
android:id="@+id/btn_send"
android:clickable="false"/>
тогда в вашем коде, внутри oncreate()
метод установите свойство button как
btn.setClickable(true);
затем внутри кнопки нажмите изменить код на
btn.setClickable(false);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
btnSend = (Button) findViewById(R.id.btn_send);
btnSend.setClickable(true);
btnSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
}
НЕВЕРНЫЙ ПУТЬ В ПРОСЛУШИВАТЕЛЕ ИСПОЛЬЗОВАТЬ ПЕРЕМЕННУЮ ВМЕСТО ПАРАМЕТРА!!!
btnSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
ПРАВИЛЬНО:
btnSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/** check given view by assertion or cast as u wish */
if(v instance of Button) {
/** cast */
Button button = (Button) v;
/** we can perform some check up */
if(button.getId() == EXPECTED_ID) {
/** disable view */
button.setEnabled(false)
button.setClickable(false);
}
} else {
/** you can for example find desired view by root view */
Button bt = (Button) v.getRootView().findViewById(R.id.btId);
/*check for button */
if(bt!=null) {
/** disable button view */
...
} else {
/** according to @jeroen-bollen remark
* we made assumption that we expected a view
* of type button here in other any case
*/
throw new IllegalArgumentException("Wrong argument: " +
"View passed to method is not a Button type!");
}
}
}
});
изменить: В ответ на @jeroen-bollen
View.OnClickListener
is определение интерфейса для обратного вызова, вызываемого при щелчке представления.
С определение метода
void onClick(View v);
когда представление щелкнул вид объекта класса обратного вызова для отправки метода onClick () в качестве самого параметра, поэтому параметр null view не должен возникать, если это Ошибка Утверждения это может произойти, например, когда класс View object был уничтожен в то же время (например, собранный GC) или метод был изменен из-за hack
немного о instanceof & null
JLS / 15.20.2. Введите оператор сравнения instanceof
во время выполнения, результат instanceof оператор true если значение RelationalExpression не равно null и ссылка может быть приведена к ReferenceType без создания ClassCastException.
в противном случае результат равен false.
три слова от автора
ЕСЛИ ВЫ СПРОСИТЕ, ПОЧЕМУ ?
в основном, чтобы избежать NullPointerException
немного больше кода сэкономит ваше время позже отслеживание ошибок в вашем коде и уменьшает возникновение abnomalies.
рассмотрим следующий пример:
View.OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)