我正在使用jetpack recommended architecture,NavigationUI, and the navigation graph编写应用。因此,我有一个主要活动,其中有一个Toolbar
,一个BottomNavigationView
和一个NavHostFragment
。
到目前为止,一切工作都很好:我需要将Toolbar
更改为使用CollapsingToolbarLayout
,并将BottomNavigationView
隐藏在我的一个片段中。
我试图添加一个导航侦听器(如here所述,以隐藏我的Toolbar
和BottomNavigationView
,在我的代码片段中,我给新的Toolbar
充气并调用setSupportActionBar()
上的主要活动。
// in MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
navController.addOnDestinationChangedListener((controller, destination, arguments) -> {
if(destination.getId() == R.id.detailFragment){
bottomBar.setVisibility(View.GONE);
topBar.setVisibility(View.GONE);
}else{
bottomBar.setVisibility(View.VISIBLE);
topBar.setVisibility(View.VISIBLE);
}
});
// ...
}
public void changeToolbar(Toolbar toolbar){
getSupportActionBar().hide();
setSupportActionBar(toolbar);
}
// in DetailFragment.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// ...
navController = NavHostFragment.findNavController(this);
AppBarConfiguration.Builder builder = new Builder(
R.id.accuracyFragment,
R.id.dataFragment,
R.id.magnetFragment,
R.id.settingsFragment);
AppBarConfiguration config = builder.build();
NavigationUI.setupWithNavController(toolbarLayout, toolbar, navController);
((MainActivity)getActivity()).changeToolbar(toolbar);
// ...
}
它几乎可以正常工作,但是:
BottomNavigationView
无法正确显示。 Toolbar
似乎已将其下推。所以问题是:是否存在另一种方法来更改/隐藏片段中的导航元素?如果没有,我应该创建一个新活动吗?
答案 0 :(得分:0)
这是一个疯狂的旅程,但我终于找到了解决方案。对于问题编号1,这是由于Android管理fitsSystemWindows
属性传播的方式。为了使其正常工作,我对布局进行了一些更改。我创建了一个自定义FitSystemWindowLinearLayout
,它只是一个扩展标准LinearLayout
并覆盖onApplyWindowInsets
的类,如下所示:
@Override
public WindowInsets onApplyWindowInsets(WindowInsets insets) {
int childCount = getChildCount();
for (int index = 0; index < childCount; ++index) {
getChildAt(index).dispatchApplyWindowInsets(insets);
}
return insets;
}
我的主要活动现在看起来像这样:
+-- CoordinatorLayout, fitsSystemWindows=false
+-- FitSystemWindowLinearLayout, fitsSystemWindows="false"
+-- Toolbar
+-- NavHostFragment, fitsSystemWindows="false"
+-- BottomNavigationView, fitsSystemWindows="false"
对于第二个问题,即过渡很丑陋,我通过在过渡中添加共享元素来缓解这种情况。
总而言之,我认为使用一种新的活动来处理这种事情会更容易,NavigationUI暂时还不够。
以下一些资源对我有帮助: