Primary Dark 颜色渐变
Color of Primary Dark to be Gradient
我最近想让我的状态栏颜色渐变。我知道 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/gradient
<?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说这样做不对,但确实有效。
我的问题:这样做是否正确?有人有过这种经历吗?
这将从 Android N (API 25) 开始中断,并出现以下错误:
android.content.res.Resources$NotFoundException: Can't find ColorStateList from drawable resource ID...
这与 , and as pointed out by an answer, the error/crash is intentional 的错误几乎相同。
我想原因是因为 Android 神现在很严格,不允许你为 @color 资源使用颜色以外的东西。所以,这绝对不是"right way"要做的。
解决方法是使用自定义工具栏,您可以在其中使用可绘制渐变作为背景。
我试过 ,它声称适用于 API 24 岁以上,但可惜它在 API 25 和 26 岁时坏了。它看起来确实像 Android 应该可以简单地使用但不能..
您可以使用 中所述的以下函数以编程方式完成此操作。
@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>
然后将该主题添加到 AndroidManifest.xml
中的 activity
<activity android:name=".ui.MainActivity"
android:theme="@style/AppTheme.NoActionBar">
</activity>
我最近想让我的状态栏颜色渐变。我知道 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/gradient
<?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说这样做不对,但确实有效。
我的问题:这样做是否正确?有人有过这种经历吗?
这将从 Android N (API 25) 开始中断,并出现以下错误:
android.content.res.Resources$NotFoundException: Can't find ColorStateList from drawable resource ID...
这与
解决方法是使用自定义工具栏,您可以在其中使用可绘制渐变作为背景。
我试过
您可以使用
@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>
然后将该主题添加到 AndroidManifest.xml
activity
<activity android:name=".ui.MainActivity"
android:theme="@style/AppTheme.NoActionBar">
</activity>