Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据android中当前的应用程序主题(黑暗/光明主题)从字符串名称中获取可绘制资源id_Android_Kotlin_Android Drawable - Fatal编程技术网

如何根据android中当前的应用程序主题(黑暗/光明主题)从字符串名称中获取可绘制资源id

如何根据android中当前的应用程序主题(黑暗/光明主题)从字符串名称中获取可绘制资源id,android,kotlin,android-drawable,Android,Kotlin,Android Drawable,我可以使用以下命令通过字符串名获取资源Id fun resIdByName(): Int { return resources.getIdentifier("apple", "drawable", packageName) } 但问题是,我的应用程序支持暗/亮情绪,这种方法是用亮图像返回暗情绪,用暗图像返回亮情绪 我在网上搜索了很多,但发现了一种从名字中获取RE的方法,而不是如何根据主题来获取,所以不要认为这是一个重复的问题。 简短的回答:不要使

我可以使用以下命令通过字符串名获取资源Id

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