在 Android 中使用片段时处理回按

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22552958/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 06:10:16  来源:igfitidea点击:

Handling back press when using fragments in Android

androidandroid-fragmentsnavigationbacknavigation-drawer

提问by TharakaNirmana

I am using Android Sliding Menu using Navigation Drawer in my application and Fragments are used in the app instead of Activities. When I open the drawer, click on an item a Fragment appears. I move from one fragment to another fragment using the following code:

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

In this way I can go from one fragment to another but I fail to come to the previous fragment on back button press. I managed to come up with this code to handle back press in MainActivity where Drawer is Initialized:

通过这种方式,我可以从一个片段转到另一个片段,但是我无法在按下后退按钮时到达上一个片段。我设法想出了这个代码来处理在 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;
}

This works at times but fails most of the time. I would greatly appreciate if a better way to navigate back can be shown.

这有时有效,但大多数时候失败。如果可以显示更好的导航方式,我将不胜感激。

回答by super-qua

I usually set an onKeyListenerto the Viewin onResume. From what I learned you have to take care to set setFocusableInTouchMode()and requestFocuson the View.

我通常将 an 设置onKeyListenerViewin onResume。根据我的了解,您必须小心设置setFocusableInTouchMode()requestFocus打开View.

This is a sample of what I use for this purpose:

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

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

回答by renhui

Try these methods. To me, the most useful solution is as follows:

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

In MainActivity:

在主活动中:

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

In GifPageTwoFragment:

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

回答by Raj Kumar

In your oncreateView() method you need to write this code and in KEYCODE_BACk condition you can write whatever the functionality you want

在您的 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;
        }
    });

回答by Ashish Soni

        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;