10

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

ответ

-1

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

+1

Это единственное решение?Мне нужно будет снова подключить почти всю иерархию представлений. –

+0

Вы должны понимать, что вы пытаетесь изменить вид тела, а не родительский вид, потому что AppBarLayout остается встроенным в тело DrawerLayout. Таким образом, лучшей практикой было бы переопределить макет. Если ваш NavigationView идентичен для всех фрагментов, вы можете записать его в отдельный файл макета xml и использовать , который может сократить ваш код. –

+0

Хорошо, спасибо! Просто я думаю, что это решение может занять много времени при переключении фрагментов. Но я буду использовать его. –

5

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

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(); 
} 

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

+0

Я решил эту проблему. Просто я использую 'DrawerLayout' в макете действий и' Toolbar' в макетах фрагментов, где в 'onCreateView' устанавливается' Toolbar' как 'ActionBar' и синхронизируется с' DrawerLayout'. –

+0

И ваше решение не имеет утечек памяти) –

+1

@ Шах Вы хотели бы подробнее рассказать о том, как вы синхронизируетесь с 'DrawerLayout' из фрагмента' onCreateView'? Вы заново создаете «ActionBarDrawerToggle» для каждого фрагмента «Панель инструментов»? Вы используете конструктор 'DrawerLayout' с или без,' Панель инструментов'? – jayeffkay

1

Вы можете получить доступ к основному 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(); 
+0

Можете ли вы описать деятельность и фрагменты? Все ли фрагменты имеют собственные панели инструментов или используют действия? У меня есть активность с DrawerLayout и NavigationView, внутри которой размещены фрагменты, они содержат CoordinatorLayout, AppBarLayout, Панель инструментов, но это работает плохо, панели инструментов не выглядят так, как я хочу, когда изменяют фрагменты. – CoolMind

0

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

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); 
} 

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

+0

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

+0

Просто у меня были фрагменты с заголовком параллакса, путь навигации (например, в некоторых ящиках файлов) и т. Д. –

Смежные вопросы