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

开发人员预览android L中的常量状态不匹配,android,resources,imageview,equals,android-5.0-lollipop,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()) 如有任何帮助/提示或解释,将不胜感激 使用item.getContext().g

我试图在一个if语句中做一些事情,除了android L(在最新版本上测试)之外,它适用于所有版本的android(16或更高版本,因为getDrawable)。代码如下:

if (item.getIcon().getConstantState().equals(getResources().getDrawable(R.drawable.add_to_fav_normal).getConstantState())
如有任何帮助/提示或解释,将不胜感激

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

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

不过,一般来说,你不应该依赖这张支票。API无法保证您将从特定的drawable接收到什么样的常量状态。

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

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


不过,一般来说,你不应该依赖这张支票。没有API保证您将从特定的绘图设备接收到什么样的常量状态。

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

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()));
}

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

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()));
}

根据@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:)

根据@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:)

还有?我在这里没有看到任何问号?我的问题是:为什么?如何修复?替代方案?以及?我在这里没有看到任何问号?我的问题是:为什么?如何修复?备选方案?感谢您的明确解释:“没有API保证您将从一个特定的可绘制图形接收到什么样的常量状态。”-这对于以前的API(我知道)来说还不是问题,但我已经重写了代码,这样就不必再进行这种特殊的检查。您在哪里读到的“没有API保证您将从一个特定的可绘制图形中获得什么样的常量状态”?我还没有找到支持它的文档,尽管它与以前的API有明显的不同。我是拥有API的框架工程师。一般来说,如果它不是一个显式的公共API或文档化的行为(或由CTS测试)那么,它不能保证在不同的版本中,甚至在不同设备的单个版本中都是相同的。只需稍加编辑:item.getIcon().getConstantState().equals(getDrawable(R.drawable.ic_menu_gallery)。getConstantState());感谢您的清晰解释:没有API保证您将从特定的可绘制图形接收到什么样的常量状态。“-这对于以前的API(我知道)来说还不是问题,但我已经重写了代码,因此不再需要进行这种特殊检查。您在哪里读到的?”没有API保证您将从一个特定的可绘制文件中获得什么样的恒定状态?我还没有找到支持它的文档,尽管它与以前的APIs完全不同。我是拥有API的框架工程师。一般来说,如果它不是一个显式的公共API或文档化的行为(或由CTS测试)然后,它不能保证在不同的版本中是相同的,甚至在不同设备的单个版本中也是一样的。只需稍加编辑,它就可以正常工作:item.getIcon().getConstantState().equals(getDrawable(R.drawable.ic_menu_gallery).getConstantState());