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.
android
android-layout
Hitendra
źródło
źródło
Odpowiedzi:
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
.źródło
Button
, ale nieImageButton
. Także to będzie działać dlaImageButton
„sandroid:src
atrybut, ale nieandroid: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?Spróbuj tego
btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { btn.setBackgroundResource(R.drawable.icon); } });
źródło
mhh. Mam inne rozwiązanie, które mi pomogło, ponieważ mam tylko dwa różne ustawienia:
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.
źródło
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; } });
źródło
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.
źródło
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.
źródło
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
źródło
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_checked
zamiaststate_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.OnCheckedChangeListener
musisz 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
OnCheckedChangeListener
dla każdego przycisku, co spowoduje odznaczenie innych przycisków, gdy jest zaznaczone. Mam nadzieję że to pomoże.źródło
Odpowiedź @ ingsaurabh jest drogą do zrobienia, jeśli używasz nawet onClick. Jeśli jednak używasz zdarzenia onTouch, możesz wybrać różne tła (nadal takie same jak w przykładzie @ingsaurabh) za pomocą
view.setPressed()
.Więcej informacji można znaleźć w następującym artykule: Przycisk „Naciśnij i przytrzymaj” na Androidzie wymaga zmiany stanów (niestandardowy selektor XML) za pomocą narzędzia onTouchListener
źródło
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"/>
źródło