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



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



screen shot of sample layout

624   9  

9 ответов:

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

myButton.setEnabled(false); 

обновление: благодаря Гвен. Чуть не забыл, что android:clickable может быть установлен в вашем 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();

Если у вас или у кого-то есть аналогичная проблема, то для меня работает установка фона, который можно снова нарисовать. Работает на любом уровне 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"/>

активности.КТ

  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() метод установите свойство кнопки как

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 

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

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

void onClick(View v);

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

немного о instanceof & null

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

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

в противном случае результат равен false.


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

ЕСЛИ ВЫ СПРОСИТЕ, ПОЧЕМУ ?

в основном, чтобы избежать NullPointerException

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

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

View.OnClickListener listener = new OnClickListener() {

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

    }
});

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

Comments

    Ничего не найдено.