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

371

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

снимок экрана с образцом макета

Дижо Дэвид
источник

Ответы:

802

Ты пробовал это?

myButton.setEnabled(false); 

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

Варуна
источник
66
эквивалент android: включен в xml.
Намрата
1
И где ты нашел это в документации? Можете ли вы связать это здесь?
Варун
4
@Namratha работает только для виджетов "Button", а не для imageView как кнопки
mehmet
Эквивалент Xamarin: myButton.Enabled = false;
Кэмерон Форвард
48

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

Гвен
источник
4
5 лет опыта в Android, и я узнаю об этом сейчас! : /
Сагар
35

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

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

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

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
Дипак Шарма
источник
20
Это 2 строки. Это один ((Button)findViewById(R.id.mybutton)).setEnabled(false);
Мэтт Кларк
34
Постарайтесь понять чувства Мэтта ..;)
Дипак Шарма
30

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

<Button
android:enabled="false"
/>
Mulaffer
источник
2
Это реальный ответ для XML. Вся эта бессмыслица возиться с clickable не имеет ничего общего с тем, как нарисована кнопка, чтобы она выглядела отключенной.
Скотт Биггс
1
Я думаю, что люди думали, что вы не можете сделать это, потому что завершение кода AS / IDEA не предлагает, android:enabledкогда вы начинаете вводить его. (Даже по сей день.)
Кевин Крумвиде
1
Я пытался это не работает, только из кода setEnabledработает
FindOutIslamNow
23

В 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" />
Паоло Ровелли
источник
ответил 8 '10 в 7:08
1
@Poldie: На самом деле, если вы прочитаете два ответа, вы поймете, что они довольно похожи, но не равны.
Паоло Ровелли
9

В моем случае,

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

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

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

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

myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
ayorhan
источник
8

В Kotlin, если вы ссылаетесь на представление кнопок с идентификатором, включите / отключите кнопку как

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
Sackurise
источник
2

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

        }
    });
}
rajeesh
источник
2

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

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 

является определение интерфейса для обратного вызова , которая будет вызвана , когда вид кнопки.

с определением метода

void onClick(View v);

при щелчке по представлению объект класса View выполняет обратный вызов метода onClick (), отправляя как сам параметр, поэтому нулевой параметр представления не должен появляться, если он является ошибкой утверждения, это может произойти, например, когда класс объекта View был уничтожен за это время (для пример, собранный GC) или метод был подделан из-за взлома

немного о instanceof & null

JLS / 15.20.2. Оператор сравнения типов instanceof

Во время выполнения результат оператора instanceof равен true, если значение RelationalExpression не равно нулю и ссылка может быть приведена к ReferenceType без повышения ClassCastException.

В противном случае результат будет ложным .


три слова от автора

ЕСЛИ ты спрашиваешь, ПОЧЕМУ?

ЧТОБЫ ИЗБЕГАТЬ NullPointerException

Немного больше кода сэкономит ваше время на последующем отслеживании ошибок в вашем коде и уменьшит возникновение аномалий.

рассмотрим следующий пример:

View.OnClickListener listener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        btnSend.setClickable(false);

    }
});

btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  
ceph3us
источник
2
Похоже, что в любое время вызывается выражение else, код уже содержит ошибки. Вы ожидали кнопку, но что-то еще было пропущено. Вы должны бросить исключение, когда vэто не так Button.
Йерун
Не совсем то, что я имел в виду, но, тем не менее, улучшение.
Йерун
@JeroenBollen eelaborate, пожалуйста :) хорошо, я вижу только одну вещь, которая не соответствует, это сообщение об исключении о "неправильном представлении, переданном методу". Кроме того, это просто попытка показать, как это должно выглядеть.
ceph3us
Я имел в виду, что когда сама функция получает значение null, это уже ошибка, и она должна выдавать исключение.
Йерун
1

С Kotlin вы можете сделать,

// to disable clicks
myButton.isClickable = false 

// to disable button
myButton.isEnabled = false

// to enable clicks
myButton.isClickable = true 

// to enable button
myButton.isEnabled = false
Все это Ваити
источник