Разная панель инструментов для фрагментов и Навигационный ящик

Пожалуйста, объясните мне... У меня есть ящик навигации в моем Activity, и он синхронизируется с Toolbar (например, ActionBar). Активность имеет несколько фрагментов, и в разных фрагментах мне нужно использовать разные режимы AppBar (параллакс в одном, просто в другом). Итак, я думаю, что я должен установить CoordinatorLayout в каждом frament с помощью AppBar и контента.
Но как я могу заменить последнюю панель инструментов на новую, чтобы сохранить синхронизацию с Drawer? Или это неправильно, и мне нужно сделать что-то еще?

Ответ 1

Если вы используете DrawerLayout и NavigationView для вашего навигационного ящика, лучшим решением по мне будет использование индивидуального DrawerLayout для каждого из макетов фрагментов и использование AppBarLayout в теле DrawerLayout по-разному для каждого из фрагментов.

Ответ 2

Не уверен, что мой подход хорош, но я попытался добавить этот публичный метод в свою деятельность:

public void setToolbar(Toolbar toolbar) {
    if(toolbar != null) {
        setSupportActionBar(toolbar);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();
    } else {
        drawer.setDrawerListener(null);
    }
}

и я добавил это во все фрагменты:

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    ((MainActivity)getActivity()).setToolbar(toolbar);
}

@Override
public void onDestroyView() {
    ((MainActivity)getActivity()).setToolbar(null);
    super.onDestroyView();
}

Он работает нормально, но я не уверен, может ли это вызвать утечку памяти или любую другую проблему с производительностью. Может быть, кто-то может с этим справиться?

Ответ 3

Вы можете получить доступ к основному DrawerLayout из каждого Fragment, как и следующий код:

    AppCompatActivity actionBar = (AppCompatActivity) getActivity();
    actionBar.setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout) actionBar.findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            getActivity(), drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

Ответ 4

Если вы хотите использовать панель инструментов (панель инструментов), указанную вами в навигационном ящике, в разных фрагментах, например, с различными пунктами меню, вы можете сделать общедоступный метод в главной операции, где вы указали логику ящика навигации.

public void setToolbar(Toolbar toolbar, String title){
    AppCompatActivity actionBar = this;
    actionBar.setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout)actionBar.findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toogle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.drawer_open, R.string.drawer_close);
    drawer.addDrawerListener(toogle);
    toogle.setDrawerIndicatorEnabled(true);
    toogle.syncState();
    if(toolbar != null)
        toolbar.setTitle(title);
}

Теперь вы можете использовать этот метод в своих фрагментах для доступа к основной панели инструментов и переопределения его с помощью настраиваемого заголовка, меню опций... Вы можете сделать это, создав новую переменную панели инструментов в своем фрагменте, а затем раздуйте ее в методе onCreateView, подобном этому

toolbarFragment = (Toolbar)getActivity().findViewById(R.id.toolbar);

R.id.toolbar - это идентификатор панели инструментов, которую вы указали в вашем файле макета, и это тот же идентификатор, который вы использовали в своей основной деятельности для основной панели инструментов. Теперь вы можете вызвать метод setToolbar (панель инструментов панели инструментов, название строки) в фрагменте, подобном этому

((MainActivity)getActivity()).setToolbar(toolbarFragment, "Some title");

Если вы хотите использовать меню опций для этого фрагмента, вы должны вызвать

setHasOptionsMenu(true);

в методах onCreate() или onCreateView(). После этого вы можете переопределить метод onCreateOptionsMenu() следующим образом

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.custom_menu1, menu);
}

Вы также можете повторить эту процедуру для других фрагментов в вашем навигационном ящике. Хотя это сработало для меня, я не знаю, нарушает ли это действие или фрагмент жизненного цикла или вызывает покрова памяти.