让RelativeLayout的辨认 [英] Make RelativeLayout checkable
本文介绍了让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屋!
查看全文