主要黑暗的颜色为渐变

时间:2017-01-05 10:05:20

标签: android android-studio statusbar

我最近想让我的状态栏颜色渐变。我知道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>

@绘制/梯度

<?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说它不是正确的方法,但它是有效的。

我的问题:这是正确的方法吗?有没有人有这种经历?

2 个答案:

答案 0 :(得分:3)

这将从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&amp; amp; 26.看起来Android应该只是简单地使用,但不是......

答案 1 :(得分: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>