Wie stelle ich das Hintergrundbild der Bildschaltfläche für einen anderen Status ein?

80

Ich möchte einen Bildknopf mit zwei Zuständen i) normal ii) berühren (oder klicken).

Ich habe ein normales Bild im Hintergrund der Bildschaltfläche eingestellt und versuche, das Bild (gedrückt) über die Onclick- Methode zu ändern , aber es ändert sich nicht.

Ich möchte, dass wenn ich die Bildtaste drücke, das Bild von normal zu gedrückt wechselt, bis ich eine andere Taste drücke, aber es passiert nicht .

Kann mir jemand vorschlagen, wie ich das mit dem Selektor oder zur Laufzeit machen kann ?

Hier ist mein Imagebuttonpanel-Code.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="horizontal"
  android:gravity="bottom"
  android:id="@+id/buttonpanel">
  <ImageButton android:id="@+id/buttonhome"
               android:layout_width="80dp"
               android:layout_height="36dp"
               android:focusable="true" 
               android:background="@drawable/homeselector">
               </ImageButton>
  <ImageButton android:id="@+id/buttonsearch"
               android:layout_height="36dp"
               android:layout_width="80dp"
               android:background="@drawable/searchselector"
               android:focusable="true">
               </ImageButton>>
  <ImageButton android:id="@+id/buttonreg"
               android:layout_height="36dp"
               android:layout_width="80dp"
               android:background="@drawable/registerselector"
               android:focusable="true">
               </ImageButton>>
  <ImageButton android:id="@+id/buttonlogin"
               android:layout_height="36dp"
               android:layout_width="80dp"
               android:background="@drawable/loginselector"
               android:focusable="true">
               </ImageButton>
</LinearLayout>

und mein Selektor xml ist

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!--<item android:state_pressed="true" android:drawable="@drawable/homehover" 
        /> <item android:state_focused="true" android:drawable="@drawable/homehover" 
        /> <item android:drawable="@drawable/home" /> <item android:state_window_focused="true" 
        android:drawable="@drawable/homehover" /> -->
    <item android:state_enabled="false" android:drawable="@drawable/homehover" />
    <item android:state_pressed="true" android:state_enabled="true"
        android:drawable="@drawable/homehover" />
    <item android:state_focused="true" android:state_enabled="true"
        android:drawable="@drawable/homehover" />
    <item android:state_enabled="true" android:drawable="@drawable/home" />

</selector> 

Ich habe auch versucht, die Bildressource bei ontouch und onclick event zu ändern, aber es hilft nicht.

Hitendra
quelle
Ich glaube , Sie nach so etwas wie suchen diese . Ich habe vor einiger Zeit eine ähnliche Frage gestellt.
Federico klez Culloca

Antworten:

223

Erstellen Sie eine XML-Datei in Ihrem Drawable wie folgt:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_enabled="false"
        android:drawable="@drawable/btn_sendemail_disable" />
    <item
        android:state_pressed="true"
        android:state_enabled="true"
        android:drawable="@drawable/btn_send_email_click" />
    <item
        android:state_focused="true"
        android:state_enabled="true"
        android:drawable="@drawable/btn_sendemail_roll" />
    <item
        android:state_enabled="true"
        android:drawable="@drawable/btn_sendemail" />
</selector>

Und setzen Sie Bilder entsprechend und setzen Sie dann diese XML als Hintergrund Ihrer imageButton.

ingsaurabh
quelle
11
Richtig. Dies wird Selector XMLs
Aman Alam
4
@Hitendra: Ich denke, die Operation wusste das bereits. Die Frage kann dahingehend interpretiert werden, warum der Selektor nicht aufgerufen wird.
Samuel
Ist state_enabled notwendig?
Dr. Jacky
4
Dies funktioniert wie gewohnt Button, aber nicht ImageButton. Auch dies würde für ImageButtondas android:srcAttribut funktionieren , aber nicht android:background. Und was ist der Unterschied zwischen Ihrem und dem OP-Selektor (außer Formatierungs- und Zeichnungsnamen)? Vermisse ich etwas
Alexander Malakhov
@AlexanderMalakhov Für mich funktioniert es sehr gut für ImageButton und Android: Hintergrund.
Trilarion
15

Versuche dies

btn.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        btn.setBackgroundResource(R.drawable.icon);
    }
});
Parag Chauhan
quelle
Gibt
9

mhh. Ich habe eine andere Lösung, die mir geholfen hat, weil ich nur zwei verschiedene Zustände habe:

  • Entweder wird das Element nicht angeklickt
  • oder es wird angeklickt und so wird es hervorgehoben

In meiner .xml definiere ich den ImageButton folgendermaßen:

 <ImageButton
    android:id="@+id/imageButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/selector" />

Die entsprechende Auswahldatei sieht folgendermaßen aus:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/ico_100_checked" android:state_selected="true"/>
    <item android:drawable="@drawable/ico_100_unchecked"/>

</selector>

Und in meinem onCreate rufe ich an:

final ImageButton ib = (ImageButton) value.findViewById(R.id.imageButton);

    OnClickListener ocl =new OnClickListener() {
        @Override
        public void onClick(View button) {
            if (button.isSelected()){
                button.setSelected(false);
            } else {
                ib.setSelected(false);
                //put all the other buttons you might want to disable here...
                button.setSelected(true);
            }
        }
    };

ib.setOnClickListener(ocl);
//add ocl to all the other buttons

getan. hoffe das hilft. Ich habe eine Weile gebraucht, um das herauszufinden.

bass.t
quelle
8

Hallo versuchen Sie den folgenden Code, es wird für Sie nützlich sein,

((ImageView)findViewById(R.id.ImageViewButton)).setOnTouchListener(new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN)
            ((ImageView) v.findViewById(R.id.ImageViewButton)).setImageResource(R.drawable.image_over);

        if(event.getAction() == MotionEvent.ACTION_UP)
            ((ImageView) v.findViewById(R.id.ImageViewButton)).setImageResource(R.drawable.image_normal);

        return false;
    }
});
VenkaReddy
quelle
1
Eigentlich funktioniert das auch nicht wirklich, wenn action_up in einer anderen Ansicht stattfindet. Versuchen Sie, event.getAction () == MotionEvent.ACTION_CANCEL anstelle von ACTION_UP zu verwenden.
Chug2k
3

Ich denke, Sie Problem ist nicht die Auswahldatei.

du musst hinzufügen

<imagebutton ..
    android:clickable="true"
/>

zu Ihren Bildschaltflächen.

Standardmäßig wird der onClick auf Listenelementebene (übergeordnet) behandelt. und die imageButtons erhalten den onClick nicht.

Wenn Sie das obige Attribut hinzufügen, empfängt die Bildschaltfläche das Ereignis und der Selektor wird verwendet.

Aktivieren Sie diesen POST, der das gleiche für das Kontrollkästchen erklärt.

Samuel
quelle
1

Wenn Sie die Bildtaste drücken möchten, sollte das Bild von normal auf gedrückt geändert werden

Am besten passen Sie den RadioButton an und verwenden ihn in einer Gruppe. Ich habe ein Beispiel dafür gesehen. Entschuldigung, ich habe mich nicht an diesen Link erinnert.

aber wenn du das vermeiden willst. Sie müssen dies zu Ihrer selector.xml hinzufügen

Einmal getan. Ich bin gerade zu Ihrem Code gekommen und füge diesen hinzu

public void onClick ( View v ) {
    myImageButton.setSelected ( true ) ;
 }

Sie werden das Ergebnis sehen. Sie müssen jedoch die Zustände verwalten, auf die die Taste kürzlich gedrückt wurde. Damit können Sie einstellen

  myOLDImageButton.setSelected ( false ) ;

Ich empfehle Ihnen, alle Schaltflächenreferenzen in ein Array einzufügen.

Arslan Anwar
quelle
0

Was Sie versuchen, ist eher eine segmentierte Schaltfläche als eine Bildschaltflächenliste.

Hier finden Sie unter http://blog.bookworm.at/2010/10/segmented-controls-in-android.html ein Beispiel dafür. Die Grundidee besteht darin, RadioButton anstelle von ImageButton anzupassen, da der RadioButton den von Ihnen benötigten Status hat

njzk2
quelle
Nein. Ich glaube nicht, dass er das wollte. Die segmentierte Steuerung ist ein völlig anderes UI-Element. Er möchte 1 Taste, die den Status ändert.
Henley Chiu
0

Hast du es versucht CompoundButton? CompoundButton verfügt über die überprüfbare Eigenschaft, die genau Ihren Anforderungen entspricht. Ersetzen Sie ImageButtons durch diese.

  <CompoundButton android:id="@+id/buttonhome"
                  android:layout_width="80dp"
                  android:layout_height="36dp"
                  android:background="@drawable/homeselector"/>

Ändern Sie die Selektor-XML wie folgt. Möglicherweise müssen einige Änderungen vorgenommen werden, aber stellen Sie sicher, dass Sie diese state_checkedanstelle von verwenden state_pressed.

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:drawable="@drawable/homehover" />
    <item android:state_checked="true" android:state_enabled="true"
          android:drawable="@drawable/homehover" />
    <item android:state_focused="true" android:state_enabled="true"
          android:drawable="@drawable/homehover" />
    <item android:state_enabled="true" android:drawable="@drawable/home" />

</selector> 

In CompoundButton.OnCheckedChangeListenermüssen Sie andere basierend auf Ihren Bedingungen aktivieren und deaktivieren.

 mButton1.setOnCheckedChangeListener(new OnCheckedChangeListener() {

   public void onCheckedChanged (CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            // Uncheck others. 
        }
   }
});

OnCheckedChangeListenerStellen Sie auf ähnliche Weise ein für jede Schaltfläche ein, wodurch andere Schaltflächen deaktiviert werden, wenn sie aktiviert ist. Hoffe das hilft.

Ronnie
quelle
Sie können CompoundButton nicht direkt in XML verwenden, da es sich um eine abstrakte Klasse handelt.
Dan Hulme
0

Sie können eine Auswahldatei in res / drawable erstellen

Beispiel: res / drawable / selector_button.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/btn_disabled" android:state_enabled="false" />
    <item android:drawable="@drawable/btn_enabled" />
</selector>

und in Layout-Aktivität, Fragment oder etc.

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/selector_bg_rectangle_black"/>
Rasoul Miri
quelle