我在我的应用程序中使用
Android滑块菜单,使用导航抽屉,而应用程序中使用Fragments,而不是活动.
当我打开抽屉时,点击一个片段出现的项目.我使用以下代码从一个片段移动到另一个片段:
当我打开抽屉时,点击一个片段出现的项目.我使用以下代码从一个片段移动到另一个片段:
- 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();
以这种方式,我可以从一个片段到另一个片段,但是我没有在后面的按钮按下来到前一个片段.我设法提出了这个代码来处理DraA被初始化的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设置为onResume中的View.从我学到的,你必须注意在View上设置setFocusableInTouchMode()和requestFocus.
这是我为此目的使用的示例:
- @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;
- }
- });
- }