Jak ustawić obraz tła przycisku obrazu dla innego stanu?

81

Chcę przycisk obrazu z dwoma stanami i) normalny ii) dotknij (lub kliknij).

Mam ustawiony normalny obraz w ImageButton tle i usiłuję zmian obrazu (wciśnięty) z onclick metody, ale to nie zmienia.

Chcę, żeby po naciśnięciu przycisku obrazu obraz zmienił się z normalnego na wciśnięty, dopóki nie naciśnę innego przycisku, ale tak się nie dzieje .

Czy ktoś może mi zasugerować, jak mogę to zrobić za pomocą selektora lub w czasie wykonywania ?

Oto mój kod imagebuttonpanel.

<?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>

a mój selektor xml to

<?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> 

Próbowałem też zmienić zasób obrazu na zdarzeniach ontouch i onclick, ale to nie pomaga.

Hitendra
źródło
Myślę, że szukasz czegoś jak ten . Zadałem podobne pytanie temu.
Federico klez Culloca,

Odpowiedzi:

225

Utwórz plik xml w swoim rysunku w następujący sposób:

<?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>

I odpowiednio ustaw obrazy, a następnie ustaw ten plik XML jako tło swojego imageButton.

ingsaurabh
źródło
11
Poprawny. będzie się to nazywać Selector XMLs
Aman Alam
4
@Hitendra: Myślę, że operator już to wiedział. pytanie można zinterpretować jako dlaczego selektor nie jest wywoływany.
Samuel
Czy state_enabled jest konieczne?
Dr Jacky
4
Działa to zwykle Button, ale nie ImageButton. Także to będzie działać dla ImageButton„s android:srcatrybut, ale nie android:background. Jaka jest różnica między twoim a selektorem OP (z wyjątkiem formatowania i nazw elementów do rysowania)? Czy coś mi brakuje?
Alexander Malakhov
@AlexanderMalakhov Dla mnie działa bardzo dobrze na ImageButton i Android: background.
Trilarion
15

Spróbuj tego

btn.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        btn.setBackgroundResource(R.drawable.icon);
    }
});
Parag Chauhan
źródło
czy jest ktoś, kto ma pomysł, że mogę to zrobić
Hitendra,
9

mhh. Mam inne rozwiązanie, które mi pomogło, ponieważ mam tylko dwa różne ustawienia:

  • element nie został kliknięty
  • lub zostanie kliknięty i zostanie podświetlony

W moim .xml definiuję ImageButton w ten sposób:

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

Odpowiedni plik selektora wygląda następująco:

<?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>

A w moim onCreate dzwonię:

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

Gotowe. mam nadzieję że to pomoże. zajęło mi trochę czasu, zanim się zorientowałem.

bass.t
źródło
8

Cześć, wypróbuj poniższy kod, który ci się przyda,

((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
źródło
1
w rzeczywistości to również nie działa, jeśli action_up dzieje się w innym widoku. spróbuj użyć event.getAction () == MotionEvent.ACTION_CANCEL zamiast ACTION_UP.
chug2k
3

Myślę, że problemem nie jest plik selektora.

musisz dodać

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

do przycisków obrazu.

domyślnie onClick jest obsługiwany na poziomie elementu listy ( element nadrzędny). a imageButtons nie otrzymują onClick.

po dodaniu powyższego atrybutu zdarzenie otrzyma przycisk obrazu, a selektor zostanie użyty.

sprawdź ten POST, który wyjaśnia to samo dla pola wyboru.

Samuel
źródło
1

jeśli chcesz nacisnąć przycisk obrazu, obraz powinien zostać zmieniony z normalnego na wciśnięty

Ale najlepszym sposobem będzie dostosowanie RadioButton i używanie ich w grupie. Mam na to przykład. Przepraszam, że nie pamiętam tego linku.

ale jeśli chcesz tego uniknąć. Musisz dodać to do swojego selector.xml

Raz zrobione. Właśnie dostałem się do twojego kodu i dodałem to

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

Zobaczysz wynik. Ale musisz zarządzać stanami, które przycisk został ostatnio naciśnięty. Abyś mógł ustawić

  myOLDImageButton.setSelected ( false ) ;

Proponuję umieścić wszystkie odwołania do przycisku w tablicy.

Arslan Anwar
źródło
0

to, co próbujesz zrobić, to bardziej segmentowany przycisk niż lista obrazów.

tutaj http://blog.bookworm.at/2010/10/segmented-controls-in-android.html jest przykładem, jak to zrobić. Podstawowym pomysłem jest dostosowanie RadioButton zamiast ImageButton, ponieważ RadioButton będzie miał zaznaczony stan, którego potrzebujesz

njzk2
źródło
nie .. Nie sądzę, że tego właśnie chciał. sterowanie segmentowe to zupełnie inny element interfejsu użytkownika. chce 1 przycisk, który zmienia stan.
Henley Chiu,
0

Czy próbowałeś CompoundButton? CompoundButton ma właściwość checkable, która dokładnie odpowiada Twoim potrzebom. Zastąp ImageButtons tymi.

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

Zmień selektor XML na następujący. Może wymagać pewnych modyfikacji, ale pamiętaj, aby użyć state_checkedzamiast 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> 

W CompoundButton.OnCheckedChangeListenermusisz zaznaczyć i odznaczyć inne na podstawie twoich warunków.

 mButton1.setOnCheckedChangeListener(new OnCheckedChangeListener() {

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

Podobnie ustaw a OnCheckedChangeListenerdla każdego przycisku, co spowoduje odznaczenie innych przycisków, gdy jest zaznaczone. Mam nadzieję że to pomoże.

Ronnie
źródło
Nie można używać CompoundButton bezpośrednio w XML, ponieważ jest to klasa abstrakcyjna.
Dan Hulme
0

możesz stworzyć plik selektora w res / drawable

przykład: 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>

oraz w czynnościach związanych z układem, fragmentami itp

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/selector_bg_rectangle_black"/>
Rasoul Miri
źródło