Здраствуйте, помогите найти решение?
Что есть:
Android 4.2.2(И устройство и эмулятор)
Задача:
Фрагмент(Со списком в ActionBar)->Нажимаем на элемент списка ->Запускам вложенный фрагмент, который должен добавить свои иконки в меню ActionBar, при этом список, который создал родительский фрагмент должен остаться.
Проблемма:
Родительский фрагмент содержит контейнер для вложенных фрагментов, а так же родительский фрагмент пересоздает Action Bar и добавляет в него список(меню навигации), при нажатии на элемент которого, отображается нужный вложенный фрагмент, который в свою очередь должен добавить в ActionBar свои элементы меню). Однако
при делегировании вложенному фрагменту, возможности управлять элементами меню(setHasOptionsMenu(true)), приложение начинает бесконечно пересоздавать этот самый вложенный фрагмент и подвисает. Если отключить делегирование, то вложенные фрагменты работают нормально, но не создают свои элементы меню
Вот что выдает
LogCat: Choreographer: Skipped 89 frames! The application may be doing too much work on its main thread.
Мой код:
Родительский фрагмент public class FragmentBugs extends Fragment implements ActionBar.OnNavigationListener{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_bugs_empty, container, false);
return rootView;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
restoreActionBar();
inflater.inflate(R.menu.menu_bugs, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
private void restoreActionBar(){
ActionBar actionBar = getActivity().getActionBar();
actionBar.removeAllTabs();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setIcon(R.drawable.ic_bug);
actionBar.setTitle(R.string.title_section5);
SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(getActivity(),
R.array.action_list_bugs, R.layout.simple_spinner_dropdown_item);
actionBar.setListNavigationCallbacks(mSpinnerAdapter, this);
}
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
// TODO Auto-generated method stub
FragmentManager fragmentManager = getChildFragmentManager();
switch(itemPosition){
case 0:
//Если вложенному фрагменту, я разрешу управление меню,
// то этот пункт будет выполняться бесконечно, пока приложение
// не зависнет
Log.d("MyLog", "Fr1");
fragmentManager.beginTransaction()
.replace(R.id.containerBugs, new BugsNewEventFragment(),"Fr1")
.addToBackStack(null)
.commit();
break;
case 1:
Log.d("MyLog", "Fr2");
fragmentManager.beginTransaction()
.replace(R.id.containerBugs, new BugsEventHistoryFragment(),"Fr2")
.addToBackStack(null)
.commit();
break;
}
return false;
}
}
Вложенный фрагмент:public class BugsNewEventFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);//Если поставить false, то этот вложенный фрагмент не добавит свои элементы меню, но будет нормально работать
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_bugs_new_event, container, false);
return rootView;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_bugs_new, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
}