2016-10-04 1 views
0

Я хочу использовать виджет в качестве CheckableImageButton на моем приложении, но этот код, состояние изображения не работает должным образом, когда я нажимаю на изображение, что состояние должно быть измененоAndroid обычая не CheckableImageButton работать currectly

всегда я получаю истинные после изменения состояния

public class CheckableImageButton extends ImageButton implements Checkable { 

    private boolean mChecked; 
    private boolean mBroadcasting; 
    private int mPersonality; 
    private OnCheckedChangeListener mOnCheckedChangeListener; 

    private static final int[] CHECKED_STATE_SET = { R.attr.is_checked }; 

    private static final int PERSONALITY_RADIO_BUTTON = 0; 
    private static final int PERSONALITY_CHECK_BOX = 1; 

    public CheckableImageButton(Context context) { 
     this(context, null); 
    } 

    public CheckableImageButton(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CheckableImageButton); 

     mPersonality = a.getInt(R.styleable.CheckableImageButton_personality, PERSONALITY_RADIO_BUTTON); 
     boolean checked = a.getBoolean(R.styleable.CheckableImageButton_is_checked, false); 
     setChecked(checked); 

     a.recycle(); 
    } 

    public void toggle() { 
     setChecked(!mChecked); 
    } 

    @Override 
    public boolean performClick() { 
     if (mPersonality == PERSONALITY_RADIO_BUTTON) { 
      setChecked(true); 
     } else if (mPersonality == PERSONALITY_CHECK_BOX) { 
      toggle(); 
     } 
     return super.performClick(); 
    } 

    public boolean isChecked() { 
     return mChecked; 
    } 

    /** 
    * <p> 
    * Changes the checked state of this button. 
    * </p> 
    * 
    * @param checked 
    *   true to check the button, false to uncheck it 
    */ 
    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. 
    */ 
    public static interface OnCheckedChangeListener { 
     /** 
     * Called when the checked state of a button has changed. 
     * 
     * @param button 
     *   The button view whose state has changed. 
     * @param isChecked 
     *   The new checked state of button. 
     */ 
     void onCheckedChanged(CheckableImageButton button, boolean isChecked); 
    } 

    @Override 
    public int[] onCreateDrawableState(int extraSpace) { 
     final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); 
     if (isChecked()) { 
      mergeDrawableStates(drawableState, CHECKED_STATE_SET); 
     } 
     return drawableState; 
    } 

    @Override 
    protected void drawableStateChanged() { 
     super.drawableStateChanged(); 
     invalidate(); 
    } 

    static class SavedState extends BaseSavedState { 
     boolean checked; 

     SavedState(Parcelable superState) { 
      super(superState); 
     } 

     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); 
     } 

     public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() { 
      public SavedState createFromParcel(Parcel in) { 
       return new SavedState(in); 
      } 

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

checkable_image_selector содержимое файла:

<?xml version="1.0" encoding="utf-8"?> 
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <corners 
     android:radius="4dp" /> 
    <padding 
     android:left="4dp" 
     android:right="4dp" 
     android:top="4dp" 
     android:bottom="4dp" /> 
    <gradient 
     android:angle="90" 
     android:startColor="#FFFFC700" 
     android:centerColor="#FFFFA600" 
     android:endColor="#FFFFC700" /> 
    <stroke 
     android:width="3dp" 
     android:color="#FF80B0E0" /> 
</shape> 

и checkable_image_button_state_pressed:

<?xml version="1.0" encoding="utf-8"?> 
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <corners 
     android:radius="4dp"/> 
    <padding 
     android:bottom="4dp" 
     android:left="4dp" 
     android:right="4dp" 
     android:top="4dp"/> 
    <solid 
     android:color="#00000000"/> 
    <stroke 
     android:width="3dp" 
     android:color="#FF80B0E0"/> 
</shape> 

, а затем я использовать это как с этим кодом:

checkable_image_1.setOnCheckedChangeListener(new CheckableImageButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CheckableImageButton button, boolean isChecked) { 
     Log.e("CHECK: ", isChecked + ""); 
     checkable_image_1.setChecked(false); 
    } 
}); 
checkable_image_1.setChecked(true); 

ответ

0
public class CheckableImageButton extends AppCompatImageButton implements Checkable { 

private static final int[] DRAWABLE_STATE_CHECKED = new int[]{android.R.attr.state_checked}; 

private boolean mChecked; 

public CheckableImageButton(Context context) { 
    this(context, null); 
} 

public CheckableImageButton(Context context, AttributeSet attrs) { 
    this(context, attrs, android.support.v7.appcompat.R.attr.imageButtonStyle); 
} 

public CheckableImageButton(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 

    ViewCompat.setAccessibilityDelegate(this, new AccessibilityDelegateCompat() { 
     @Override 
     public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) { 
      super.onInitializeAccessibilityEvent(host, event); 
      event.setChecked(isChecked()); 
     } 

     @Override 
     public void onInitializeAccessibilityNodeInfo(View host, 
       AccessibilityNodeInfoCompat info) { 
      super.onInitializeAccessibilityNodeInfo(host, info); 
      info.setCheckable(true); 
      info.setChecked(isChecked()); 
     } 
    }); 
} 

@Override 
public void setChecked(boolean checked) { 
    if (mChecked != checked) { 
     mChecked = checked; 
     refreshDrawableState(); 
     sendAccessibilityEvent(
       AccessibilityEventCompat.TYPE_WINDOW_CONTENT_CHANGED); 
    } 
} 

@Override 
public boolean isChecked() { 
    return mChecked; 
} 

@Override 
public void toggle() { 
    setChecked(!mChecked); 
} 

@Override 
public int[] onCreateDrawableState(int extraSpace) { 
    if (mChecked) { 
     return mergeDrawableStates(
       super.onCreateDrawableState(extraSpace + DRAWABLE_STATE_CHECKED.length), 
       DRAWABLE_STATE_CHECKED); 
    } else { 
     return super.onCreateDrawableState(extraSpace); 
    } 
} 

}

Смежные вопросы