所以现在我有一堆活动和片段,它们在onCreate
或onViewCreate
中有以下代码:
val window = this.window
val background = ResourcesCompat.getDrawable(this.resources, R.drawable.background_color, null)
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.statusBarColor = ContextCompat.getColor(applicationContext, android.R.color.transparent)
window.setBackgroundDrawable(background)
这将状态栏设置为具有渐变色的可绘制对象。这样做的问题是,我不喜欢将这些代码复制并粘贴到我拥有的每个活动和片段中。不仅如此,这不适用于我的SplashActivity
,这是用户首次运行应用程序时启动的第一个活动。那么,将状态栏颜色设置为自定义渐变颜色的最佳方法是什么,以及也适用于启动的第一个活动的方法是什么?
这是更改状态栏的完整对象
object StatusBarUtil {
val DEFAULT_STATUS_BAR_ALPHA = 112
private val FAKE_STATUS_BAR_VIEW_ID = R.id.statusbarutil_fake_status_bar_view
private val FAKE_TRANSLUCENT_VIEW_ID = R.id.statusbarutil_translucent_view
private val TAG_KEY_HAVE_SET_OFFSET = -123
@JvmOverloads
fun setColor(
activity: Activity, @ColorInt color: Int, @IntRange(
from = 0,
to = 255
) statusBarAlpha: Int = DEFAULT_STATUS_BAR_ALPHA
) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
activity.window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
activity.window.statusBarColor = calculateStatusColor(color, statusBarAlpha)
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
activity.window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
val decorView = activity.window.decorView as ViewGroup
val fakeStatusBarView = decorView.findViewById<View>(FAKE_STATUS_BAR_VIEW_ID)
if (fakeStatusBarView != null) {
if (fakeStatusBarView.visibility == View.GONE) {
fakeStatusBarView.visibility = View.VISIBLE
}
fakeStatusBarView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha))
} else {
decorView.addView(createStatusBarView(activity, color, statusBarAlpha))
}
setRootView(activity)
}
}
@JvmOverloads
fun setColorForSwipeBack(
activity: Activity, @ColorInt color: Int,
@IntRange(from = 0, to = 255) statusBarAlpha: Int = DEFAULT_STATUS_BAR_ALPHA
) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
val contentView = activity.findViewById<View>(android.R.id.content) as ViewGroup
val rootView = contentView.getChildAt(0)
val statusBarHeight = getStatusBarHeight(activity)
if (rootView != null && rootView is CoordinatorLayout) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
rootView.fitsSystemWindows = false
contentView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha))
val isNeedRequestLayout = contentView.paddingTop < statusBarHeight
if (isNeedRequestLayout) {
contentView.setPadding(0, statusBarHeight, 0, 0)
rootView.post { rootView.requestLayout() }
}
} else {
rootView.setStatusBarBackgroundColor(
calculateStatusColor(
color,
statusBarAlpha
)
)
}
} else {
contentView.setPadding(0, statusBarHeight, 0, 0)
contentView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha))
}
setTransparentForWindow(activity)
}
}
fun setColorNoTranslucent(activity: Activity, @ColorInt color: Int) {
setColor(activity, color, 0)
}
@Deprecated("")
fun setColorDiff(activity: Activity, @ColorInt color: Int) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return
}
transparentStatusBar(activity)
val contentView = activity.findViewById<View>(android.R.id.content) as ViewGroup
val fakeStatusBarView = contentView.findViewById<View>(FAKE_STATUS_BAR_VIEW_ID)
if (fakeStatusBarView != null) {
if (fakeStatusBarView.visibility == View.GONE) {
fakeStatusBarView.visibility = View.VISIBLE
}
fakeStatusBarView.setBackgroundColor(color)
} else {
contentView.addView(createStatusBarView(activity, color))
}
setRootView(activity)
}
@JvmOverloads
fun setTranslucent(
activity: Activity, @IntRange(
from = 0,
to = 255
) statusBarAlpha: Int = DEFAULT_STATUS_BAR_ALPHA
) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return
}
setTransparent(activity)
addTranslucentView(activity, statusBarAlpha)
}
fun setTranslucentForCoordinatorLayout(
activity: Activity,
@IntRange(from = 0, to = 255) statusBarAlpha: Int
) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return
}
transparentStatusBar(activity)
addTranslucentView(activity, statusBarAlpha)
}
fun setTransparent(activity: Activity) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return
}
transparentStatusBar(activity)
setRootView(activity)
}
@Deprecated("")
fun setTranslucentDiff(activity: Activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
activity.window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
setRootView(activity)
}
}
fun setColorNoTranslucentForDrawerLayout(
activity: Activity,
drawerLayout: DrawerLayout,
@ColorInt color: Int
) {
setColorForDrawerLayout(activity, drawerLayout, color, 0)
}
@JvmOverloads
fun setColorForDrawerLayout(
activity: Activity, drawerLayout: DrawerLayout, @ColorInt color: Int,
@IntRange(from = 0, to = 255) statusBarAlpha: Int = DEFAULT_STATUS_BAR_ALPHA
) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
activity.window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
activity.window.statusBarColor = Color.TRANSPARENT
} else {
activity.window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
}
val contentLayout = drawerLayout.getChildAt(0) as ViewGroup
val fakeStatusBarView = contentLayout.findViewById<View>(FAKE_STATUS_BAR_VIEW_ID)
if (fakeStatusBarView != null) {
if (fakeStatusBarView.visibility == View.GONE) {
fakeStatusBarView.visibility = View.VISIBLE
}
fakeStatusBarView.setBackgroundColor(color)
} else {
contentLayout.addView(createStatusBarView(activity, color), 0)
}
if (contentLayout !is LinearLayout && contentLayout.getChildAt(1) != null) {
contentLayout.getChildAt(1)
.setPadding(
contentLayout.paddingLeft,
getStatusBarHeight(activity) + contentLayout.paddingTop,
contentLayout.paddingRight,
contentLayout.paddingBottom
)
}
setDrawerLayoutProperty(drawerLayout, contentLayout)
addTranslucentView(activity, statusBarAlpha)
}
private fun setDrawerLayoutProperty(
drawerLayout: DrawerLayout,
drawerLayoutContentLayout: ViewGroup
) {
val drawer = drawerLayout.getChildAt(1) as ViewGroup
drawerLayout.fitsSystemWindows = false
drawerLayoutContentLayout.fitsSystemWindows = false
drawerLayoutContentLayout.clipToPadding = true
drawer.fitsSystemWindows = false
}
@Deprecated("")
fun setColorForDrawerLayoutDiff(
activity: Activity,
drawerLayout: DrawerLayout,
@ColorInt color: Int
) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
activity.window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
val contentLayout = drawerLayout.getChildAt(0) as ViewGroup
val fakeStatusBarView = contentLayout.findViewById<View>(FAKE_STATUS_BAR_VIEW_ID)
if (fakeStatusBarView != null) {
if (fakeStatusBarView.visibility == View.GONE) {
fakeStatusBarView.visibility = View.VISIBLE
}
fakeStatusBarView.setBackgroundColor(
calculateStatusColor(
color,
DEFAULT_STATUS_BAR_ALPHA
)
)
} else {
contentLayout.addView(createStatusBarView(activity, color), 0)
}
if (contentLayout !is LinearLayout && contentLayout.getChildAt(1) != null) {
contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0)
}
setDrawerLayoutProperty(drawerLayout, contentLayout)
}
}
@JvmOverloads
fun setTranslucentForDrawerLayout(
activity: Activity, drawerLayout: DrawerLayout,
@IntRange(from = 0, to = 255) statusBarAlpha: Int = DEFAULT_STATUS_BAR_ALPHA
) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return
}
setTransparentForDrawerLayout(activity, drawerLayout)
addTranslucentView(activity, statusBarAlpha)
}
fun setTransparentForDrawerLayout(activity: Activity, drawerLayout: DrawerLayout) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
activity.window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
activity.window.statusBarColor = Color.TRANSPARENT
} else {
activity.window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
}
val contentLayout = drawerLayout.getChildAt(0) as ViewGroup
if (contentLayout !is LinearLayout && contentLayout.getChildAt(1) != null) {
contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0)
}
setDrawerLayoutProperty(drawerLayout, contentLayout)
}
@Deprecated("")
fun setTranslucentForDrawerLayoutDiff(activity: Activity, drawerLayout: DrawerLayout) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
activity.window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
val contentLayout = drawerLayout.getChildAt(0) as ViewGroup
contentLayout.fitsSystemWindows = true
contentLayout.clipToPadding = true
val vg = drawerLayout.getChildAt(1) as ViewGroup
vg.fitsSystemWindows = false
drawerLayout.fitsSystemWindows = false
}
}
fun setTransparentForImageView(activity: Activity, needOffsetView: View) {
setTranslucentForImageView(activity, 0, needOffsetView)
}
fun setTranslucentForImageView(activity: Activity, needOffsetView: View) {
setTranslucentForImageView(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView)
}
fun setTranslucentForImageView(
activity: Activity, @IntRange(from = 0, to = 255) statusBarAlpha: Int,
needOffsetView: View?
) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return
}
setTransparentForWindow(activity)
addTranslucentView(activity, statusBarAlpha)
if (needOffsetView != null) {
val haveSetOffset = needOffsetView.getTag(TAG_KEY_HAVE_SET_OFFSET)
if (haveSetOffset != null && haveSetOffset as Boolean) {
return
}
val layoutParams = needOffsetView.layoutParams as ViewGroup.MarginLayoutParams
layoutParams.setMargins(
layoutParams.leftMargin, layoutParams.topMargin + getStatusBarHeight(activity),
layoutParams.rightMargin, layoutParams.bottomMargin
)
needOffsetView.setTag(TAG_KEY_HAVE_SET_OFFSET, true)
}
}
fun setTranslucentForImageViewInFragment(activity: Activity, needOffsetView: View) {
setTranslucentForImageViewInFragment(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView)
}
fun setTransparentForImageViewInFragment(activity: Activity, needOffsetView: View) {
setTranslucentForImageViewInFragment(activity, 0, needOffsetView)
}
fun setTranslucentForImageViewInFragment(
activity: Activity, @IntRange(from = 0, to = 255) statusBarAlpha: Int,
needOffsetView: View
) {
setTranslucentForImageView(activity, statusBarAlpha, needOffsetView)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
clearPreviousSetting(activity)
}
}
fun hideFakeStatusBarView(activity: Activity) {
val decorView = activity.window.decorView as ViewGroup
val fakeStatusBarView = decorView.findViewById<View>(FAKE_STATUS_BAR_VIEW_ID)
if (fakeStatusBarView != null) {
fakeStatusBarView.visibility = View.GONE
}
val fakeTranslucentView = decorView.findViewById<View>(FAKE_TRANSLUCENT_VIEW_ID)
if (fakeTranslucentView != null) {
fakeTranslucentView.visibility = View.GONE
}
}
@TargetApi(Build.VERSION_CODES.M)
fun setLightMode(activity: Activity) {
setMIUIStatusBarDarkIcon(activity, true)
setMeizuStatusBarDarkIcon(activity, true)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
activity.window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
}
}
@TargetApi(Build.VERSION_CODES.M)
fun setDarkMode(activity: Activity) {
setMIUIStatusBarDarkIcon(activity, false)
setMeizuStatusBarDarkIcon(activity, false)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
activity.window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
}
}
private fun setMIUIStatusBarDarkIcon(activity: Activity, darkIcon: Boolean) {
val clazz = activity.window.javaClass
try {
val layoutParams = Class.forName("android.view.MiuiWindowManager\$LayoutParams")
val field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE")
val darkModeFlag = field.getInt(layoutParams)
val extraFlagField =
clazz.getMethod(
"setExtraFlags",
Int::class.javaPrimitiveType,
Int::class.javaPrimitiveType
)
extraFlagField.invoke(activity.window, if (darkIcon) darkModeFlag else 0, darkModeFlag)
} catch (e: Exception) {
//e.printStackTrace();
}
}
private fun setMeizuStatusBarDarkIcon(activity: Activity, darkIcon: Boolean) {
try {
val lp = activity.window.attributes
val darkFlag =
WindowManager.LayoutParams::class.java.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON")
val meizuFlags = WindowManager.LayoutParams::class.java.getDeclaredField("meizuFlags")
darkFlag.isAccessible = true
meizuFlags.isAccessible = true
val bit = darkFlag.getInt(null)
var value = meizuFlags.getInt(lp)
if (darkIcon) {
value = value or bit
} else {
value = value and bit.inv()
}
meizuFlags.setInt(lp, value)
activity.window.attributes = lp
} catch (e: Exception) {
//e.printStackTrace();
}
}
///////////////////////////////////////////////////////////////////////////////////
@TargetApi(Build.VERSION_CODES.KITKAT)
private fun clearPreviousSetting(activity: Activity) {
val decorView = activity.window.decorView as ViewGroup
val fakeStatusBarView = decorView.findViewById<View>(FAKE_STATUS_BAR_VIEW_ID)
if (fakeStatusBarView != null) {
decorView.removeView(fakeStatusBarView)
val rootView =
(activity.findViewById<View>(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup
rootView.setPadding(0, 0, 0, 0)
}
}
private fun addTranslucentView(
activity: Activity,
@IntRange(from = 0, to = 255) statusBarAlpha: Int
) {
val contentView = activity.findViewById<View>(android.R.id.content) as ViewGroup
val fakeTranslucentView = contentView.findViewById<View>(FAKE_TRANSLUCENT_VIEW_ID)
if (fakeTranslucentView != null) {
if (fakeTranslucentView.visibility == View.GONE) {
fakeTranslucentView.visibility = View.VISIBLE
}
fakeTranslucentView.setBackgroundColor(Color.argb(statusBarAlpha, 0, 0, 0))
} else {
contentView.addView(createTranslucentStatusBarView(activity, statusBarAlpha))
}
}
private fun createStatusBarView(
activity: Activity,
@ColorInt color: Int,
alpha: Int = 0
): View {
val statusBarView = View(activity)
val params = LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
getStatusBarHeight(activity)
)
statusBarView.layoutParams = params
statusBarView.setBackgroundColor(calculateStatusColor(color, alpha))
statusBarView.id = FAKE_STATUS_BAR_VIEW_ID
return statusBarView
}
private fun setRootView(activity: Activity) {
val parent = activity.findViewById<View>(android.R.id.content) as ViewGroup
var i = 0
val count = parent.childCount
while (i < count) {
val childView = parent.getChildAt(i)
if (childView is ViewGroup) {
childView.setFitsSystemWindows(true)
childView.clipToPadding = true
}
i++
}
}
private fun setTransparentForWindow(activity: Activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.window.statusBarColor = Color.TRANSPARENT
activity.window
.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
activity.window
.setFlags(
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
)
}
}
@TargetApi(Build.VERSION_CODES.KITKAT)
private fun transparentStatusBar(activity: Activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
activity.window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
activity.window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
activity.window.statusBarColor = Color.TRANSPARENT
} else {
activity.window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
}
}
private fun createTranslucentStatusBarView(activity: Activity, alpha: Int): View {
val statusBarView = View(activity)
val params = LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
getStatusBarHeight(activity)
)
statusBarView.layoutParams = params
statusBarView.setBackgroundColor(Color.argb(alpha, 0, 0, 0))
statusBarView.id = FAKE_TRANSLUCENT_VIEW_ID
return statusBarView
}
private fun getStatusBarHeight(context: Context): Int {
val resourceId = context.resources.getIdentifier("status_bar_height", "dimen", "android")
return context.resources.getDimensionPixelSize(resourceId)
}
private fun calculateStatusColor(@ColorInt color: Int, alpha: Int): Int {
if (alpha == 0) {
return color
}
val a = 1 - alpha / 255f
var red = color shr 16 and 0xff
var green = color shr 8 and 0xff
var blue = color and 0xff
red = (red * a + 0.5).toInt()
green = (green * a + 0.5).toInt()
blue = (blue * a + 0.5).toInt()
return 0xff shl 24 or (red shl 16) or (green shl 8) or blue
}
}
并使用 :
StatusBarUtil.setColor(
requireActivity(),
Color.parseColor(
"this is background color Viewpager "
),
20
)
如果你认为它重复了一些其他的问题,那么我应该让你现在我已经尝试了3,4页的谷歌搜索,也实现了他们。
嘿,我正在尝试改变状态栏的颜色,使其与动作栏的颜色相同(可能是透明的)。在Android Lolipop上,这不是问题,但在Kitkat上,它看起来像这张图片 我尝试了许多其他的解决方案,但仍然没有解决它。 以下是V19XML样式
本文向大家介绍Flutter 透明状态栏及字体颜色的设置方法,包括了Flutter 透明状态栏及字体颜色的设置方法的使用技巧和注意事项,需要的朋友参考一下 注:底色透明是否生效与android版本有关,版本过低设置无效 1.在main.dart内设置 2.单页面设置 注:设置AppBar之后,单独在build内设置这行代码会失效 SystemChrome.setSystemUIOverlaySty
关于这个话题有很多帖子,但我找不到一个有用的。 我有一个未嵌入导航控制器的视图控制器。我想把状态栏的颜色改成黑色。 如何在Swift 3中设置状态栏样式 改变行info.plist查看基于控制器的状态栏外观并将其设置为NO didFinishLaunchingwith Options中appDelegate.swift的更改
问题内容: 我正在尝试将状态栏的颜色更改为蓝色或其他某种颜色。 这可能吗,或者Apple不允许吗? 问题答案: 注意:此解决方案在iOS 13及更高版本下失败。 Plist中的第一个设置为 输出屏幕截图如下