Обработка обратного нажатия при использовании фрагментов в Android
Я использую скользящее меню Android с помощью навигационного ящика в моем приложении, а фрагменты используются в приложении вместо действий. Когда я открываю ящик, нажмите на элемент, появляется фрагмент. Я перемещаюсь от одного фрагмента к другому, используя следующий код:
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;
}
это работает, но не большую часть времени. Я был бы очень признателен, если бы можно было показать лучший способ навигации назад.
4 ответов
Я обычно устанавливаю onKeyListener
до View
на 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;