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

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

screen shot of sample layout

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

да его можно отключить в XML просто используя <Button android:enabled="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)