将Android CheckBox设置为其他图像...然后返回原始图像

时间:2012-04-19 19:20:33

标签: android sdk checkbox imageview

我正在使用以下(非常常见的)代码来更改Android应用中的复选框图片。

    mCheck = (CheckBox) findViewById(R.id.chkMine);
    mCheck.setButtonDrawable(R.drawable.my_image);

我看到很多人要求这样做。但我从未见过第二部分:

How do I put BACK the original checkbox imagery, later in my code?

我犹豫是否尝试设计我自己的所有图像(已选中,未选中,幻影检查,幻影未选中等),因为我需要通常出现在许多不同版本的Android上的原始图像。

也许,最初使用(不存在的?)getButtonDrawable()调用保存默认图像,然后再重复使用?

我认为这将是第二次调用setButtonDrawable()以“撤消”我的更改。或者是吗?

感谢。

2 个答案:

答案 0 :(得分:3)

正如您已经正确提到的那样,遗憾的是,在替换之前,没有getButtonDrawable()来获取对使用的drawable的引用。显然,您可以将Android的资源复制到本地项目并使用它们重置CheckBox的按钮,但这意味着您必须考虑主题中的所有不同样式,更不用说任何更改设备制造商可能会对这些资源做出贡献沿着这条路走下去并不是不可能的,但你会发现听起来很简单的事情会非常麻烦。

您可能需要考虑的是执行以下操作:查询资源以获取所需的drawable的资源ID。这样你就不必明确地处理不同的主题,因为查找会这样做。您只需几行就可以轻松地将此功能放在专用方法中。例如:

private static int getDefaultCheckBoxButtonDrawableResourceId(Context context) {
    // pre-Honeycomb has a different way of setting the CheckBox button drawable
    if (Build.VERSION.SDK_INT <= 10) return Resources.getSystem().getIdentifier("btn_check", "drawable", "android");
    // starting with Honeycomb, retrieve the theme-based indicator as CheckBox button drawable
    TypedValue value = new TypedValue();
    context.getTheme().resolveAttribute(android.R.attr.listChoiceIndicatorMultiple, value, true);
    return value.resourceId;
}

下面是一个快速示例,将按钮设置为某个自定义图像,然后重置。每当检查状态发生变化时,我只是在应用程序图标和原始按钮之间切换。

CheckBox mCheckBox = (CheckBox) findViewById(R.id.checkbox);
mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override public void onCheckedChanged(CompoundButton button, boolean isChecked) {
        button.setButtonDrawable(isChecked ? R.drawable.icon : getDefaultCheckBoxButtonDrawableResourceId(StackOverflowActivity.this));
    }
});

答案 1 :(得分:0)

我认为要检索原始图像,setButtonDrawable()的调用应该再次起作用 但您可以参考android's original resource而不是您的资源。

mCheck = (CheckBox) findViewById(R.id.chkMine);
mCheck.setButtonDrawable(android.R.drawable.*);

您可能需要自己查找文件名:

platforms > android-* > data > res > drawable-*
(source: accepted answer)

修改
哈!我知道我之前看过那个网站:Android R Drawables ^^ v
(信用到Mef