Изменить панель инструментов из фрагмента - PullRequest
0 голосов
/ 29 апреля 2019

Я пишу приложение, используя Jetpack, рекомендуемая архитектура , NavigationUI и график навигации .Итак, у меня есть одно основное действие с Toolbar, BottomNavigationView и NavHostFragment.

. До сих пор все работало хорошо: мне нужно изменить Toolbar, чтобы использовать CollapsingToolbarLayout и скрытьBottomNavigationView в одном из моих фрагментов.

Я пытался добавить навигационный слушатель (как описано здесь ), чтобы скрыть мои 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);
  // ...
}

Он почти работает правильно, но:

  1. , когда я перемещаюсь вверх или иду к другомуфрагмент, BottomNavigationView отображается неправильно.Похоже, что его оттолкнул Toolbar.
  2. переход ужасен: панель инструментов заметно меняется, я вижу, как она исчезает перед изменением

Так что вопрос: есть ли другой способ изменить / скрыть элементы навигации из фрагмента?Если нет, я должен создать новую деятельность?

1 Ответ

0 голосов
/ 16 мая 2019

Это была дикая поездка, но я наконец нашел решение.Для проблемы номер 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 сейчас немного не хватает.

Вот некоторые ресурсы, которые мне помогли:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...