【问题标题】:Detect the Android device theme (is it dark or light)检测 Android 设备主题(是深色还是浅色)
【发布时间】:2016-11-01 09:33:08
【问题描述】:

您可以为您的应用设置主题,但我想知道是否可以找出设备使用的主题。目前,我的应用使用Theme.AppCompat.Light。我想避免改变主题。

附:我已经尝试将其设置为 Theme.DeviceDefault 并使用反射访问其 ID,但到目前为止还没有运气。

try {
    setTheme(android.R.style.Theme_DeviceDefault);

    Class<Context> contextClass = Context.class;
    Method getThemeMethod = contextClass.getMethod("getThemeResId");
    getThemeMethod.setAccessible(true);
    Log.d("Test", "" + getThemeMethod.invoke(this)); // Always returns 0

    PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_META_DATA);
    Log.d("Test", getResources().getResourceEntryName(packageInfo.applicationInfo.theme)); // Returns 'Theme.DeviceDefault'
} catch (Exception e) {
    Log.d("Test", "exception", e);
}

【问题讨论】:

  • 你是在问,如何使用设备集主题?
  • 基本上是你的IDE选择的主题。如果你想避免你可以改变主题。
  • @Doomsknight 不,我不想使用设备默认主题。我想知道这个主题是深色还是浅色。
  • 您使用的主题名称中有.Light,肯定很轻。
  • @Doomsknight 你误会了。我想知道操作系统主题是浅色还是深色。我不需要更改我的应用主题。

标签: android android-theme


【解决方案1】:
int currentNightMode = getContext().getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;  
switch (currentNightMode) {
    case Configuration.UI_MODE_NIGHT_NO:
        // Night mode is not active on device
        break;
    case Configuration.UI_MODE_NIGHT_YES:
        // Night mode is active on device
        break;
}    

【讨论】:

  • 我相信他要求的是操作系统系统使用的主题,而不是应用程序本身。
  • 根据他的问题,他想知道设备主题是浅色还是深色。
  • 设备或操作系统系统,同样的东西,但不是应用程序
  • 这将检查设备主题。对于评论中的错误信息,我们深表歉意。
【解决方案2】:

这可能有助于ContextThemeWrapper

【讨论】:

  • 谢谢,但我不想应用设备主题。我已经在这里看到了这个建议:stackoverflow.com/a/26302184/3185295
  • 所以您只想知道设备当前使用的是哪个主题?
  • 是的,这就是我要找的。​​span>
  • 你可以使用getTheme()方法
  • getTheme() 将返回我的应用主题。但我需要检索设备主题。
猜你喜欢
  • 2020-12-21
  • 2019-08-20
  • 2021-09-11
  • 2014-05-01
  • 2014-08-07
  • 1970-01-01
  • 2022-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多