开发人员预览android L中的常量状态不匹配
我试图在一个if语句中做一些事情,除了android L(在最新版本上测试)之外,它适用于所有版本的android(16或更高版本,因为getDrawable)。代码如下:开发人员预览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 (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());