【问题标题】:Custom colorAccent can't work in Settings application自定义 colorAccent 无法在“设置”应用程序中工作
【发布时间】:2016-08-19 08:50:34
【问题描述】:

我正在基于 Marshmallow 源代码自定义设置应用程序; 示例:操作栏、状态栏、EditTextView、对话框按钮等的颜色。 阅读材料设计指南后,我知道修改 colorAccent 可以满足我。 所以,我这样做:

<style name="Theme.SettingsBase" parent="@android:style/Theme.Material.Settings" />
<style name="Theme.Settings" parent="Theme.SettingsBase"> 
    <item name="android:colorAccent">@color/red</item>
</style>

很遗憾,它不起作用,它们的颜色仍然是深蓝绿色。

源代码: http://androidxref.com/6.0.0_r1/xref/packages/apps/Settings/res/values/themes.xml

【问题讨论】:

  • @color/red的值是多少?
  • #F00
  • 我会尽快调查。
  • 非常感谢您,Ishita Sinha。如您所知,设置是系统应用程序。所以我使用 Android Source 而不是 Google Android SDK 构建它。我发现了一个奇怪的事情:对于我用 SDK 在 Android Studio 中构建的演示,改变 colorAccent 可以得到预期的结果。如您所知,Settings 是直接内置在 Android Source 中的。第二天,我会从这一点开始尝试。
  • 哦!这是针对基于android的操作系统吗?我只有应用程序和东西的经验,但我从未使用过 AOSP 源代码。我不知道我能为你提供多少帮助。 :(

标签: android settings android-6.0-marshmallow


【解决方案1】:

在应用自己的样式后,请先检查是否有主题覆盖操作,尤其是调用 applyStyle/setTheme 。

虽然 Theme.Settings 设置了 windowDrawsSystemBarBackgrounds,但 colorPrimaryDark 无法工作,因为 PhoneWindow.java 和 ActivityManager.java 中有以下代码:

   // PhoneWindow.java
protected ViewGroup generateLayout(DecorView decor) {  
  // Non-floating windows on high end devices must put up decor beneath the system bars and
  // therefore must know about visibility changes of those.
  if (!mIsFloating && ActivityManager.isHighEndGfx()) { // Shield off this flag if isFloating or lowEndGfx
      if (!targetPreL && a.getBoolean(
              R.styleable.Window_windowDrawsSystemBarBackgrounds,
              false)) {
          setFlags(FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
                  FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS & ~getForcedWindowFlags());
      }
  }
  ...
}


private WindowInsets updateColorViews(WindowInsets insets, boolean animate) {

    if (!mIsFloating && ActivityManager.isHighEndGfx()) {

        ...
    }

    ...
}

// ActivityManager.java
static public boolean isHighEndGfx() {
      return !isLowRamDeviceStatic() &&
              !Resources.getSystem().getBoolean(com.android.internal.R.bool.config_avoidGfxAccel);
  }

  /** @hide */
public static boolean isLowRamDeviceStatic() {
    return "true".equals(SystemProperties.get("ro.config.low_ram", "false"));
}

我只是更改了不检查 ro.config.low_ram 属性的 PhoneWindow 策略,以快速实现我的期望。

【讨论】:

    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 2019-03-13
    • 2016-04-07
    • 1970-01-01
    • 2010-12-31
    • 2012-08-04
    • 1970-01-01
    • 2012-10-13
    相关资源
    最近更新 更多