state_checked不ImageView的开启和关闭 [英] state_checked doesn't toggle imageview on and off
问题描述
Android的工作室2.0 preVIEW
您好,
我有这个选择器,连接到的ImageView
。我想切换的ImageView
打开和关闭。因此,关闭会显示一个绿色的颜色和显示红色。
然而,当我点击的ImageView
没有任何反应。我曾尝试pssed和state_checked STATE_ $ P $的不同组合。而现在它变得太混乱。缺少什么我在这里。
<?XML版本=1.0编码=UTF-8&GT?;
<选择的xmlns:机器人=http://schemas.android.com/apk/res/android>
<项目的android:state_checked =假
机器人:可绘制=@绘制/ bottom_left_border/> <项目的android:state_checked =真
机器人:可绘制=@绘制/ bottom_left_border_ pressed>
< /项目>
< /选择>
非常感谢您的任何建议,
然而,当我点击ImageView的什么也没有发生。
块引用>所以,作为的 @Zielony 的说,原因很简单:的检查的状态
的ImageView
不支持从
查看
扩展每个类支持不同的状态: pressed 的选择的重点的可检查的(注意,不是的检查的状态)等,但的检查的特殊状态。而且,只有少数查看
的支持它:切换按钮
,切换
,单选
,复选框
,CheckedTextView
。他们实施可勾选
接口。您也有变种如何解决你的情况,但是这取决于你需要什么:
如果你真的想这样简单的事情。
所以关闭会显示一个绿色的颜色和显示红色。
块引用>您可以使用
复选框
或CheckedTextView
作为例子。只要创建选择:<选择的xmlns:机器人=http://schemas.android.com/apk/res/android>
<项目机器人:可绘制=< red_color>中机器人:state_checked =真/>
<项目机器人:可绘制=< green_color>中/>
< /选择>和使用
<复选框
机器人:layout_width =50dp
机器人:layout_height =50dp
机器人:文字=
机器人:按钮=@空
机器人:可点击=真
机器人:背景=< your_selector>/>
使用另一种状态。您可以使用
state_activated
(或state_selected
,但要小心,因为选择的是短暂的财产)<选择的xmlns:机器人=http://schemas.android.com/apk/res/android>
<项目机器人:可绘制=< red_color>中机器人:state_activated =真/>
<项目机器人:可绘制=< green_color>中/>
< /选择>和code切换此状态
< your_image_view> .setOnClickListener(新View.OnClickListener(){
@覆盖
公共无效的onClick(视图v){
&所述; your_image_view> .setActivated(小于!your_image_view> .isActivated());
}
});
写自己的辨认类。你可以从其他人看到如何做到这一点:
<一个href=\"https://github.com/android-ia/platform_packages_apps_Contacts/blob/master/src/com/android/contacts/quickcontact/CheckableImageView.java\">Official从旧的联系人应用程序的Android 实施
公共类CheckableImageView扩展了ImageView的实现可勾选{
私人布尔mChecked; 私有静态最终诠释[] = CHECKED_STATE_SET {
android.R.attr.state_checked
}; 公共CheckableImageView(上下文的背景下,ATTRS的AttributeSet){
超(背景下,ATTRS);
} @覆盖
公众诠释[] onCreateDrawableState(INT extraSpace){
最终诠释[] drawableState = super.onCreateDrawableState(extraSpace + 1);
如果(器isChecked()){
mergeDrawableStates(drawableState,CHECKED_STATE_SET);
}
返回drawableState;
} 公共无效切换(){
setChecked(!mChecked);
} 公共布尔器isChecked(){
返回mChecked;
} 公共无效setChecked(布尔选中){
如果(mChecked!=选中){
mChecked =检查;
refreshDrawableState();
}
}
}
<一个href=\"https://github.com/ManuelPeinado/MultiChoiceAdapter/blob/master/library/src/com/manuelpeinado/multichoiceadapter/CheckableImageView.java\">Other在MultiChoiceAdapter 实施
与
OnCheckedChangeListener
实施和保存的状态,如复选框
类,也这是我见过的最好的实施公共类CheckableImageView扩展了ImageView的实现可勾选{ 私有静态最终诠释[] = checkedStateSet {android.R.attr.state_checked}; 私人布尔mChecked = FALSE;
私人OnCheckedChangeListener mOnCheckedChangeListener; 私人布尔mBroadcasting; 公共CheckableImageView(上下文的背景下){
超级(上下文);
} 公共CheckableImageView(上下文的背景下,ATTRS的AttributeSet){
超(背景下,ATTRS);
} 公共CheckableImageView(上下文的背景下,ATTRS的AttributeSet,诠释defStyle){
超(背景下,ATTRS,defStyle);
} @覆盖
公共布尔器isChecked(){
返回mChecked;
} @覆盖
公共布尔performClick(){
切换();
返回super.performClick();
} @覆盖
公共无效切换(){
setChecked(!mChecked);
} @覆盖
公众诠释[] onCreateDrawableState(INT extraSpace){
最终诠释[] drawableState = super.onCreateDrawableState(extraSpace + 1);
如果(器isChecked()){
mergeDrawableStates(drawableState,checkedStateSet);
}
返回drawableState;
} @覆盖
公共无效setChecked(布尔选中){
如果(mChecked!=选中){
mChecked =检查;
refreshDrawableState(); //避免无限递归,如果setChecked()从侦听器调用
如果(mBroadcasting){
返回;
} mBroadcasting = TRUE;
如果(mOnCheckedChangeListener!= NULL){
mOnCheckedChangeListener.onCheckedChanged(这一点,mChecked);
} mBroadcasting = FALSE;
}
} / **
*注册一个回调被调用时,这个按钮的选中状态
*变化。
*
* @参数监听回调上选中状态更改来电
* /
公共无效setOnCheckedChangeListener(OnCheckedChangeListener监听){
mOnCheckedChangeListener =侦听器;
} / **
当检查的状态被调用*回调接口定义
复合按钮*改变。
* /
公共静态界面OnCheckedChangeListener {
/ **
*当化合物按钮的选中状态改变时调用。
*
* @参数buttonView的复合按钮查看其状态已更改。
* @参数buttonView器isChecked的新的选中状态。
* /
无效onCheckedChanged(CheckableImageView buttonView,布尔器isChecked);
} 静态类SavedState扩展BaseSavedState {
布尔检查; / **
*构造从名为{@link CompoundButton的onSaveInstanceState#()}
* /
SavedState(Parcelable超级大国){
超(超状态);
} / **
*根据{@link #CREATOR}称为构造
* /
私人SavedState(包裹中){
超级(在);
检查=(布尔)in.readValue(NULL);
} @覆盖
公共无效writeToParcel(包裹出来,诠释标志){
super.writeToParcel(出,旗);
out.writeValue(选中);
} @覆盖
公共字符串的toString(){
返回CheckableImageView.SavedState {+ Integer.toHexString(System.identityHash code(本))+检查=+ +检查};
} 公共静态最终Parcelable.Creator&LT; SavedState&GT; CREATOR =新Parcelable.Creator&LT; SavedState&GT;(){
@覆盖
公共SavedState createFromParcel(包裹中){
返回新SavedState(中);
} @覆盖
公共SavedState [] newArray(INT大小){
返回新SavedState【尺寸】;
}
};
} @覆盖
公共Parcelable的onSaveInstanceState(){
Parcelable超级大国= super.onSaveInstanceState();
SavedState SS =新SavedState(覆);
ss.checked =器isChecked();
返回SS;
} @覆盖
公共无效onRestoreInstanceState(Parcelable状态){
SavedState SS =(SavedState)状态; super.onRestoreInstanceState(ss.getSuperState());
setChecked(ss.checked);
requestLayout();
}
}
这浮现在脑海中首先有很好的执行该选项。但你也可以拿出自己的版本,或使用简单的变量来保存状态和manualy切换喜欢的 @奇拉格 - Savsani 的说,但在这种情况下,你将不得不放弃使用<$ C的$ C>选择秒。
Android Studio 2.0 preview
Hello,
I have this selector that is connected to an
imageview
. I want to toggle theimageview
on and off. So off will display a green color and on will display a red color.However, when I click the
imageview
nothing happens. I have tried different combinations of state_pressed and state_checked. And now its getting too confusing. What am I missing here.<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="false" android:drawable="@drawable/bottom_left_border"/> <item android:state_checked="true" android:drawable="@drawable/bottom_left_border_pressed"> </item> </selector>
Many thanks for any suggestions,
解决方案However, when I click the imageview nothing happens.
So, as @Zielony said, the reason is simple:
ImageView
not supported checked states.Each class extended from
View
supports different states: pressed, selected, focused, checkable (note that is not checked state) etc. But checked is special state. And only fewView
s support it:ToggleButton
,Switch
,RadioButton
,CheckBox
,CheckedTextView
. They implementedCheckable
interface.You have variants how to solve your case, but it depends what exactly you need:
If you really want this simple thing
So off will display a green color and on will display a red color.
you can use
CheckBox
orCheckedTextView
for example. Just create selector:<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="<red_color>" android:state_checked="true" /> <item android:drawable="<green_color>" /> </selector>
and use it
<CheckBox android:layout_width="50dp" android:layout_height="50dp" android:text="" android:button="@null" android:clickable="true" android:background="<your_selector>"/>
Use other state. You can use
state_activated
(orstate_selected
but, be careful, because selected is transient property)<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="<red_color>" android:state_activated="true" /> <item android:drawable="<green_color>" /> </selector>
and toggle this state by code
<your_image_view>.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { <your_image_view>.setActivated(!<your_image_view>.isActivated()); } });
Write your own checkable class. You can see from other people how to do it:
Official android implementation from old Contacts application
public class CheckableImageView extends ImageView implements Checkable { private boolean mChecked; private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked }; public CheckableImageView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public int[] onCreateDrawableState(int extraSpace) { final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); if (isChecked()) { mergeDrawableStates(drawableState, CHECKED_STATE_SET); } return drawableState; } public void toggle() { setChecked(!mChecked); } public boolean isChecked() { return mChecked; } public void setChecked(boolean checked) { if (mChecked != checked) { mChecked = checked; refreshDrawableState(); } } }
Implementation with
OnCheckedChangeListener
and saved state, likeCheckBox
class and also this is the best implementation I've ever seenpublic class CheckableImageView extends ImageView implements Checkable { private static final int[] checkedStateSet = { android.R.attr.state_checked }; private boolean mChecked = false; private OnCheckedChangeListener mOnCheckedChangeListener; private boolean mBroadcasting; public CheckableImageView(Context context) { super(context); } public CheckableImageView(Context context, AttributeSet attrs) { super(context, attrs); } public CheckableImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean isChecked() { return mChecked; } @Override public boolean performClick() { toggle(); return super.performClick(); } @Override public void toggle() { setChecked(!mChecked); } @Override public int[] onCreateDrawableState(int extraSpace) { final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); if (isChecked()) { mergeDrawableStates(drawableState, checkedStateSet); } return drawableState; } @Override public void setChecked(boolean checked) { if (mChecked != checked) { mChecked = checked; refreshDrawableState(); // Avoid infinite recursions if setChecked() is called from a listener if (mBroadcasting) { return; } mBroadcasting = true; if (mOnCheckedChangeListener != null) { mOnCheckedChangeListener.onCheckedChanged(this, mChecked); } mBroadcasting = false; } } /** * Register a callback to be invoked when the checked state of this button * changes. * * @param listener the callback to call on checked state change */ public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { mOnCheckedChangeListener = listener; } /** * Interface definition for a callback to be invoked when the checked state * of a compound button changed. */ public static interface OnCheckedChangeListener { /** * Called when the checked state of a compound button has changed. * * @param buttonView The compound button view whose state has changed. * @param isChecked The new checked state of buttonView. */ void onCheckedChanged(CheckableImageView buttonView, boolean isChecked); } static class SavedState extends BaseSavedState { boolean checked; /** * Constructor called from {@link CompoundButton#onSaveInstanceState()} */ SavedState(Parcelable superState) { super(superState); } /** * Constructor called from {@link #CREATOR} */ private SavedState(Parcel in) { super(in); checked = (Boolean) in.readValue(null); } @Override public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeValue(checked); } @Override public String toString() { return "CheckableImageView.SavedState{" + Integer.toHexString(System.identityHashCode(this)) + " checked=" + checked + "}"; } public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() { @Override public SavedState createFromParcel(Parcel in) { return new SavedState(in); } @Override public SavedState[] newArray(int size) { return new SavedState[size]; } }; } @Override public Parcelable onSaveInstanceState() { Parcelable superState = super.onSaveInstanceState(); SavedState ss = new SavedState(superState); ss.checked = isChecked(); return ss; } @Override public void onRestoreInstanceState(Parcelable state) { SavedState ss = (SavedState) state; super.onRestoreInstanceState(ss.getSuperState()); setChecked(ss.checked); requestLayout(); } }
This options that come to mind firstly and have a good implementation. But you can also come up with your own versions, or use simple variables to save state and toggle manualy like @Chirag-Savsani said, but in that case you would have to abandon to use of
selector
s.这篇关于state_checked不ImageView的开启和关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!