gpt4 book ai didi

android - 如何从android中的另一个应用程序资源更改主题?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:06:11 24 4
gpt4 key购买 nike

我知道有一种方法可以通过在 styles.xml 中定义并像那样使用它来设置主题

setTheme(android.R.style.MyTheme);

但是,我想从我开发的另一个应用程序中获取主题。我知道资源名称,实际上我可以使用此代码块获取主题 ID;

Resources res = getPackageManager().getResourcesForApplication("com.example.theme");
int resThemeId = res.getIdentifier("my_theme","style","com.example.theme");

当我调试时,我发现 resThemeId 不为零。

然后,我需要最后的命令来设置这个主题。在 super.onCreate() 函数之前,我尝试实现这个方法,但它似乎不起作用

setTheme(resThemeId);

但不是这样,如果我写下面的语句,我工作正常

setTheme(android.R.style.Theme_Holo_Light);

那么,我应该怎么做才能使用来自不同包资源的主题呢?

最佳答案

如评论中所述,您可以从其他应用程序访问资源,但使用其他应用程序主题将不起作用。


既然有证据总是好事,让我们看看源代码(我使用的是 API 24 源代码)

Activity 上调用 setTheme() 将调用 ContextThemeWrapper 父类中的 initializeTheme(),这最终会调用 onApplyThemeResource(..),后者又会尝试通过调用 theme.applyStyle(resId, true)

从资源中加载实际的主题数据

沿着链通过包装器 Resources.Theme 我们可以在 ResourcesImpl.ThemeImpl 中看到以下内容,其中 AssetManager 被调用以加载风格融入主题:

void applyStyle(int resId, boolean force) {
synchronized (mKey) {
AssetManager.applyThemeStyle(mTheme, resId, force);

mThemeResId = resId;
mKey.append(resId, force);
}
}

这是您尝试从您的其他应用程序加载外国主题的地方。


由于您需要使用的大多数方法都是静态调用或封装本地方法,因此似乎没有任何方法可以实现您想要的(例如应用或创建新主题)

即使您通过在上下文中使用 getAssets() 获取其他应用程序的 AssetManager there is no accessible method to create or apply themes .

因此,使用其他应用资源的唯一方法是将资源添加到您的资源中。

关于android - 如何从android中的另一个应用程序资源更改主题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41872033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com