gpt4 book ai didi

android - 使 RelativeLayout 可检查

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:29 26 4
gpt4 key购买 nike

我尝试使用 RelativeLayoutTextViewFrameLayout 编写我自己的 CheckBox(背景上有选择器)里面。

我为 FrameLayout 设置了 setDuplicateParentStateEnabled(true),它从父级获取可检查状态,但为什么让 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();
}
}

最佳答案

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 接口(interface)来确定它是否可以依赖列表项元素来显示可检查状态,或者是否应该尝试自己显示它。

关于android - 使 RelativeLayout 可检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11775710/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com