让RelativeLayout的辨认 [英] Make RelativeLayout checkable

查看:133
本文介绍了让RelativeLayout的辨认的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试写我自己的复选框使用 RelativeLayout的的TextView 的FrameLayout (与选择的背景)里面。

我有 setDuplicateParentStateEnabled(真)的FrameLayout ,它需要辨认身份的父母,但为什么让 RelativeLayout的可检查的,我不知道。

 公共类MyCheckbox扩展RelativeLayout的实现OnClickListener,可检查
{
私有静态最终诠释ID_CHECKBOX = -1234411;
私有静态最终诠释ID_TEXTVIEW = -1234412;
私有静态最终诠释ID_PARENT = -1234413;

私人的TextView TextView的;
私人的FrameLayout复选框;
私人布尔器isChecked;

公共MyCheckbox(上下文的背景下)
{
    这(背景下,NULL);
}

公共MyCheckbox(上下文的背景下,ATTRS的AttributeSet)
{
    超(背景下,ATTRS);

    的LayoutParams LP;

    SETID(ID_PARENT);
    setOnClickListener(本);

    //复选框
    复选框=新的FrameLayout(上下文);
    checkBox.setId(ID_CHECKBOX);
    checkBox.setDuplicateParentStateEnabled(真正的);

    //的TextView
    TextView的=新的TextView(上下文);
    textView.setId(ID_TEXTVIEW);
    textView.setOnClickListener(本);


    布尔checkboxToRight = FALSE;

    TypedArray A = context.obtainStyledAttributes(ATTRS,R.styleable.MaptrixCheckbox);

    的for(int i = 0; I< a.getIndexCount();我++)
    {
        INT ATTR = a.getIndex(ⅰ);
        开关(ATTR)
        {
            案例R.styleable.MyCheckbox_checkboxToRight:
                checkboxToRight = a.getBoolean(ATTR,假);
                打破;

            案例R.styleable.MyCheckbox_checkMark:
                checkBox.setBackgroundDrawable(a.getDrawable(attr)使用);
                打破;

            案例R.styleable.MyCheckbox_text:
                textView.setText(a.getText(attr)使用);
                打破;
        }
    }
    a.recycle();

    如果(checkboxToRight)
    {
        LP =新的LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
        lp.addRule(ALIGN_PARENT_RIGHT);
        lp.addRule(CENTER_VERTICAL);
        lp.setMargins(边距,0,利润率,0);
        addView(复选框,LP);

        LP =新的LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
        lp.addRule(CENTER_VERTICAL);
        lp.addRule(LEFT_OF,ID_CHECKBOX);
        addView(TextView的,LP);
    }
    其他
    {
        LP =新的LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
        lp.addRule(CENTER_VERTICAL);
        lp.setMargins(边距,0,利润率,0);
        addView(复选框,LP);

        LP =新的LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
        lp.addRule(CENTER_VERTICAL);
        lp.addRule(RIGHT_OF,ID_CHECKBOX);
        addView(TextView的,LP);
    }

    refreshDrawableState();
}

@覆盖
公共无效的onClick(视图v)
{
    INT的id = v.getId();

    如果(ID == ID_PARENT || ID == ID_TEXTVIEW)切换();
}

公共布尔器isChecked()
{
    返回器isChecked;
}

公共无效setChecked(布尔chacked)
{
    =器isChecked chacked;
    refreshDrawableState();
}

@覆盖
公共无效切换()
{
    =器isChecked器isChecked!;
    refreshDrawableState();
}
}
 

解决方案

我只需要重写方法:

 私有静态最终诠释[] STATE_CHECKABLE = {android.R.attr.state_checked};

@覆盖
保护INT [] onCreateDrawableState(INT extraSpace)
{
    INT [] drawableState = super.onCreateDrawableState(extraSpace + 1);
    如果(器isChecked)mergeDrawableStates(drawableState,STATE_CHECKABLE);
    返回drawableState;
}
 

现在所有的作品。

I try to write my own CheckBox using RelativeLayout with TextView and FrameLayout (with selector on background) inside.

I have setDuplicateParentStateEnabled(true) for FrameLayout that it take checkable status from parent, but why make RelativeLayout checkable I don't know.

public class MyCheckbox extends RelativeLayout implements OnClickListener, Checkable
{
private static final int ID_CHECKBOX = -1234411;
private static final int ID_TEXTVIEW = -1234412;
private static final int ID_PARENT = -1234413;

private TextView textView;
private FrameLayout checkBox;
private boolean isChecked;

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

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

    LayoutParams lp;

    setId(ID_PARENT);
    setOnClickListener(this);

    // checkBox
    checkBox = new FrameLayout(context);
    checkBox.setId(ID_CHECKBOX);
    checkBox.setDuplicateParentStateEnabled(true);

    // textView
    textView = new TextView(context);
    textView.setId(ID_TEXTVIEW);
    textView.setOnClickListener(this);


    boolean checkboxToRight = false;

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

    for (int i = 0; i < a.getIndexCount(); i++)
    {
        int attr = a.getIndex(i);
        switch (attr)
        {
            case R.styleable.MyCheckbox_checkboxToRight:
                checkboxToRight = a.getBoolean(attr, false);
                break;

            case R.styleable.MyCheckbox_checkMark:
                checkBox.setBackgroundDrawable(a.getDrawable(attr));
                break;

            case R.styleable.MyCheckbox_text:
                textView.setText(a.getText(attr));
                break;
        }
    }
    a.recycle();

    if (checkboxToRight)
    {
        lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        lp.addRule(ALIGN_PARENT_RIGHT);
        lp.addRule(CENTER_VERTICAL);
        lp.setMargins(margins, 0, margins, 0);
        addView(checkBox, lp);

        lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        lp.addRule(CENTER_VERTICAL);
        lp.addRule(LEFT_OF, ID_CHECKBOX);
        addView(textView, lp);
    }
    else
    {
        lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        lp.addRule(CENTER_VERTICAL);
        lp.setMargins(margins, 0, margins, 0);
        addView(checkBox, lp);

        lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        lp.addRule(CENTER_VERTICAL);
        lp.addRule(RIGHT_OF, ID_CHECKBOX);
        addView(textView, lp);
    }

    refreshDrawableState();
}

@Override
public void onClick(View v)
{
    int id = v.getId();

    if (id == ID_PARENT || id == ID_TEXTVIEW) toggle();
}

public boolean isChecked()
{
    return isChecked;
}

public void setChecked(boolean chacked)
{
    isChecked = chacked;
    refreshDrawableState();
}

@Override
public void toggle()
{
    isChecked = !isChecked;
    refreshDrawableState();
}
}

解决方案

I just need override method:

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

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

Now all works.

这篇关于让RelativeLayout的辨认的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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