state_checked不ImageView的开启和关闭 [英] state_checked doesn't toggle imageview on and off

查看:119
本文介绍了state_checked不ImageView的开启和关闭的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Android的工作室2.0 preVIEW

您好,

我有这个选择器,连接到的ImageView 。我想切换的ImageView 打开和关闭。因此,关闭会显示一个绿色的颜色和显示红色。

然而,当我点击的ImageView 没有任何反应。我曾尝试pssed和state_checked STATE_ $ P $的不同组合。而现在它变得太混乱。缺少什么我在这里。

 <?XML版本=1.0编码=UTF-8&GT?;
<选择的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android>
    <项目的android:state_checked =假
          机器人:可绘制=@绘制/ bottom_left_border/>    <项目的android:state_checked =真
          机器人:可绘制=@绘制/ bottom_left_border_ pressed>
    < /项目>
< /选择>

非常感谢您的任何建议,


解决方案

  

然而,当我点击ImageView的什么也没有发生。


所以,作为的 @Zielony 的说,原因很简单:的检查的状态的ImageView 不支持

查看扩展每个类支持不同的状态: pressed 选择重点可检查的(注意,不是的检查的状态)等,但的检查的特殊状态。而且,只有少数查看的支持它:切换按钮切换单选复选框 CheckedTextView 。他们实施可勾选接口。

您也有变种如何解决你的情况,但是这取决于你需要什么:


  1. 如果你真的想这样简单的事情。


      

    所以关闭会显示一个绿色的颜色和显示红色。


    您可以使用复选框 CheckedTextView 作为例子。只要创建选择:

     <选择的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android>
        <项目机器人:可绘制=< red_color>中机器人:state_checked =真/>
        <项目机器人:可绘制=< green_color>中/>
    < /选择>

    和使用

     <复选框
        机器人:layout_width =50dp
        机器人:layout_height =50dp
        机器人:文字=
        机器人:按钮=@空
        机器人:可点击=真
        机器人:背景=< your_selector>/>


  2. 使用另一种状态。您可以使用 state_activated (或 state_selected ,但要小心,因为选择的是短暂的财产)

     <选择的xmlns:机器人=htt​​p://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());
        }
    });


  3. 写自己的辨认类。你可以从其他人看到如何做到这一点:


    1. <一个href=\"https://github.com/android-ia/platform_packages_apps_Contacts/blob/master/src/com/android/contacts/quickcontact/CheckableImageView.java\">Official从旧的联系人应用程序的Andr​​oid 实施

       公共类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();
              }
          }
      }


    2. <一个href=\"https://github.com/ManuelPeinado/MultiChoiceAdapter/blob/master/library/src/com/manuelpeinado/multichoiceadapter/CheckableImageView.java\">Other在MultiChoiceAdapter 实施


    3. 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 the imageview 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 few Views support it: ToggleButton, Switch, RadioButton, CheckBox, CheckedTextView. They implemented Checkable interface.

You have variants how to solve your case, but it depends what exactly you need:

  1. 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 or CheckedTextView 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>"/>
    

  2. Use other state. You can use state_activated (or state_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());
        }
    });
    

  3. Write your own checkable class. You can see from other people how to do it:

    1. 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();
              }
          }
      }
      

    2. Other implementation in MultiChoiceAdapter

    3. Implementation with OnCheckedChangeListener and saved state, like CheckBox class and also this is the best implementation I've ever seen

      public 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 selectors.

这篇关于state_checked不ImageView的开启和关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆