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?
Antwoord 1, autoriteit 100%
Heb je dit geprobeerd?
myButton.setEnabled(false);
Update: met dank aan Gwen. Bijna vergeten dat android:clickable
in 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