我最近想让我的状态栏颜色渐变。我知道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说它不是正确的方法,但它是有效的。
我的问题:这是正确的方法吗?有没有人有这种经历?
答案 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>