Как отключить кнопку Android? - PullRequest
337 голосов
/ 08 декабря 2010

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

screen shot of sample layout

Ответы [ 9 ]

737 голосов
/ 08 декабря 2010

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

myButton.setEnabled(false); 

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

47 голосов
/ 24 августа 2011

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

31 голосов
/ 30 ноября 2012

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

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

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

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
24 голосов
/ 11 сентября 2013

В 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" />
20 голосов
/ 13 марта 2015

Да, это можно отключить в XML просто используя <Button android:enabled="false" />

8 голосов
/ 14 декабря 2012

В моем случае

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

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

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

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

myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
4 голосов
/ 15 ноября 2017

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

активность.kt

  btn_start.isEnabled = true   //to enable button
  btn_start.isEnabled = false  //to disable button
2 голосов
/ 29 июня 2015

НЕПРАВИЛЬНЫЙ ПУТЬ В СЛУЧАЕ ДЛЯ ИСПОЛЬЗОВАНИЯ ПЕРЕМЕННОГО ВМЕСТО ПАРАМЕТРА !!!

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);

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

немного о instanceof & null

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

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

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


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

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

ТОЛЬКО ЧТОБЫ ИЗБЕЖАТЬ NullPointerException

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

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

View.OnClickListener listener = new OnClickListener() {

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

    }
});

btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  
2 голосов
/ 01 октября 2014

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

        }
    });
}
...