Android-在Viewpager中的片段之间切换状态栏透明度

Android-在Viewpager中的片段之间切换状态栏透明度,android,android-fragments,transparency,statusbar,Android,Android Fragments,Transparency,Statusbar,基本上,我已经用尽了我找到的每一篇关于以编程方式更改状态栏颜色的帖子,但是没有一篇涉及到这个具体案例 我有一个包含ViewPager和BottomNavigationView的活动。ViewPager包含三个片段,BottomNavigationView在关闭smoothscroll的情况下在它们之间移动 由于三个片段中的第一个是一个映射,我希望在显示第一个片段时状态栏是透明的,但在其他两个片段上恢复为不透明的颜色 下面的一些代码显示了我如何尝试设置和恢复状态栏状态 private class

基本上,我已经用尽了我找到的每一篇关于以编程方式更改状态栏颜色的帖子,但是没有一篇涉及到这个具体案例

我有一个包含ViewPager和BottomNavigationView的活动。ViewPager包含三个片段,BottomNavigationView在关闭smoothscroll的情况下在它们之间移动

由于三个片段中的第一个是一个映射,我希望在显示第一个片段时状态栏是透明的,但在其他两个片段上恢复为不透明的颜色

下面的一些代码显示了我如何尝试设置和恢复状态栏状态

private class TabSelectedObserver implements Observer<Integer> {
    @Override
    public void onChanged(@Nullable Integer selectedTab) {
        if (selectedTab != null) {
            activityMainBinding.mainPager.setCurrentItem(selectedTab, false);
            switch (selectedTab) {
                case 0:
                    applyTransparentStatusBarTheme();
                    break;
                default:
                    applyOpaqueStatusBarTheme();
                    break;
            }
        }
    }
}

private void applyTransparentStatusBarTheme() {
    hideSystemUi();
    getWindow().setStatusBarColor(ContextCompat.getColor(this, android.R.color.transparent));
}

private void applyOpaqueStatusBarTheme() {
    showSystemUi();
    getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.rippallete_700));
}

private void hideSystemUi() {
    // Set flags for hiding status bar and navigation bar

    mSystemUiVisibility = mSystemUiVisibility
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
    getWindow().getDecorView().setSystemUiVisibility(mSystemUiVisibility);
}

private void showSystemUi() {
    // Reset flags for hiding status bar and navigation bar
    mSystemUiVisibility = mSystemUiVisibility
            & ~View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
    getWindow().getDecorView().setSystemUiVisibility(mSystemUiVisibility);
}
私有类选项卡SelectedObserver实现Observer{
@凌驾
更改后的公共void(@Nullable Integer selectedTab){
如果(selectedTab!=null){
activityMainBinding.mainPager.setCurrentItem(selectedTab,false);
开关(已选择的选项卡){
案例0:
applyTransparentStatusBarTheme();
打破
违约:
applyOpaqueStatusBarTheme();
打破
}
}
}
}
私有无效applyTransparentStatusBarTheme(){
hideSystemUi();
getWindow().setStatusBarColor(ContextCompat.getColor(this,android.R.color.transparent));
}
私有无效applyOpaqueStatusBarTheme(){
showSystemUi();
getWindow().setStatusBarColor(ContextCompat.getColor(this,R.color.rippallete_700));
}
私有void hideSystemUi(){
//设置隐藏状态栏和导航栏的标志
msystemability=msystemability
|View.SYSTEM\u UI\u FLAG\u LAYOUT\u全屏显示;
getWindow().getDecorView().SetSystemMivibility(MSSystemMivibility);
}
私有void showSystemUi(){
//重置隐藏状态栏和导航栏的标志
msystemability=msystemability
&~View.SYSTEM\u UI\u FLAG\u LAYOUT\u全屏显示;
getWindow().getDecorView().SetSystemMivibility(MSSystemMivibility);
}

我用
fitSystemWindows
尝试的每一件事都没有产生我想要的结果


如果有人对如何为每个片段指定一个单独的状态栏颜色(1为透明)有任何建议,我将非常感激。

因此,假设您根据所选选项卡的位置设置状态栏颜色,您可以执行类似的操作:

private void updateStatusBarColour(int tabPosition) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

        switch (tabPosition) {
            case FIRST_TAB:
            case SECOND_TAB:
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    mRootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                }
                window.setStatusBarColor(ContextCompat.getColor(this, R.color.colorPrimaryLight));
                break;
            case THIRD_TAB:
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    mRootView.setSystemUiVisibility(0);
                }
                window.setStatusBarColor(ContextCompat.getColor(this, R.color.colorPrimary));
                break;
            case FOURTH_TAB:
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    mRootView.setSystemUiVisibility(0);
                }
                window.setStatusBarColor(ContextCompat.getColor(this, R.color.colorDarkTan));
                break;
        }
    }
}

请注意,我在
mRootView
上调用
setSystemMivibility
,其中
mRootView
是包含ViewPager的根父视图(或包含活动的根布局)。该调用专门设置状态栏的主题,以便状态栏项目(如电池符号)可以在深色或浅色背景下显示,具体取决于您最终设置的颜色。

如何将其重新设置为原始颜色?