我有一个项目,其中包含许多可绘制对象,它们以“a”或“b”开头(例如a1_back,a2_back,b1_start,b2_start等)。这些可绘制对象未在代码中使用,但在以下代码中使用:
String name = image.getName();//getName() returns for examle "a1_back"
res = getResources().getIdentifier(name, "drawable", getPackageName());
因此,在代码中的任何地方都没有使用特定的字符串“a1_back”。这就是为什么当我设置“rinkResources true ”时,我所有以“a”和“b”开头的可绘制对象都被删除了的原因。
我读到您可以使用以下xml文件指定要保留哪些资源:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/l_used_c"
tools:discard="@layout/unused2" />
但是我有很多绘制对象的方法,并且不想单独指定每一个。有没有办法在“tools:keep”中设置模式(使所有可绘制对象以“a”或“b”开头),或者使它将所有可绘制对象保留在项目中,而删除其他未使用的资源?
提前致谢! :)
最佳答案
您可以使用一种解决方法。为要保留的所有可绘制对象添加前缀
@Nullable
private Drawable getDrawableByName(@NonNull final Context context, @NonNull final String name) {
final String prefixName = String.format("prefix_%s", name);
return getDrawable(context, prefixName);
}
@Nullable
protected Drawable getDrawable(@NonNull final Context context, @NonNull final String name) {
final Resources resources = context.getResources();
final int resourceId = resources.getIdentifier(name, "drawable", context.getPackageName());
try {
return resources.getDrawable(resourceId, context.getTheme());
} catch (final Resources.NotFoundException exception) {
return null;
}
}
这里的把戏
final String prefixName = String.format("prefix_%s", name);
资源缩减机制分析说,所有带有“prefix_”的可绘制对象都可以使用,并且不会触及这些文件。