我正在尝试使用ImageButton
来显示资源,.png
作为可单击按钮。当我在调试中运行我的应用程序时,ImageButton
会正确获取图像。
但是,当我在发布模式下运行应用程序时,ImageButton
不会显示可绘制对象:
我以编程方式创建并填充我的ImageButton
:
private void setupButtons() {
FlexboxLayout layout = view.findViewById(R.id.telcosLayout);
final Activity activity = getActivity();
// Telcom is an enum
for (final Telcom t : Telcom.values()) {
ImageButton b = new ImageButton(activity);
int id = getId(t.toString().toLowerCase().replace(" ", "_") + "_logo", R.drawable.class);
Log.i(TAG, "id is " + id);
b.setImageResource(id);
layout.addView(b);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
scanButtonListener.onShowScanButton(t);
}
});
}
}
在发布模式下运行时,我的日志的输出为:
2019-10-13 11:07:49.500 25757-25757/? I/select telcome: id is 2131165284
2019-10-13 11:07:49.501 25757-25757/? I/select telcome: id is 2131165320
以下是在调试模式下运行应用程序的日志:
2019-10-13 11:12:22.575 26146-26146/com.glan.input I/select telcome: id is 2131165284
2019-10-13 11:12:22.583 26146-26146/com.glan.input I/select telcome: id is 2131165320
似乎在两种模式下都可以找到相同的可绘制对象,但是由于某些原因它们不会在发布模式下显示。发生了什么事?
我已经验证了从drawable-ldpi
到drawable-xxxhdpi
的所有屏幕密度都存在可绘制对象。
我还发现,如果我根据日志行对b.setImageResource(2131165284);
进行硬编码,则ImageButton
会在调试和释放模式下为两个按钮显示相同的图像,这是预期的行为。
为什么动态设置资源在发布模式下不起作用?
编辑:好的,我想我发现了问题。我的发布构建模式具有以下属性:
release {
minifyEnabled true
shrinkResources true
debuggable true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
signingConfig = signingConfigs.release
}
当我禁用shrinkResources
时,通过注释掉它,图像再次出现。似乎基于"minifyEnabled" vs "shrinkResources" - what's the difference? and how to get the saved space?,ProGuard检测到我依赖的资源.png
可绘制对象未使用,因为它们是动态请求的,因此shrinkResources
会完全删除它们。
有人知道如何解决这个问题吗?
答案 0 :(得分:0)
好的,我找到了答案。对我有用的解决方案是使用https://developer.android.com/studio/write/tool-attributes#toolskeep中的tools:keep
,即使将shrinkResources
设置为true
,也有目的地保留这些资源。
答案 1 :(得分:0)
您是否检查过由于图像占用太多资源而发生的情况?图片文件有多大?它与按钮的尺寸相同吗?
Android不允许处于发布模式的应用占用太多资源。我建议您使用Picasso之类的库在ImageButton上设置图像资源。毕加索将处理屏幕和按钮本身的资源大小调整。
它也很容易使用。
Picasso.get()。load(R.drawable.your_image_resource).into(yourImageButton);