Если бы я использовал ImageButton с селектором для его фона, можно ли изменить состояние, которое заставит его изменить свой внешний вид? Прямо сейчас я могу заставить его менять изображения при нажатии, но, похоже, нет «выделенного», «выбранного» или аналогичного состояния, которое позволяет мне переключать его внешний вид по желанию.
Вот мой XML; он меняет внешний вид только при нажатии.
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:state_pressed="false" android:drawable="@drawable/map_toolbar_details_selected" />
<item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/map_toolbar_details_selected" />
<item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/map_toolbar_details_selected" />
<item android:drawable="@drawable/map_toolbar_details" />
android
button
imagebutton
Джорен
источник
источник
Ответы:
Это работает для меня:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- NOTE: order is important (the first matching state(s) is what is rendered) --> <item android:state_selected="true" android:drawable="@drawable/info_icon_solid_with_shadow" /> <item android:drawable="@drawable/info_icon_outline_with_shadow" /> </selector>
А потом в java:
//assign the image in code (or you can do this in your layout xml with the src attribute) imageButton.setImageDrawable(getBaseContext().getResources().getDrawable(R.drawable....)); //set the click listener imageButton.setOnClickListener(new OnClickListener() { public void onClick(View button) { //Set the button's appearance button.setSelected(!button.isSelected()); if (button.isSelected()) { //Handle selected state change } else { //Handle de-select state change } } });
Для плавного перехода вы также можете указать время анимации:
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_mediumAnimTime">
источник
NOTE: order is important (the first matching state(s) is what is rendered
это сработало, но странно, я не понял ПОЧЕМУ?android:state_selected="false"
тот, который установлен по умолчанию!ToggleImageButton
который реализуетCheckable
интерфейс и поддерживаетOnCheckedChangeListener
иandroid:checked
атрибут XML:public class ToggleImageButton extends ImageButton implements Checkable { private OnCheckedChangeListener onCheckedChangeListener; public ToggleImageButton(Context context) { super(context); } public ToggleImageButton(Context context, AttributeSet attrs) { super(context, attrs); setChecked(attrs); } public ToggleImageButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setChecked(attrs); } private void setChecked(AttributeSet attrs) { TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ToggleImageButton); setChecked(a.getBoolean(R.styleable.ToggleImageButton_android_checked, false)); a.recycle(); } @Override public boolean isChecked() { return isSelected(); } @Override public void setChecked(boolean checked) { setSelected(checked); if (onCheckedChangeListener != null) { onCheckedChangeListener.onCheckedChanged(this, checked); } } @Override public void toggle() { setChecked(!isChecked()); } @Override public boolean performClick() { toggle(); return super.performClick(); } public OnCheckedChangeListener getOnCheckedChangeListener() { return onCheckedChangeListener; } public void setOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) { this.onCheckedChangeListener = onCheckedChangeListener; } public static interface OnCheckedChangeListener { public void onCheckedChanged(ToggleImageButton buttonView, boolean isChecked); } }
res / values / attrs.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="ToggleImageButton"> <attr name="android:checked" /> </declare-styleable> </resources>
источник
state_checked
не работает с этим, вы должны использоватьstate_selected
.Лучший способ сделать это без дополнительных изображений:
public static void buttonEffect(View button){ button.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { v.getBackground().setColorFilter(0xe0f47521,PorterDuff.Mode.SRC_ATOP); v.invalidate(); break; } case MotionEvent.ACTION_UP: { v.getBackground().clearColorFilter(); v.invalidate(); break; } } return false; } }); }
источник
Создайте XML-файл в
res/drawable
папке. Например, «btn_image.xml»:<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/bg_state_1" android:state_pressed="true" android:state_selected="true"/> <item android:drawable="@drawable/bg_state_2" android:state_pressed="true" android:state_selected="false"/> <item android:drawable="@drawable/bg_state_selected" android:state_selected="true"/> <item android:drawable="@drawable/bg_state_deselected"/> </selector>
Вы можете комбинировать те файлы, которые вам нравятся, например, изменить «bg_state_1» на «bg_state_deselected» и «bg_state_2» на «bg_state_selected».
В любом из этих файлов вы можете написать что-то вроде:
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#ccdd00"/> <corners android:radius="5dp"/> </shape>
Создайте в файле макета ImageView или ImageButton со следующими атрибутами:
<ImageView android:id="@+id/image" android:layout_width="50dp" android:layout_height="50dp" android:adjustViewBounds="true" android:background="@drawable/btn_image" android:padding="10dp" android:scaleType="fitCenter" android:src="@drawable/star"/>
Позже в коде:
image.setSelected(!image.isSelected());
источник
Попробуй это:
<item android:state_focused="true" android:state_enabled="true" android:drawable="@drawable/map_toolbar_details_selected" />
Также для цветов я добился успеха с
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:color="@color/primary_color" /> <item android:color="@color/secondary_color" /> </selector>
источник
if (iv_new_pwd.isSelected()) { iv_new_pwd.setSelected(false); Log.d("mytag", "in case 1"); edt_new_pwd.setInputType(InputType.TYPE_CLASS_TEXT); } else { Log.d("mytag", "in case 1"); iv_new_pwd.setSelected(true); edt_new_pwd.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); }
источник