在Android中使用片段时处理后退

Tha*_*ana 11 navigation android back android-fragments navigation-drawer

我在我的应用程序中使用导航抽屉使用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();
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以从一个片段转到另一个片段但是我无法按下后退按钮上的前一个片段.我设法提出这个代码来处理MainActivity中的反压,其中Drawer初始化:

@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;
}
Run Code Online (Sandbox Code Playgroud)

这有时会起作用,但大部分时间都会失败.如果可以显示更好的导航方式,我将不胜感激.

sup*_*qua 56

我通常设置onKeyListenerViewin onResume.从我所学到的,你必须要小心设置setFocusableInTouchMode()requestFocusView.

这是我用于此目的的示例:

@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;
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您在片段中有可以获得焦点的子视图,这将停止工作.例如,如果片段中有"列表状态"和"编辑状态",则进入"编辑状态",其中包含"EditText",选择"EditText",主视图将失去焦点, `onKey()`将停止运行,除非您手动重新获得基本视图的焦点. (6认同)

小智 5

试试这些方法.对我来说,最有用的解决方案如下:

在MainActivity中:

getSupportFragmentManager().beginTransaction().replace(R.id.gif_contents, gifPageTwoFragment, "gifPageTwoFragment").addToBackStack("gifPageTwoFragment").commit();
Run Code Online (Sandbox Code Playgroud)

在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;
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)