FileDocCategorySizeDatePackage
CheckedTextView.javaAPI DocAndroid 5.1 API14886Thu Mar 12 22:22:10 GMT 2015android.widget

CheckedTextView

public class CheckedTextView extends TextView implements Checkable
An extension to TextView that supports the {@link android.widget.Checkable} interface. This is useful when used in a {@link android.widget.ListView ListView} where the it's {@link android.widget.ListView#setChoiceMode(int) setChoiceMode} has been set to something other than {@link android.widget.ListView#CHOICE_MODE_NONE CHOICE_MODE_NONE}.
attr
ref android.R.styleable#CheckedTextView_checked
attr
ref android.R.styleable#CheckedTextView_checkMark

Fields Summary
private boolean
mChecked
private int
mCheckMarkResource
private android.graphics.drawable.Drawable
mCheckMarkDrawable
private android.content.res.ColorStateList
mCheckMarkTintList
private PorterDuff.Mode
mCheckMarkTintMode
private boolean
mHasCheckMarkTint
private boolean
mHasCheckMarkTintMode
private int
mBasePadding
private int
mCheckMarkWidth
private int
mCheckMarkGravity
private boolean
mNeedRequestlayout
private static final int[]
CHECKED_STATE_SET
Constructors Summary
public CheckedTextView(android.content.Context context)


       
        this(context, null);
    
public CheckedTextView(android.content.Context context, android.util.AttributeSet attrs)

        this(context, attrs, R.attr.checkedTextViewStyle);
    
public CheckedTextView(android.content.Context context, android.util.AttributeSet attrs, int defStyleAttr)

        this(context, attrs, defStyleAttr, 0);
    
public CheckedTextView(android.content.Context context, android.util.AttributeSet attrs, int defStyleAttr, int defStyleRes)

        super(context, attrs, defStyleAttr, defStyleRes);

        final TypedArray a = context.obtainStyledAttributes(
                attrs, R.styleable.CheckedTextView, defStyleAttr, defStyleRes);

        final Drawable d = a.getDrawable(R.styleable.CheckedTextView_checkMark);
        if (d != null) {
            setCheckMarkDrawable(d);
        }

        if (a.hasValue(R.styleable.CheckedTextView_checkMarkTintMode)) {
            mCheckMarkTintMode = Drawable.parseTintMode(a.getInt(
                    R.styleable.CheckedTextView_checkMarkTintMode, -1), mCheckMarkTintMode);
            mHasCheckMarkTintMode = true;
        }

        if (a.hasValue(R.styleable.CheckedTextView_checkMarkTint)) {
            mCheckMarkTintList = a.getColorStateList(R.styleable.CheckedTextView_checkMarkTint);
            mHasCheckMarkTint = true;
        }

        mCheckMarkGravity = a.getInt(R.styleable.CheckedTextView_checkMarkGravity, Gravity.END);

        final boolean checked = a.getBoolean(R.styleable.CheckedTextView_checked, false);
        setChecked(checked);

        a.recycle();

        applyCheckMarkTint();
    
Methods Summary
private voidapplyCheckMarkTint()

        if (mCheckMarkDrawable != null && (mHasCheckMarkTint || mHasCheckMarkTintMode)) {
            mCheckMarkDrawable = mCheckMarkDrawable.mutate();

            if (mHasCheckMarkTint) {
                mCheckMarkDrawable.setTintList(mCheckMarkTintList);
            }

            if (mHasCheckMarkTintMode) {
                mCheckMarkDrawable.setTintMode(mCheckMarkTintMode);
            }

            // The drawable (or one of its children) may not have been
            // stateful before applying the tint, so let's try again.
            if (mCheckMarkDrawable.isStateful()) {
                mCheckMarkDrawable.setState(getDrawableState());
            }
        }
    
public voiddrawableHotspotChanged(float x, float y)

        super.drawableHotspotChanged(x, y);

        if (mCheckMarkDrawable != null) {
            mCheckMarkDrawable.setHotspot(x, y);
        }
    
protected voiddrawableStateChanged()

        super.drawableStateChanged();
        
        if (mCheckMarkDrawable != null) {
            int[] myDrawableState = getDrawableState();
            
            // Set the state of the Drawable
            mCheckMarkDrawable.setState(myDrawableState);
            
            invalidate();
        }
    
public android.graphics.drawable.DrawablegetCheckMarkDrawable()
Gets the checkmark drawable

return
The drawable use to represent the checkmark, if any.
see
#setCheckMarkDrawable(Drawable)
see
#setCheckMarkDrawable(int)
attr
ref android.R.styleable#CheckedTextView_checkMark

        return mCheckMarkDrawable;
    
public android.content.res.ColorStateListgetCheckMarkTintList()
Returns the tint applied to the check mark drawable, if specified.

return
the tint applied to the check mark drawable
attr
ref android.R.styleable#CheckedTextView_checkMarkTint
see
#setCheckMarkTintList(ColorStateList)

        return mCheckMarkTintList;
    
public PorterDuff.ModegetCheckMarkTintMode()
Returns the blending mode used to apply the tint to the check mark drawable, if specified.

return
the blending mode used to apply the tint to the check mark drawable
attr
ref android.R.styleable#CheckedTextView_checkMarkTintMode
see
#setCheckMarkTintMode(PorterDuff.Mode)

        return mCheckMarkTintMode;
    
protected voidinternalSetPadding(int left, int top, int right, int bottom)

hide

        super.internalSetPadding(left, top, right, bottom);
        setBasePadding(isCheckMarkAtStart());
    
private booleanisCheckMarkAtStart()

        final int gravity = Gravity.getAbsoluteGravity(mCheckMarkGravity, getLayoutDirection());
        final int hgrav = gravity & Gravity.HORIZONTAL_GRAVITY_MASK;
        return hgrav == Gravity.LEFT;
    
public booleanisChecked()

        return mChecked;
    
public voidjumpDrawablesToCurrentState()

        super.jumpDrawablesToCurrentState();

        if (mCheckMarkDrawable != null) {
            mCheckMarkDrawable.jumpToCurrentState();
        }
    
protected int[]onCreateDrawableState(int extraSpace)

        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked()) {
            mergeDrawableStates(drawableState, CHECKED_STATE_SET);
        }
        return drawableState;
    
protected voidonDraw(android.graphics.Canvas canvas)

        super.onDraw(canvas);

        final Drawable checkMarkDrawable = mCheckMarkDrawable;
        if (checkMarkDrawable != null) {
            final int verticalGravity = getGravity() & Gravity.VERTICAL_GRAVITY_MASK;
            final int height = checkMarkDrawable.getIntrinsicHeight();

            int y = 0;

            switch (verticalGravity) {
                case Gravity.BOTTOM:
                    y = getHeight() - height;
                    break;
                case Gravity.CENTER_VERTICAL:
                    y = (getHeight() - height) / 2;
                    break;
            }
            
            final boolean checkMarkAtStart = isCheckMarkAtStart();
            final int width = getWidth();
            final int top = y;
            final int bottom = top + height;
            final int left;
            final int right;
            if (checkMarkAtStart) {
                left = mBasePadding;
                right = left + mCheckMarkWidth;
            } else {
                right = width - mBasePadding;
                left = right - mCheckMarkWidth;
            }
            checkMarkDrawable.setBounds(mScrollX + left, top, mScrollX + right, bottom);
            checkMarkDrawable.draw(canvas);

            final Drawable background = getBackground();
            if (background != null) {
                background.setHotspotBounds(mScrollX + left, top, mScrollX + right, bottom);
            }
        }
    
public voidonInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent event)

        super.onInitializeAccessibilityEvent(event);
        event.setClassName(CheckedTextView.class.getName());
        event.setChecked(mChecked);
    
public voidonInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo info)

        super.onInitializeAccessibilityNodeInfo(info);
        info.setClassName(CheckedTextView.class.getName());
        info.setCheckable(true);
        info.setChecked(mChecked);
    
public voidonRtlPropertiesChanged(int layoutDirection)

        super.onRtlPropertiesChanged(layoutDirection);
        updatePadding();
    
private voidsetBasePadding(boolean checkmarkAtStart)

        if (checkmarkAtStart) {
            mBasePadding = mPaddingLeft;
        } else {
            mBasePadding = mPaddingRight;
        }
    
public voidsetCheckMarkDrawable(int resid)
Set the checkmark to a given Drawable, identified by its resourece id. This will be drawn when {@link #isChecked()} is true.

param
resid The Drawable to use for the checkmark.
see
#setCheckMarkDrawable(Drawable)
see
#getCheckMarkDrawable()
attr
ref android.R.styleable#CheckedTextView_checkMark

        if (resid != 0 && resid == mCheckMarkResource) {
            return;
        }

        mCheckMarkResource = resid;

        Drawable d = null;
        if (mCheckMarkResource != 0) {
            d = getContext().getDrawable(mCheckMarkResource);
        }
        setCheckMarkDrawable(d);
    
public voidsetCheckMarkDrawable(android.graphics.drawable.Drawable d)
Set the checkmark to a given Drawable. This will be drawn when {@link #isChecked()} is true.

param
d The Drawable to use for the checkmark.
see
#setCheckMarkDrawable(int)
see
#getCheckMarkDrawable()
attr
ref android.R.styleable#CheckedTextView_checkMark

        if (mCheckMarkDrawable != null) {
            mCheckMarkDrawable.setCallback(null);
            unscheduleDrawable(mCheckMarkDrawable);
        }
        mNeedRequestlayout = (d != mCheckMarkDrawable);
        if (d != null) {
            d.setCallback(this);
            d.setVisible(getVisibility() == VISIBLE, false);
            d.setState(CHECKED_STATE_SET);
            setMinHeight(d.getIntrinsicHeight());

            mCheckMarkWidth = d.getIntrinsicWidth();
            d.setState(getDrawableState());
            applyCheckMarkTint();
        } else {
            mCheckMarkWidth = 0;
        }
        mCheckMarkDrawable = d;

        // Do padding resolution. This will call internalSetPadding() and do a
        // requestLayout() if needed.
        resolvePadding();
    
public voidsetCheckMarkTintList(android.content.res.ColorStateList tint)
Applies a tint to the check mark drawable. Does not modify the current tint mode, which is {@link PorterDuff.Mode#SRC_IN} by default.

Subsequent calls to {@link #setCheckMarkDrawable(Drawable)} will automatically mutate the drawable and apply the specified tint and tint mode using {@link Drawable#setTintList(ColorStateList)}.

param
tint the tint to apply, may be {@code null} to clear tint
attr
ref android.R.styleable#CheckedTextView_checkMarkTint
see
#getCheckMarkTintList()
see
Drawable#setTintList(ColorStateList)

        mCheckMarkTintList = tint;
        mHasCheckMarkTint = true;

        applyCheckMarkTint();
    
public voidsetCheckMarkTintMode(PorterDuff.Mode tintMode)
Specifies the blending mode used to apply the tint specified by {@link #setCheckMarkTintList(ColorStateList)} to the check mark drawable. The default mode is {@link PorterDuff.Mode#SRC_IN}.

param
tintMode the blending mode used to apply the tint, may be {@code null} to clear tint
attr
ref android.R.styleable#CheckedTextView_checkMarkTintMode
see
#setCheckMarkTintList(ColorStateList)
see
Drawable#setTintMode(PorterDuff.Mode)

        mCheckMarkTintMode = tintMode;
        mHasCheckMarkTintMode = true;

        applyCheckMarkTint();
    
public voidsetChecked(boolean checked)

Changes the checked state of this text view.

param
checked true to check the text, false to uncheck it

        if (mChecked != checked) {
            mChecked = checked;
            refreshDrawableState();
            notifyViewAccessibilityStateChangedIfNeeded(
                    AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED);
        }
    
public voidsetVisibility(int visibility)

        super.setVisibility(visibility);

        if (mCheckMarkDrawable != null) {
            mCheckMarkDrawable.setVisible(visibility == VISIBLE, false);
        }
    
public voidtoggle()

        setChecked(!mChecked);
    
private voidupdatePadding()

        resetPaddingToInitialValues();
        int newPadding = (mCheckMarkDrawable != null) ?
                mCheckMarkWidth + mBasePadding : mBasePadding;
        if (isCheckMarkAtStart()) {
            mNeedRequestlayout |= (mPaddingLeft != newPadding);
            mPaddingLeft = newPadding;
        } else {
            mNeedRequestlayout |= (mPaddingRight != newPadding);
            mPaddingRight = newPadding;
        }
        if (mNeedRequestlayout) {
            requestLayout();
            mNeedRequestlayout = false;
        }
    
protected booleanverifyDrawable(android.graphics.drawable.Drawable who)

        return who == mCheckMarkDrawable || super.verifyDrawable(who);