Ответ 1
Вы пробовали это?
myButton.setEnabled(false);
Обновление: благодаря Гвен. Почти забыл, что android:clickable
можно установить в вашем XML-макете, чтобы определить, можно ли нажать кнопку или нет.
Я создал макет, содержащий две кнопки: "Следующий" и "Предыдущий". Между кнопками я генерирую некоторые динамические представления. Поэтому, когда я впервые запускаю приложение, я хочу отключить кнопку "Предыдущая", так как не будет никаких предыдущих просмотров. Я также хочу отключить кнопку "Далее", если на дисплее больше нет просмотров. Есть ли способ отключить кнопки?
Вы пробовали это?
myButton.setEnabled(false);
Обновление: благодаря Гвен. Почти забыл, что android:clickable
можно установить в вашем 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);
Поскольку вы хотите отключить кнопку с самого начала, вы можете использовать button.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" />
Да, это можно отключить в XML, просто используя:
<Button
android:enabled="false"
/>
В моем случае
myButton.setEnabled(false);
myButton.setEnabled(true);
работает нормально, и он включает и выключает кнопку, как следует. Но как только состояние кнопки будет отключено, оно снова не вернется к разрешенному состоянию, хотя оно доступно для кликов. Я попытался сделать недействительным и обновить доступное состояние, но не повезло.
myButton.invalidate();
myButton.refreshDrawableState();
Если у вас или у кого-либо, у кого есть аналогичная проблема, то, что работает для меня, снова устанавливает фону. Работает на любом уровне API.
myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
В Kotlin, если вы ссылаетесь на кнопку View с идентификатором, тогда включите/отключите кнопку как
layout.xml
<Button
android:id="@+id/btn_start"
android:layout_width="100dp"
android:layout_height="50dp"
android:text="@string/start"
android:layout_alignParentBottom="true"/>
activity.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()
установите свойство кнопки как
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!");
}
}
}
});
EDIT: В ответ на @jeroen-bollen
View.OnClickListener
Определение интерфейса для вызова обратного вызова при нажатии на просмотр.
с определением метода
void onClick(View v);
при щелчке по представлению объект класса "Вид" делает обратный вызов методу onClick(), отправляющемуся как сам параметр, поэтому параметр null view не должен возникать, если он выполняет Утверждение об ошибке, это может произойти, например когда класс объекта "Объект" был уничтожен между тем (например, собранный GC), или метод был взломан из-за взлома
немного о instanceof и null
JLS/15.20.2. Тип сравнения Оператор instanceof
Во время выполнения результат оператора instanceof равен true если значение RelationalExpression не равно нулю и ссылка может быть перенесена в ReferenceType без повышения исключения ClassCastException.
В противном случае результат будет false.
три слова от автора
ЕСЛИ U СПРОСИТЬ ПОЧЕМУ?
МОЖНО ИЗБЕЖАТЬ NullPointerException
Немного больше кода сэкономит ваше время на последующем отслеживании ошибок в вашем коде и уменьшит возникновение аномалий.
рассмотрим следующий пример:
View.OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)