为什么添加 ViewPager 后状态栏颜色停止变化?
Why does my status bar color stop changing after I add a ViewPager?
我有一个 activity 带有 BottomNavigation 视图,可以导航到不同的片段。我想更改每个片段的状态栏颜色。这与包含 ViewPager 的一个片段不同。一旦我删除这个 ViewPager,状态栏颜色就会按我预期的那样改变,但是当我添加 ViewPager 时,状态栏颜色在 Fragment 膨胀时不会改变。 ViewPager 做了什么阻止这种颜色变化的发生?
我更改状态栏颜色的代码:
fun setStatusBarColor(@ColorRes colorRes: Int, isLight: Boolean) {
window?.apply {
statusBarColor = ContextCompat.getColor(this@BaseActivity, colorRes)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val lightFlag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR.with(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR)
} else {
View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
}
val darkFlag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
} else {
View.VISIBLE
}
decorView.systemUiVisibility = if (isLight) lightFlag else darkFlag
}
}
}
包含 ViewPager 的我的片段:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.x.x.android.ui.main.account.AccountFragment">
<include layout="@layout/include_header_user_profile" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/account_tab_layout"
android:layout_width="match_parent"
android:layout_height="36dp"
android:background="@drawable/tab_layout_background"
android:paddingBottom="@dimen/padding_one_half"
app:tabBackground="@drawable/tab_layout_selector"
app:tabIndicatorHeight="0dp"
app:tabMode="fixed"
app:tabPaddingEnd="@dimen/padding_one_half"
app:tabPaddingStart="@dimen/padding_one_half"
app:tabRippleColor="@null"
app:tabSelectedTextColor="@color/color_primary"
app:tabTextColor="@color/color_on_primary_unselected" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/account_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
My Main Activity 包含 NavigationController:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_background"
tools:context="com.x.x.android.ui.main.HomeActivity">
<fragment
android:id="@+id/home_nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/main_navigation" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/home_bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:menu="@menu/bottom_nav_menu"
android:elevation="@dimen/home_bottom_nav_elevation"
app:labelVisibilityMode="unlabeled"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
更新
我可以确认只有在我的 ViewPager 上设置适配器时才会发生这种情况。因此,如果我注释掉将适配器应用于 viewPager 的代码,颜色会按预期发生变化。
我刚刚解决了这个问题。在我在 ViewPager 中膨胀的片段中,我在这些的 onViewCreated 方法中设置了状态栏颜色,它覆盖了父片段,持有这个视图寻呼机!
我有一个 activity 带有 BottomNavigation 视图,可以导航到不同的片段。我想更改每个片段的状态栏颜色。这与包含 ViewPager 的一个片段不同。一旦我删除这个 ViewPager,状态栏颜色就会按我预期的那样改变,但是当我添加 ViewPager 时,状态栏颜色在 Fragment 膨胀时不会改变。 ViewPager 做了什么阻止这种颜色变化的发生?
我更改状态栏颜色的代码:
fun setStatusBarColor(@ColorRes colorRes: Int, isLight: Boolean) {
window?.apply {
statusBarColor = ContextCompat.getColor(this@BaseActivity, colorRes)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val lightFlag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR.with(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR)
} else {
View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
}
val darkFlag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
} else {
View.VISIBLE
}
decorView.systemUiVisibility = if (isLight) lightFlag else darkFlag
}
}
}
包含 ViewPager 的我的片段:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.x.x.android.ui.main.account.AccountFragment">
<include layout="@layout/include_header_user_profile" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/account_tab_layout"
android:layout_width="match_parent"
android:layout_height="36dp"
android:background="@drawable/tab_layout_background"
android:paddingBottom="@dimen/padding_one_half"
app:tabBackground="@drawable/tab_layout_selector"
app:tabIndicatorHeight="0dp"
app:tabMode="fixed"
app:tabPaddingEnd="@dimen/padding_one_half"
app:tabPaddingStart="@dimen/padding_one_half"
app:tabRippleColor="@null"
app:tabSelectedTextColor="@color/color_primary"
app:tabTextColor="@color/color_on_primary_unselected" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/account_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
My Main Activity 包含 NavigationController:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_background"
tools:context="com.x.x.android.ui.main.HomeActivity">
<fragment
android:id="@+id/home_nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/main_navigation" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/home_bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:menu="@menu/bottom_nav_menu"
android:elevation="@dimen/home_bottom_nav_elevation"
app:labelVisibilityMode="unlabeled"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
更新 我可以确认只有在我的 ViewPager 上设置适配器时才会发生这种情况。因此,如果我注释掉将适配器应用于 viewPager 的代码,颜色会按预期发生变化。
我刚刚解决了这个问题。在我在 ViewPager 中膨胀的片段中,我在这些的 onViewCreated 方法中设置了状态栏颜色,它覆盖了父片段,持有这个视图寻呼机!