Задать вопрос
@Eserchik

Корректная работа вложенных фрагментов с элементами меню ActionBar?

Здраствуйте, помогите найти решение?
Что есть:
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);
}


}
  • Вопрос задан
  • 2964 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@AndroidDev2015
Начал изучать Android/Java
С родительским фрагментом не пробовал, но делал с activity со вложенными фрагментами, отрисовку и обработку меню вывел в activity через интерфейс который слушал открытие и закрытие каждого фрагмента и соответственно изменял меню. Из activity управлять фрагментом можно разными способами.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Brief Москва
от 150 000 до 210 000 ₽
СМК-РК Москва
от 200 000 до 250 000 ₽
Crystal Service Integration Санкт-Петербург
от 200 000 ₽