android - 响应选择器的自定义可检查 View

标签 android view custom-view

我有一组FrameLayout我希望它是可检查/可选择的,

也就是说,点击后我想要 FrameLayout显示为 checked - 再次按下时,我希望它变为 un checked .更重要的是,我希望通过使用 <selector> 来像往常一样描述这个视觉问题。 .

我似乎无法正常工作 - 我不确定我错过了什么:

public class CheckableFrameLayout extends FrameLayout implements Checkable {
    private boolean mChecked = false;
    public CheckableFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setChecked(boolean checked) {
        mChecked = checked;
        refreshDrawableState();
    }

    public boolean isChecked() {
        return mChecked;
    }

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

CheckableFrameLayout 的布局:

<com.test.view.CheckableFrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/selector_horizontal"
    android:clickable="true" >

支持它的选择器(selector_horizo​​ntal.xml):

<item android:drawable="@drawable/selector_vertical_selected" android:state_pressed="false" android:state_checked="true"/>  
<item android:drawable="@drawable/selector_vertical_pressed" android:state_pressed="true" android:state_checked="false"/>
<item android:drawable="@drawable/selector_vertical_normal" android:state_pressed="false" android:state_checked="false"/>

使用上面的代码,“state_pressed”工作正常,但 View 本身没有被检查(不是通过调试发现的 Checkable 代码被调用)。

最佳答案

将以下代码添加到 Checkable 类允许选择器工作:

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

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

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

关于android - 响应选择器的自定义可检查 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11293399/

相关文章:

xcode - 以编程方式快速切换 View

android - 在运行时从另一个应用程序获取自定义 View

ios - 自定义 View 不通过在 Storyboard中添加 UIView 来继承自定义类来显示

android - 设置多个 SharedPreferences 实例/文件的默认值

Android JobScheduling - 我需要将一个对象传递给我的工作,但如何传递?

ios - 根据限定符将变量设置为不同的自定义 View (Swift)

asp.net-mvc-3 - 强类型@User.Identity

Android 上的 Java NIO 性能

android - 绘制带圆角的正方形

c# - 替换为 Html.BeginForm()