Як відключити кнопку Android?


370

Я створив макет, який містить дві кнопки: Далі та Попередня. Між кнопками я створюю динамічні види. Тож коли я вперше запускаю програму, я хочу відключити кнопку "Попередня", оскільки попередніх переглядів не буде. Я також хочу відключити кнопку "Далі", коли немає більше переглядів для відображення. Чи все ж є можливість відключити кнопки?

знімок екрана зразкового макета

Відповіді:


800

Ви пробували це?

myButton.setEnabled(false); 

Оновлення: Завдяки Гвен. Майже забув, що android:clickableможна встановити у вашому макеті XML, щоб визначити, чи можна натискати кнопку чи ні.


66
еквівалент Android: увімкнено в xml.
Намратха

1
А де ви це знайшли в документації? Чи можете ви пов’язати це тут?
Варун

4
@Namratha працює лише для віджетів "Кнопка", а не для imageView as a button
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"
/>

2
Це справжня відповідь на xml. Вся ця нісенітниця, що возиться з натисканням, не має нічого спільного з тим, як кнопка намальована, щоб зробити її вимкненою.
Скотт Біггс

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 (помилково); у методі 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 Varun

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

8

Якщо в Котліні ви посилаєтесь на кнопку Кнопка з ідентифікатором, тоді увімкніть / вимкніть кнопку як би

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

спочатку в 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);

        }
    });
}

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!");
             }
          }
       }
    });

EDIT: У відповідь на @ jeroen-bollen

 View.OnClickListener 

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

з визначенням методу

void onClick(View v);

при натисканні на представлення об'єкт класу View здійснює зворотний виклик методу onClick (), що надсилається як сам параметр, тому параметр null view не повинен виникати, якщо це робиться помилка твердження, це може статися, наприклад, коли тим часом клас об'єктів View був знищений (для Приклад, зібраний за допомогою GC) або метод був підроблений через злом

трохи про instanceof & null

JLS / 15.20.2. Типи Оператор порівняння типу

Під час виконання результат оператора instanceof є істинним, якщо значення RelationalExpression не є нульовим і посилання може бути передано на ReferenceType, не підвищуючи ClassCastException.

Інакше результат хибний .


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

ЯКЩО ПИТАТИ ЧОМУ?

НАЙБІЛЬШЕ УНИМАТИ NullPointerException

Трохи більше коду заощадить ваш час на подальше відстеження помилок у вашому коді та зменшить кількість аномалій.

розглянемо наступний приклад:

View.OnClickListener listener = new OnClickListener() {

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

    }
});

btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  

2
Схоже, у будь-який момент, коли інший вираз буде викликаний, код уже помилився. Ви очікували на кнопку, але щось інше було прийнято. Ви повинні кинути виняток, коли vце не так Button.
Jeroen

Не зовсім те, що я мав на увазі, але покращення все-таки.
Jeroen

@ JeroenBollen eelaborate будь ласка :) Ок, я бачу лише одне, що не відповідає, це повідомлення про виключення про "неправильний погляд, переданий методу". Окрім того, це лише спроба показати, як це має виглядати.
ceph3us

Я мав на увазі, що коли сама функція отримує null, це вже помилка, і вона повинна кинути виняток.
Jeroen

1

З Котліном ви можете зробити це,

// to disable clicks
myButton.isClickable = false 

// to disable button
myButton.isEnabled = false

// to enable clicks
myButton.isClickable = true 

// to enable button
myButton.isEnabled = false
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.