我将setOnApplyWindowInsetsListener设置为应用程序的根视图,并获取导航栏更改的更新,但inset.systemWindowInsetBottom始终为0
override fun onStart() {
super.onStart()
layoutMain?.setOnApplyWindowInsetsListener { v, insets ->
layoutMain.updatePadding(bottom = insets.systemWindowInsetBottom)
insets
}
}
布局主是 MaincActivity 中的约束布局和根视图组
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/layoutMain"
android:fitsSystemWindows="true" ... >
在更多事情上,我使用以下标志:
window.addFlags(FLAG_LAYOUT_NO_LIMITS)
[使用以下教程:] 也是我对同一问题的另一个问题
创建示例项目并按照您的参考教程进行操作后,我发现了以下内容。
我发现了一些获得值systemWindowInsetBottom
为零的原因。
-
该值取决于
bottomNavigation
。如果您的系统后退按钮(软层(与bottomNavigation
重叠或您的bottomNavigation
完全隐藏,那么您将获得正确的值systemWindowInsetBottom
。 -
但是,如果您的
bottomNavigation
从系统软底层(后退按钮,主页按钮等(可见且以上,那么您将得到0。
下面的示例显示了我们何时可以得到零以及何时可以获得实际值。
如果添加此行,您将获得一些值,因为底部导航不可见mBinding.getRoot().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION)
;
但是,如果您删除该行或添加此行,您将始终为零。mBinding.getRoot().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
所以 vaue 取决于底部导航可见性状态
private ActivityMainBinding mBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mBinding.getRoot().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
if (navHostFragment != null) {
NavigationUI.setupWithNavController(mBinding.bottomNavigation, navHostFragment.getNavController());
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
mBinding.mainLayout.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
@Override
public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
Log.d("BottomTest", "padding: " + insets.getSystemWindowInsetBottom());
return insets;
}
});
}
}
从视图的源代码中,我们知道只有你设置了可以影响系统UI布局的标志(SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION或SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN(,你才能得到实际值。