我正在尝试创建一个ViewPager
,其中包含一些UI元素,这些元素可按需显示/隐藏电子阅读器类型的应用程序。我遇到的问题是ViewPager
的尺寸会根据系统UI是否显示而变化。我看了很多示例,并尝试了许多不同的实现,但是我无法让ViewPager
忽略系统UI的更改。我可以实施解决方法,但我希望有人知道我在做什么错。
我的布局(简体):
<FrameLayout>
<ViewPager/>
<FrameLayout
...
android:fitsSystemWindows="true">
<ConstraintLayout>
<include layout="@layout/app_bar"/>
<include layout="@layout/bottom_bar"/>
<FloatingActionButton ... />
...
</ConstraintLayout>
</FrameLayout>
</FrameLayout>
我的活动(简体):
public class BookActivity {
protected void onCreate(...) {
super.onCreate(savedInstanceState);
setContentView(R.layout.book_activity);
...
viewPager.getViewTreeObserver().addOnGlobalLayoutListener(new
ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
viewPager.getViewTreeObserver().removeOnGlobalLayoutListener(this);
//do something with viewpager
//viewpager dimensions should stay the same regardless of system ui status
}
});
//hide the system ui on start
hideSystemUI();
}
private void hideSystemUI() {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_IMMERSIVE
// Set the content to appear under the system bars so that the
// content doesn't resize when the system bars hide and show.
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
// Hide the nav bar and status bar
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LOW_PROFILE);
}
private void showSystemUI() {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LOW_PROFILE);
}
}
在恢复系统用户界面后,ViewPager
的尺寸会缩小高度。
我以为SYSTEM_UI_FLAG_LAYOUT_STABLE
和SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
应该阻止这种情况。