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


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

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

Войти через центр авторизации
Похожие вопросы