如何根据android中当前的应用程序主题(黑暗/光明主题)从字符串名称中获取可绘制资源id
我可以使用以下命令通过字符串名获取资源Id如何根据android中当前的应用程序主题(黑暗/光明主题)从字符串名称中获取可绘制资源id,android,kotlin,android-drawable,Android,Kotlin,Android Drawable,我可以使用以下命令通过字符串名获取资源Id fun resIdByName(): Int { return resources.getIdentifier("apple", "drawable", packageName) } 但问题是,我的应用程序支持暗/亮情绪,这种方法是用亮图像返回暗情绪,用暗图像返回亮情绪 我在网上搜索了很多,但发现了一种从名字中获取RE的方法,而不是如何根据主题来获取,所以不要认为这是一个重复的问题。 简短的回答:不要使
fun resIdByName(): Int {
return resources.getIdentifier("apple", "drawable", packageName)
}
但问题是,我的应用程序支持暗/亮情绪,这种方法是用亮图像返回暗情绪,用暗图像返回亮情绪
<>我在网上搜索了很多,但发现了一种从名字中获取RE的方法,而不是如何根据主题来获取,所以不要认为这是一个重复的问题。
简短的回答:不要使用SETIMAGRESURCE(int ID)。使用getResources().getDrawable(Int-id,Resources.Theme-Theme)获取主题化的drawable,并改用setImageDrawable(drawable-drawable)
说明:主题资源没有特定的id后缀/前缀;所有主题的ID都相同,以避免破坏应用程序。主题应该事先应用,允许所有主题敏感值被主题的版本替换。通常,可视上下文(活动)包含引用,但根据您尝试获取资源的方式/时间,您可能会获得一个具有不同主题的引用(例如,应用程序上下文将不具有主题引用),因此,自api 22以来,我们有了getDrawable(Int id,Resources.theme-theme)。这是你问题的根源。调用setImageDrawable(Int-res)时,imageView执行以下块:private void resolveUri() {
if (mDrawable != null) {
return;
}
if (getResources() == null) {
return;
}
Drawable d = null;
if (mResource != 0) {
try {
d = mContext.getDrawable(mResource);
} catch (Exception e) {
Log.w(LOG_TAG, "Unable to find resource: " + mResource, e);
// Don't try again.
mResource = 0;
}
} else if (mUri != null) {
d = getDrawableFromUri(mUri);
if (d == null) {
Log.w(LOG_TAG, "resolveUri failed on bad bitmap uri: " + mUri);
// Don't try again.
mUri = null;
}
} else {
return;
}
updateDrawable(d);
}
如您所见,它使用了不推荐使用的Context.getDrawable(Int-id)方法。因此,如果有主题引用,drawable最多只能与上下文中的主题引用相匹配。在您的小部件中,调用可能在其余更改发生之前发生。因此,指定所需的主题就可以了。之后如何加载资源?使用getDrawable(Int-id)或getDrawable(Int-id,Resources.Theme主题)?使用image.setImageResources(resIdByName())而不使用getDrawable