Hoe een Android-knop uitschakelen?

Ik heb een lay-out gemaakt die twee knoppen bevat, Volgende en Vorige. Tussen de knoppen genereer ik een aantal dynamische views. Dus wanneer ik de applicatie voor het eerst start, wil ik de knop “Vorige” uitschakelen, omdat er geen eerdere weergaven zijn. Ik wil ook de knop “Volgende” uitschakelen als er niet meer weergaven zijn om weer te geven. Is er een manier om de knoppen uit te schakelen?

schermafbeelding van voorbeeldlay-out


Antwoord 1, autoriteit 100%

Heb je dit geprobeerd?

myButton.setEnabled(false); 

Update: met dank aan Gwen. Bijna vergeten dat android:clickablein je XML-layout kan worden ingesteld om te bepalen of een knop klikbaar kan zijn of niet.


Antwoord 2, autoriteit 6%

Je kunt het niet in- of uitschakelen in je XML (aangezien je lay-out is ingesteld tijdens runtime), maar je kunt instellen of het klikbaar is bij het starten van de activiteit met android:clickable.


Antwoord 3, autoriteit 5%

Ja, het kan worden uitgeschakeld in XML
gewoon met behulp van:

<Button
android:enabled="false"
/>

Antwoord 4, autoriteit 5%

Je schrijft gewoon een enkele regel code in je activiteit

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

Als je dezelfde knop wilt inschakelen, schrijf dan gewoon

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

Antwoord 5, autoriteit 3%

In Java, als je eenmaal de referentie van de knop hebt:

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

Om de knop in/uit te schakelen, kunt u een van de volgende gebruiken:

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

Of:

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

Omdat u de knop vanaf het begin wilt uitschakelen, kunt u button.setEnabled(false);gebruiken in de onCreate-methode.
Anders kunt u vanuit XML rechtstreeks het volgende gebruiken:

android:clickable = "false"

Dus:

<Button
        android:id="@+id/button"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="@string/button_text"
        android:clickable = "false" />

Antwoord 6

In mijn geval

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

werkt prima en het activeert en deactiveert de knop zoals het hoort. Maar zodra de knopstatus wordt uitgeschakeld, keert deze nooit meer terug naar de ingeschakelde status, hoewel er wel op kan worden geklikt. Ik heb geprobeerd de tekenbare staat ongeldig te maken en te vernieuwen, maar geen geluk.

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

Als jij of iemand anders een soortgelijk probleem heeft, wat voor mij werkt, is het opnieuw instellen van de tekenbare achtergrond. Werkt op elk API-niveau.

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

Antwoord 7

Als u in Kotlin naar de knopweergave verwijst met id, schakelt u de knop in/uit als zoals

layout.xml

<Button
   android:id="@+id/btn_start"
   android:layout_width="100dp"
   android:layout_height="50dp"
   android:text="@string/start"
   android:layout_alignParentBottom="true"/>

activiteit.kt

 btn_start.isEnabled = true   //to enable button
  btn_start.isEnabled = false  //to disable button

Antwoord 8

Met Kotlin kun je doen,

// to disable clicks
myButton.isClickable = false 
// to disable button
myButton.isEnabled = false
// to enable clicks
myButton.isClickable = true 
// to enable button
myButton.isEnabled = true

Antwoord 9

VERKEERDE MANIERIN LUISTERAARS OM VARIABELE IN PLAATS VAN PARAMETER TE GEBRUIKEN!!!

btnSend.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        btnSend.setClickable(false);
    }
});

JUISTE MANIER:

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

BEWERKEN:
Als antwoord op @jeroen-bollen

View.OnClickListener 

is Interfacedefinitievoor een callback die moet worden aangeroepen wanneer op een weergave wordt geklikt.

met methodedefinitie

void onClick(View v);

wanneer op de weergave wordt geklikt, roept het klasse-object View de methode onClick() terug als parameter zelf, dus de parameter null view zou niet moeten voorkomen als dit het geval is, het is een Bevestigingsfouthet kan bijvoorbeeld gebeuren wanneer de View-objectklasse ondertussen is vernietigd (bijvoorbeeld verzameld door GC) of als er met de methode is geknoeid vanwege een hack

weinig over instanceof & null

JLS / 15.20.2. Type Vergelijkingsoperator instantievan

Tijdens runtime is het resultaat van de instanceof-operator waar
als de waarde van de RelationalExpression niet null is
en de verwijzing kan worden gegoten naar het ReferenceType
zonder een ClassCastException op te heffen.

Anders is het resultaat onwaar.


drie woorden van de auteur

ALS U VRAAGT WAAROM ?

BESTEMMING OM NullPointerException te VERMIJDEN

Een beetje meer code bespaart u tijd bij het later opsporen van bugs in uw code & vermindert het optreden van afwijkingen.

beschouw het volgende voorbeeld:

View.OnClickListener listener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        btnSend.setClickable(false);
    }
});
btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  

Antwoord 10

Als u de knop moet uitschakelen, voegt u deze regel code toe.

Button button = findViewById(R.id.button)
button.setEnabled(false);

En schakel de knop in, voeg gewoon deze regel toe

button.setEnabled(true);

Veel plezier met coderen 😀


Antwoord 11

maak eerst in xml de knop als android:clickable="false"

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

vervolgens in uw code, binnen de oncreate()methode de eigenschap button instellen als

btn.setClickable(true);

klik vervolgens in de knop op verander de code in

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

Antwoord 12

Je kunt een knop uit je xml uitschakelen, maar dat is niet dynamisch. De beste manier om de knop dynamisch uit te schakelen is.

myButton.setEnabled(false); 

Antwoord 13

Gebruik gewoon de setEnabled-methode in Java.

myButton.setEnabled(false); 

En in Kotlin

myButton.enabled = false

Other episodes