Android: Geben Sie mithilfe von XML zwei verschiedene Bilder für die Umschalttaste an


100

Ich versuche, das Standard- ToggleButtonErscheinungsbild zu überschreiben . Hier ist das XML, das Folgendes definiert ToggleButton:

<ToggleButton android:id="@+id/FollowAndCenterButton"
        android:layout_width="30px"
        android:layout_height="30px"
        android:textOn="" android:textOff="" android:layout_alignParentLeft="true"
        android:layout_marginLeft="5px"
        android:layout_marginTop="5px" android:background="@drawable/locate_me"/>

Jetzt haben wir zwei 30 x 30 Symbole, die wir für die angeklickten / nicht angeklickten Zustände verwenden möchten. Im Moment haben wir Code, der das Hintergrundsymbol je nach Status programmgesteuert ändert:

centeredOnLocation.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            if (centeredOnLocation.isChecked()) {
                centeredOnLocation.setBackgroundDrawable(getResources().getDrawable(R.drawable.locate_me_on));
            } else {
                centeredOnLocation.setBackgroundDrawable(getResources().getDrawable(R.drawable.locate_me));
            }
        }
});

Offensichtlich suche ich nach einem besseren Weg, dies zu tun. Ich habe versucht, einen Selektor für das Hintergrundbild zu erstellen, der automatisch zwischen den Status wechselt:

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@drawable/locate_me" /> <!-- default -->
 <item android:state_checked="true"
       android:drawable="@drawable/locate_me_on" /> <!-- pressed -->
 <item android:state_checked="false"
       android:drawable="@drawable/locate_me" /> <!-- unchecked -->

Das funktioniert aber nicht; Beim Lesen der ToggleButtonAPI ( http://developer.android.com/reference/android/widget/ToggleButton.html ) scheinen die einzigen geerbten XML-Attribute zu sein

    XML Attributes
Attribute Name  Related Method  Description
android:disabledAlpha       The alpha to apply to the indicator when disabled. 
android:textOff         The text for the button when it is not checked. 
android:textOn      The text for the button when it is checked. 

Es scheint kein android: state_checked-Attribut zu geben, obwohl die Klasse die Methode isChecked()und hat setChecked().

Gibt es also eine Möglichkeit, in XML das zu tun, was ich will, oder bin ich mit meiner chaotischen Problemumgehung festgefahren?


Hinweis: Wenn Sie keinen Text verwenden, ist die Verwendung möglicherweise besser CompoundButton.
Timmmm

1
Ignorieren Sie das; CompoundButtonist abstrakt!
Timmmm

Antworten:


159

Ihr Code ist in Ordnung. Mit der Umschalttaste wird jedoch das erste Element in Ihrer Auswahl angezeigt, mit dem es übereinstimmt. Daher sollte die Standardeinstellung die letzte sein. Ordnen Sie die Elemente folgendermaßen an, um sicherzustellen, dass sie alle verwendet werden:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:state_pressed="true" /> //currently pressed turning the toggle on
    <item android:state_pressed="true" /> //currently pressed turning the toggle off
    <item android:state_checked="true" /> //not pressed default checked state
    <item /> //default non-pressed non-checked
</selector>

3
Das macht vollkommen Sinn; Ich habe nie die Verbindung zwischen Selector- und Switch-Anweisungen hergestellt.
I82Much

Du hast meinen Tag gemacht ... Ich hatte Probleme mit der Schaltfläche, dem Kontrollkästchen und habe dann auch das Optionsfeld ausprobiert. Schließlich war dieser Beitrag hilfreich. Vielen Dank Vitaly Polonetsky und I82Much
David Prun

8
In der Dokumentation heißt es irgendwo, dass es von oben liest und beim ersten Zustand anhält, dessen Bedingungen alle erfüllt sind. Wenn also die Standardeinstellung oben ist, wird es nie über dieses Zeichen hinausgehen.
Travis

1
@ I82Das switchwürde immer das "richtige" auswählen, unabhängig von der Reihenfolge, dies verhält sich eher wie ein langwieriger if-elseif-elseif-elsemit Bedingungen wie state_x == true && state_y == false && state_z = true.
TWiStErRob
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.