常量状态在开发人员预览android L中不匹配

时间:2014-11-05 11:53:50

标签: android resources imageview equals android-5.0-lollipop

我正在尝试在if语句中执行某些操作,这适用于除Android L(最新测试)之外的每个版本的android(16或更高版本,因为getDrawable)。代码如下:

if (item.getIcon().getConstantState().equals(getResources().getDrawable(R.drawable.add_to_fav_normal).getConstantState())

任何帮助/提示或解释都将不胜感激!

3 个答案:

答案 0 :(得分:6)

使用item.getContext().getDrawable(int)或等效的ContextCompat方法。

从API 21开始,所有加载drawable的框架小部件都使用Context.getDrawable(),它在通胀期间应用上下文的当前主题。这基本上只是在内部调用getResources().getDrawable(..., getTheme()),因此您也可以使用context.getResources().getDrawable(..., context.getTheme())

     if (item.getIcon().getConstantState().equals(item.getContext()
                .getDrawable(R.drawable.add_to_fav_normal).getConstantState())

但一般而言,您不应该依赖此检查。对于从特定drawable中获得的常量状态,没有API保证。

答案 1 :(得分:0)

此解决方案仅适用于测试:

public static void assertEqualDrawables(Drawable drawableA, Drawable drawableB) {
    Bitmap bitmap1 = ((BitmapDrawable) drawableA).getBitmap();
    Bitmap bitmap2 = ((BitmapDrawable) drawableB).getBitmap();
    ByteBuffer buffer1 = ByteBuffer.allocate(bitmap1.getHeight() * bitmap1.getRowBytes());
    bitmap1.copyPixelsToBuffer(buffer1);

    ByteBuffer buffer2 = ByteBuffer.allocate(bitmap2.getHeight() * bitmap2.getRowBytes());
    bitmap2.copyPixelsToBuffer(buffer2);

    Assert.assertTrue(Arrays.equals(buffer1.array(), buffer2.array()));
}

答案 2 :(得分:0)

根据@ alanv的回答,以下是我的所作所为并取得了成功:

if (imgClicked.getDrawable().getConstantState()
                    .equals(ContextCompat.getDrawable(this,
                            R.drawable.add_profile).getConstantState())) {

     //Both images are same

}else{

    //Both images are NOT same      

}

感谢@alanv:)