mirror of https://github.com/tasks/tasks
Fixed animations and placement of checkboxes by introducing a checkable image view (checkbox without text)
parent
a3b46dec31
commit
ea580ffe15
@ -0,0 +1,98 @@
|
|||||||
|
package com.todoroo.astrid.ui;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.view.ViewDebug;
|
||||||
|
import android.widget.Checkable;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
|
||||||
|
public class CheckableImageView extends ImageView implements Checkable {
|
||||||
|
|
||||||
|
private static final int[] CHECKED_STATE_SET = {
|
||||||
|
android.R.attr.state_checked
|
||||||
|
};
|
||||||
|
|
||||||
|
public CheckableImageView(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static interface OnCheckedChangeListener {
|
||||||
|
public void onCheckedChanged(Checkable c, boolean isChecked);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean performClick() {
|
||||||
|
toggle();
|
||||||
|
return super.performClick();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean mChecked;
|
||||||
|
private boolean mBroadcasting;
|
||||||
|
private OnCheckedChangeListener mOnCheckedChangeListener;
|
||||||
|
|
||||||
|
public void toggle() {
|
||||||
|
setChecked(!mChecked);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ViewDebug.ExportedProperty
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
@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();
|
||||||
|
|
||||||
|
if (getDrawable() != null) {
|
||||||
|
int[] myDrawableState = getDrawableState();
|
||||||
|
|
||||||
|
// Set the state of the Drawable
|
||||||
|
getDrawable().setState(myDrawableState);
|
||||||
|
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue