使RelativeLayout可检查

时间:2012-08-02 10:34:30

标签: android android-layout android-drawable

我尝试使用CheckBoxRelativeLayout以及TextView(背景上有选择器)编写我自己的FrameLayout

setDuplicateParentStateEnabled(true) FrameLayout RelativeLayout表示父母可以检查状态,但为什么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(); } } 可以检查我不知道。

{{1}}

4 个答案:

答案 0 :(得分:8)

Holo中的多选列表似乎有两种UI模式(在ActionMode的上下文中):使用复选框或突出显示。

如果您只需要突出显示,则可以使用这种更简单的方法:

让你的列表项布局用于根这样的类:

public class CheckableRelativeLayout extends RelativeLayout implements Checkable {
private static final int[] STATE_CHECKABLE = {R.attr.state_pressed};
boolean checked = false;

public void setChecked(boolean checked) {
    this.checked = checked;
    refreshDrawableState();
}

public boolean isChecked() {
    return checked;
}

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

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

    return drawableState;
}
}

并确保列表项布局中的根元素使用

android:background="?android:attr/listChoiceBackgroundIndicator"

我知道这不是你问题的真正答案(你想要一个实际的复选框),但我没有在任何地方看到这个。

ListView使用Checkable接口来确定它是否可以依赖列表项元素来显示可检查状态,或者它是否应该尝试自己显示它。

答案 1 :(得分:5)

我只需要覆盖方法:

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

现在一切正常。

答案 2 :(得分:3)

Nik的答案部分适合我,你需要将 android.R.attr.state_checkable 添加到STATE_CHECKABLE数组中,并设置相应的lenth(2),否则它无法正常工作。< / p>

private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked, android.R.attr.state_checkable};

@Override
protected int[] onCreateDrawableState(int extraSpace)
{
    int[] result = super.onCreateDrawableState(extraSpace + CHECKED_STATE_SET.length);
    if(mChecked) mergeDrawableStates(result, CHECKED_STATE_SET);
    return result;
}

答案 3 :(得分:0)

http://developer.android.com/reference/android/view/View.html#setClickable%28boolean%29

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

public MyCheckbox(Context context, AttributeSet attrs)
{
    super(context, attrs);
    this.setClickable(true);
//......
}