1

我需要创建一个复杂的切换按钮(rtl 复选框)。

我知道LinearLayout是可以点击的,我看到了下面的例子

我只能通过 XML 来完成吗?

4

2 回答 2

1

LinearLayout 可以点击但不可检查。
为了获得 RTL 切换视图,我执行了以下操作:

  1. 我创建了一个九路径图像来按下、选中和默认状态。

  2. 创建了一个选择器:

<item android:drawable="@drawable/button1_on" android:state_pressed="true"/>
<item android:drawable="@drawable/button1_selected" android:state_checked="true"/>
<item android:drawable="@drawable/button1_off"/>

3.创建了一个扩展 Button 并实现 Checkable 的类:

public class MyCheckbox extends Button implements Checkable {

private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};
private boolean mIsChecked = false;

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

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

public MyCheckbox(Context context) {
    super(context);
}

@Override
public boolean isChecked() {
    return mIsChecked;
}

@Override
public void setChecked(boolean isChecked) {
    mIsChecked = isChecked;
}

@Override
public void toggle() {
    setChecked(!mIsChecked);
}

@Override
public boolean performClick() {
    toggle();
    return super.performClick();
}

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

}

以同样的方式,它可以在可点击的 LinearLayout 上实现

于 2013-03-25T19:21:55.783 回答
1

使用 rtl 语言环境时,应直接交换复选框和其他视图。如果您想确保您与 RTL 语言兼容,请使用 JellyBean 中包含的新“开始”和“结束”参数(marginStart 和 marginEnd 而不是 marginLeft/Right 和 marginRight/Left)。尽管如果您需要以前版本的这种行为,您可能需要其他技巧。请注意,TextView 已经完全移动到框的另一侧:确保在这种情况下不要使用大量 WRAP_CONTENT,这可能会导致错位。

于 2013-03-24T09:23:22.123 回答