Как отключить кнопку Android?

Я создал макет, содержащий две кнопки: "Следующий" и "Предыдущий". Между кнопками я генерирую некоторые динамические представления. Поэтому, когда я впервые запускаю приложение, я хочу отключить кнопку "Предыдущая", так как не будет никаких предыдущих просмотров. Я также хочу отключить кнопку "Далее", если на дисплее больше нет просмотров. Есть ли способ отключить кнопки?

screen shot of sample layout

Ответ 1

Вы пробовали это?

myButton.setEnabled(false); 

Обновление: благодаря Гвен. Почти забыл, что android:clickable можно установить в вашем XML-макете, чтобы определить, можно ли нажать кнопку или нет.

Ответ 2

Вы не можете включить его или отключить в своем XML (поскольку ваш макет задан во время выполнения), но вы можете установить, будет ли он доступен при запуске этой операции с помощью android:clickable.

Ответ 3

Вы просто пишете одну строку кода в своей деятельности

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(false);

Если вы хотите включить одну и ту же кнопку, просто напишите

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);

Ответ 4

В 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" />

Ответ 5

Да, это можно отключить в XML, просто используя:

<Button
android:enabled="false"
/>

Ответ 6

В моем случае

myButton.setEnabled(false);
myButton.setEnabled(true);

работает нормально, и он включает и выключает кнопку, как следует. Но как только состояние кнопки будет отключено, оно снова не вернется к разрешенному состоянию, хотя оно доступно для кликов. Я попытался сделать недействительным и обновить доступное состояние, но не повезло.

myButton.invalidate();
myButton.refreshDrawableState();

Если у вас или у кого-либо, у кого есть аналогичная проблема, то, что работает для меня, снова устанавливает фону. Работает на любом уровне API.

myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));

Ответ 7

В 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

Ответ 8

сначала в 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);

        }
    });
}

Ответ 9

НЕПРАВИЛЬНЫЙ СПОСОБ В СЛУШАНИИ ПОЛЬЗОВАТЬСЯ ПЕРЕМЕННЫМ ВМЕСТО ПАРАМЕТРА!!!

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)