【问题标题】:Color of Primary Dark to be GradientPrimary Dark的颜色是渐变的
【发布时间】:2017-01-05 10:05:19
【问题描述】:

我最近想让我的状态栏颜色渐变。我知道 WindowManager 方式是如何工作的。但我决定寻找另一种使用渐变为状态栏着色的方法。

所以我这样做了,

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">@drawable/gradient</color>
   <color name="colorAccent">#FF4081</color>
</resources>

@drawable/渐变

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
   <gradient android:angle="135" android:startColor="#f56f2c" android:endColor="#fa9f46"/>
</shape>

@drawable/gradient 是我设置的渐变色。虽然IDE说这不是正确的方法,但它是有效的。

我的问题:这样做是否正确?有人有这种经历吗?

【问题讨论】:

  • 也发布 gradient.xml
  • 您可以在这里查看:stackoverflow.com/questions/4381033/multi-gradient-shapes,了解制作渐变的非常彻底的方法。请注意,这也取决于您使用的 min-sdk 的版本。我相信 sdk-1 不支持渐变,但这只是一个假设
  • 不,这不是我想要的答案。我对创建渐变没有任何问题。

标签: android android-studio statusbar


【解决方案1】:

这将从 Android N (API 25) 开始中断,并出现以下错误:

android.content.res.Resources$NotFoundException: Can't find ColorStateList from drawable resource ID...

这与SO issue 几乎相同的错误,正如答案所指出的,error/crash is intentional。 我猜原因是因为 Android 之神现在严格禁止您将颜色以外的东西用于 @color 资源。所以,这绝对不是“正确的方法”。

一种解决方法是使用自定义工具栏,您可以在其中使用可绘制渐变作为背景。

我确实尝试了this other solution on SO,它声称适用于 API 24+,但可惜它在 API 25 和 26 中中断。它看起来确实是 Android 应该简单地使用但不适用的东西..

【讨论】:

    【解决方案2】:

    您可以使用this SO answer 中所述的以下函数以编程方式执行此操作。

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public static void setStatusBarGradiant(Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = activity.getWindow();
            Drawable background = activity.getResources().getDrawable(R.drawable.gradient_theme);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(activity.getResources().getColor(android.R.color.transparent));
            window.setNavigationBarColor(activity.getResources().getColor(android.R.color.transparent));
            window.setBackgroundDrawable(background);
        }
    } 
    

    您还必须在style.xml 中添加以下内容。

    <style name="AppTheme.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
    

    然后将该主题添加到您的activity 中的AndroidManifest.xml

    <activity android:name=".ui.MainActivity"
            android:theme="@style/AppTheme.NoActionBar">
    </activity>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2011-03-06
      • 1970-01-01
      相关资源
      最近更新 更多