从片段更改工具栏

时间:2019-04-29 06:56:57

标签: java android android-fragments android-jetpack

我正在使用jetpack recommended architectureNavigationUI, and the navigation graph编写应用。因此,我有一个主要活动,其中有一个Toolbar,一个BottomNavigationView和一个NavHostFragment

到目前为止,一切工作都很好:我需要将Toolbar更改为使用CollapsingToolbarLayout,并将BottomNavigationView隐藏在我的一个片段中。

我试图添加一个导航侦听器(如here所述,以隐藏我的ToolbarBottomNavigationView,在我的代码片段中,我给新的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);
  // ...
}

它几乎可以正常工作,但是:

  1. 当我向上导航或转​​到另一个片段时,BottomNavigationView无法正确显示。 Toolbar似乎已将其下推。
  2. 过渡很丑陋:工具栏正在明显改变,我可以看到它在改变之前就消失了

所以问题是:是否存在另一种方法来更改/隐藏片段中的导航元素?如果没有,我应该创建一个新活动吗?

1 个答案:

答案 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暂时还不够。

以下一些资源对我有帮助: