简体   繁体   English

如何在多个片段中处理onBackPressed()

[英]How to handle onBackPressed() in multiple fragment

I am Android beginner, I am developing an app in which I have used multiple fragments through an activity. 我是Android初学者,正在开发一个应用程序,其中通过一个活动使用了多个片段。

private void displaySelectedScreen(int itemId) {
        Fragment fragment = null;
        switch (itemId) {

            case R.id.nav_home:
                fragment = new HomeFragment();
                break;

            case R.id.nav_attendance:
                fragment = new AttendanceFragment();
                break;

            case R.id.nav_notification:
                fragment = new NotificationFragment();
                break;

            case R.id.nav_event:
               fragment = new EventFragment();
                break;

            case R.id.nav_fee:
               fragment = new FeesFragment();
                break;

            case R.id.nav_news:
                fragment = new NewsFragment();
                break;

        }
        if (fragment != null) {
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.frame_container, fragment);
            ft.addToBackStack(null);
            ft.commit();
        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);

    }

and use an onBackPressed() method to close an app if the drawer is already close. 如果抽屉已经关闭,则使用onBackPressed()方法关闭应用程序。 Now I want to close an app if current fragment is HomeFragment and if current fragment is not HomeFragment then replace by HomeFragment . 现在,如果当前片段为HomeFragment且当前片段不是HomeFragment那么我想关闭一个应用程序,然后替换为HomeFragment I don't know, how it does? 我不知道是怎么回事?

public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        closeApp();
    }
}

You can add tag to your fragment. 您可以将标签添加到片段中。 in this way you will only have to check the tag name. 这样,您只需要检查标签名称即可。

Fragment fragment = new Fragment();
getFragmentManager().beginTransaction()
    .replace(R.id.FrameLayoutId,fragment,"TAG_NAME")
    .addToBackStack("SOURCE_TAG_NAME").commit(); 

This is how to check your fragment tag, put this checking on your backpress method on the activity or in your closeApp() method 这是检查片段标记的方法,将其放在活动的closeApp()方法或closeApp()方法中

function void closeApp(){
    Fragment fragment = getFragmentManager().findFragmentByTag("HomeActivity");
    if (fragment != null) {
        if(fragment.isVisible()){
            HomeActivity.this.finish(); 
        }
    }
}

For simple, just go to your HomeFragment.java and edit the method onBackPressed() to exit the application using finish() . 简单来说,只需转到HomeFragment.java并编辑onBackPressed()方法onBackPressed()使用finish()退出应用程序。
And for others Fragment.java , just use popBackStack() function, you can search for it here : https://developer.android.com/reference/android/app/FragmentManager.html#popBackStack() 对于其他Fragment.java ,只需使用popBackStack()函数,就可以在这里搜索: https : //developer.android.com/reference/android/app/FragmentManager.html#popBackStack()

In your MainActivity class override onBackPressed and display dialogbox there like this: 在您的MainActivity类中,重写onBackPressed并在其中显示对话框,如下所示:

@Override
public void onBackPressed() {
    //show dialog box here 
}

In each Fragment implement onResume() method with following code: 在每个Fragment使用以下代码实现onResume()方法:

     @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){
              //homefragment class name     
              Class fragmentClass = HomeFragment.class;

             try {

             Fragment  fragment = (Fragment) fragmentClass.newInstance();
             FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                        fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return true;

                }

                return false;
            }
        });
    }

Use this code onBackPressed() method in NavigationActivity. 在NavigationActivity中使用此代码onBackPressed()方法。 I hope that can solve you. 希望能解决您的问题。

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        Fragment f = getVisibleFragment();// to get which fragment now 
        if (f.getClass() != MainFragment.class) {
            Fragment fragment = null;
            try {
                fragment = (Fragment) MainFragment.class.newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }

            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.frame, fragment).commit(); // this is your framelayout
        }else {
            super.onBackPressed();
        }

    }
}

getVisibleFragment() function getVisibleFragment()函数

public Fragment getVisibleFragment() {
    FragmentManager fragmentManager = NavigationActivity.this.getSupportFragmentManager();
    List<Fragment> fragments = fragmentManager.getFragments();
    if (fragments != null) {
        for (Fragment fragment : fragments) {
            if (fragment != null && fragment.isVisible())
                return fragment;
        }
    }
    return null;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM