Обращение к прессе при использовании фрагментов в Android

Я использую Android Sliding Menu с помощью навигационного ящика в своем приложении, а фрагменты используются вместо приложения. Когда я открываю ящик, щелкните по элементу, где появится фрагмент. Я перехожу из одного фрагмента к другому фрагменту, используя следующий код:

Fragment fragment = null; fragment = new GalleryFragment(selectetdMainMenu.getCategoryID()); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.addToBackStack("menuFrag"); ft.add(R.id.frame_container, fragment, "menuFrag"); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); 

Таким образом, я могу перейти от одного фрагмента к другому, но я не могу вернуться к предыдущему фрагменту на кнопке «Назад». Мне удалось найти этот код для обращения к прессе в MainActivity, где Инициализируется ящик:

 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { super.onKeyDown(keyCode, event); if (keyCode == KeyEvent.KEYCODE_BACK) { Fragment fragment_byTag = fragmentManager.findFragmentByTag("menuFrag"); Fragment menuFragment_by_tag = fragmentManager.findFragmentByTag("galleryFrag"); Fragment commentsFrag_by_tag = fragmentManager.findFragmentByTag("commentsFrag"); Fragment dealDetail = fragmentManager.findFragmentByTag("promoFrag"); if(commentsFrag_by_tag != null){ if (commentsFrag_by_tag.isVisible()) { Log.e("comments back ", " clicked"); //menuDetailsFrag.onBackPressed(); FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction().remove(commentsFrag_by_tag).commit(); fragmentManager.beginTransaction().show(menuFragment_by_tag).commit(); } }else if(menuFragment_by_tag.isVisible()){ Log.e("menu back ", " clicked"); menuDetailsFrag.onBackPressed(); FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction().remove(menuFragment_by_tag).commit(); fragmentManager.beginTransaction().show(fragment_byTag).commit(); } } return false; } 

Это работает время от времени, но в большинстве случаев это не так. Я был бы очень признателен, если будет показан лучший способ перемещения назад.

Обычно я устанавливаю onKeyListener в View in onResume . Из того, что я узнал, вам нужно позаботиться о настройке setFocusableInTouchMode() и requestFocus в View .

Это пример того, что я использую для этой цели:

 @Override public void onResume() { super.onResume(); getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){ // handle back button return true; } return false; } }); } 

Попробуйте эти методы. Для меня наиболее полезным решением является следующее:

В MainActivity:

 getSupportFragmentManager().beginTransaction().replace(R.id.gif_contents, gifPageTwoFragment, "gifPageTwoFragment").addToBackStack("gifPageTwoFragment").commit(); 

В GifPageTwoFragment:

 @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { Log.e("gif--","fragment back key is clicked"); getActivity().getSupportFragmentManager().popBackStack("gifPageTwoFragment", FragmentManager.POP_BACK_STACK_INCLUSIVE); return true; } return false; } }); } 

В вашем методе oncreateView () вам нужно написать этот код, а в KEYCODE_BACk вы можете написать любую функциональность, которую вы хотите

  View v = inflater.inflate(R.layout.xyz, container, false); //Back pressed Logic for fragment v.setFocusableInTouchMode(true); v.requestFocus(); v.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { if (keyCode == KeyEvent.KEYCODE_BACK) { getActivity().finish(); Intent intent = new Intent(getActivity(), MainActivity.class); startActivity(intent); return true; } } return false; } }); 
  view.setFocusableInTouchMode(true); view.requestFocus(); view.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { Fragment NameofFragment = new NameofFragment; FragmentTransaction transaction=getFragmentManager().beginTransaction(); transaction.replace(R.id.frame_container,NameofFragment); transaction.commit(); return true; } return false; } }); return view;