Como desativar um botão do Android?

371

Eu criei um layout que contém dois botões, Próximo e Anterior. Entre os botões, estou gerando algumas visualizações dinâmicas. Então, quando inicio o aplicativo, desejo desativar o botão "Anterior", pois não haverá visualizações anteriores. Também quero desativar o botão "Avançar" quando não houver mais visualizações para exibir. Existe alguma maneira de desativar os botões?

captura de tela do layout da amostra

Dijo David
fonte

Respostas:

802

Você tentou isso?

myButton.setEnabled(false); 

Atualização: Graças a Gwen. Quase esqueci que android:clickablepode ser definido no layout XML para determinar se um botão pode ser clicável ou não.

Varun
fonte
66
o equivalente é android: ativado em xml.
Namratha
11
E onde você encontrou isso na documentação? Você pode vinculá-lo aqui?
Varun
4
@Namratha que está trabalhando apenas para widgets "Button", e não para imageView como um botão
mehmet
Equivalente a Xamarin: myButton.Enabled = false;
Cameron Forward
48

Você não pode habilitá-lo ou desabilitá-lo em seu XML (já que seu layout está definido em tempo de execução), mas é possível definir se é clicável no início da atividade com android:clickable.

Gwen
fonte
4
5 anos de experiência no Android e eu conheço isso AGORA! : /
Sagar
35

Você acabou de escrever uma única linha de código em sua atividade

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

Quando você deseja ativar o mesmo botão, basta escrever

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
Deepak Sharma
fonte
20
Isso são 2 linhas. Isso é um. ((Button)findViewById(R.id.mybutton)).setEnabled(false);
Matt Clark
34
Tente entender os sentimentos Matt ..;)
Deepak Sharma
30

Sim, ele pode ser desativado no XML usando apenas:

<Button
android:enabled="false"
/>
Mulaffer
fonte
2
Esta é a resposta real para xml. Toda essa bobagem de mexer com clicável não tem nada a ver com a forma como o botão é desenhado para torná-lo desativado.
22817 Scott Scott
11
Acho que as pessoas pensaram que você não pode fazer isso porque a conclusão do código AS / IDEA não sugere android:enabledquando você começa a digitar. (Mesmo para este dia.)
Kevin Krumwiede
11
Eu tentei não está funcionando, somente a partir do código setEnabledestá trabalhando
FindOutIslamNow
23

Em Java, depois de ter a referência do botão:

Button button = (Button) findviewById(R.id.button);

Para ativar / desativar o botão, você pode usar:

button.setEnabled(false);
button.setEnabled(true);

Ou:

button.setClickable(false);
button.setClickable(true);

Como você deseja desativar o botão desde o início, você pode usar o button.setEnabled (false); no método onCreate. Caso contrário, no XML, você pode usar diretamente:

android:clickable = "false"

Assim:

<Button
        android:id="@+id/button"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="@string/button_text"
        android:clickable = "false" />
Paolo Rovelli
fonte
respondeu Dec 8 '10 às
11
@Oldie: Na verdade, se você ler as duas respostas, entenderá que elas são bastante semelhantes, mas não iguais.
Paolo Rovelli
9

No meu caso,

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

está funcionando bem e está ativando e desativando o botão como deveria. Porém, quando o estado do botão é desativado, ele nunca volta ao estado ativado, embora seja clicável. Tentei invalidar e atualizar o estado do drawable, mas sem sorte.

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

Se você ou alguém com um problema semelhante, o que funciona para mim é definir o plano de fundo novamente. Funciona em qualquer nível da API.

myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
ayorhan
fonte
8

No Kotlin, se você consultar a Visualização de botão com id, ative / desative o botão como

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
fonte
2

primeiro no xml faça o botão como android:clickable="false"

<Button
        android:id="@+id/btn_send"
        android:clickable="false"/>

em seu código, dentro do oncreate()método, defina a propriedade button como

btn.setClickable(true);

depois, dentro do botão, clique em alterar o código para

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
fonte
2

MANEIRA ERRADA EM OUVIR USAR VARIÁVEIS EM VEZ DO PARÂMETRO !!!

btnSend.setOnClickListener(new OnClickListener() {

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

    }
});

MANEIRA CERTA:

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: Em resposta a @ jeroen-bollen

 View.OnClickListener 

é definição de interface para que um retorno de chamada seja chamado quando uma visualização é clicada.

com definição de método

void onClick(View v);

quando a visualização é clicada, o objeto da classe View retorna para o método onClick () enviando como o próprio parâmetro, portanto, o parâmetro nulo da visualização não deve ocorrer se ocorrer um erro de declaração . exemplo coletado pelo GC) ou método foi adulterado devido a invasão

pouco sobre instanceof & null

JLS / 15.20.2. Operador de comparação de tipo instanceof

No tempo de execução, o resultado do operador instanceof é verdadeiro se o valor da RelationalExpression não for nulo e a referência puder ser convertida no ReferenceType sem gerar uma ClassCastException.

Caso contrário, o resultado é falso .


três palavras do autor

SE VOCÊ PERGUNTAR POR QUE?

PARA EVITAR NullPointerException

Um pouco mais de código economizará seu tempo no rastreamento posterior de erros no seu código e reduzirá a ocorrência de anomalias.

considere o seguinte exemplo:

View.OnClickListener listener = new OnClickListener() {

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

    }
});

btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  
ceph3us
fonte
2
Parece que sempre que a expressão else seria chamada, o código já está com erros. Você estava esperando um botão, mas algo mais foi passado. Você deve lançar uma exceção quando vnão é um Button.
Jeroen
Não é exatamente o que eu quis dizer, mas uma melhoria, no entanto.
Jeroen
@JeroenBollen eelaborate, por favor :) ok, vejo apenas uma coisa que não é consistente: é uma mensagem de exceção sobre "visão errada passada para o método". Além disso, é apenas uma tentativa de mostrar como deve ser.
ceph3us
Eu quis dizer que quando a função em si recebe nulo, já é um bug e deve gerar uma exceção.
Jeroen
1

Com Kotlin você pode fazer,

// to disable clicks
myButton.isClickable = false 

// to disable button
myButton.isEnabled = false

// to enable clicks
myButton.isClickable = true 

// to enable button
myButton.isEnabled = false
Tudo é muito
fonte