Android以编程方式设置正常状态栏

Android以编程方式设置正常状态栏,android,material-design,android-statusbar,Android,Material Design,Android Statusbar,我一直在研究材质设计和折叠工具栏布局,希望在其中一个片段中使用半透明状态栏。 我有AppTheme的MainActivity(在style.xml半透明状态栏中,叠加为false)。我有碎片1和碎片2 Fragment1不应具有半透明的状态栏。只有原色正常。然而,在Fragment2中,我需要以渐进的方式打开半透明状态栏。我是通过这种方式实现的: @Override public View onCreateView(LayoutInflater inflater, ViewGroup co

我一直在研究材质设计和折叠工具栏布局,希望在其中一个片段中使用半透明状态栏。 我有AppTheme的MainActivity(在style.xml半透明状态栏中,叠加为false)。我有碎片1和碎片2 Fragment1不应具有半透明的状态栏。只有原色正常。然而,在Fragment2中,我需要以渐进的方式打开半透明状态栏。我是通过这种方式实现的:

   @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    //Making status bar transparent
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window w = getActivity().getWindow(); // in Activity's onCreate() for instance
        w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }

当我再次回到Fragment1时,状态栏是隐藏的。我想我应该禁用Pause()或onStop()中的半透明状态栏。但我不知道如何做这件事。有什么建议吗?

要更改状态栏的颜色,请使用setStatusBarColor(int color)。使用下面的代码

Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setStatusBarColor(activity.getResources().getColor(R.color.example_color));

要更改状态栏颜色,请使用setStatusBarColor(int color)。使用以下代码

Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setStatusBarColor(activity.getResources().getColor(R.color.example_color));

如果您正在使用kotlin,可以使用以下代码将状态栏设置为正常状态:

fun Activity.setStatusBarNormal() {
    window.apply {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
            addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
            clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
            statusBarColor = getColorCompat(R.color.colorPrimaryDark)
        decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE
    }
}

fun Context.getColorCompat(@ColorRes colorId: Int) = ContextCompat.getColor(this, colorId)

如果您正在使用kotlin,可以使用以下代码将状态栏设置为正常状态:

fun Activity.setStatusBarNormal() {
    window.apply {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
            addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
            clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
            statusBarColor = getColorCompat(R.color.colorPrimaryDark)
        decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE
    }
}

fun Context.getColorCompat(@ColorRes colorId: Int) = ContextCompat.getColor(this, colorId)

谢谢这很有效。但是,我的Fragment1视图现在仍然覆盖在状态栏上(部分工具栏现在位于状态栏下)。如何将windowActionModeOverlay设置为false?谢谢!这很有效。但是,我的Fragment1视图现在仍然覆盖在状态栏上(部分工具栏现在位于状态栏下)。如何将windowActionModeOverlay设置为false?