android - 如何在 Fragment Android 中处理 onBackPressed

标签 android android-fragments

我的应用程序中有 3 个 fragment ,例如 HomePage、Frag1、Frag2、Frag3、Frag4。

那么发生了什么我在我的应用程序中使用了抽屉导航。在主页上我有一个 GridView ,其中包含所有四个 fragment 的链接。 如果用户从 Homepage -> Frag1 -> Frag1.2 ->Frag1.3 ->HomePage.

导航

所以按下后退键我想显示之前的 fragment 但是一旦用户进入主页并且如果他按下后退键我想关闭我的应用程序。我不知道我们如何做到这一点。

这就是我从 Navigation Drawer 调用 fragment 的方式:

protected void getUrl(int position) {
        FragmentTransaction fragTran = getSupportFragmentManager()
                .beginTransaction();
        switch (position) {
        case 0:
            fragTran.replace(R.id.content_frame, dashboardFragment);
            fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
            // fragTran.addToBackStack(null);
            fragTran.commit();
            break;
        case 1:

            if (CommonUtils.isNetworkConnected(getApplicationContext())) {
                fragTran.replace(R.id.content_frame, frag1);
                fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                fragTran.addToBackStack(null);
                fragTran.commit();

            } else {
                Toast.makeText(getApplicationContext(),
                        "No Network Connection", Toast.LENGTH_LONG).show();
            }
            break;
        case 2:

            if (CommonUtils.isNetworkConnected(getApplicationContext())) {
                fragTran.replace(R.id.content_frame, frag2);
                fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                fragTran.addToBackStack(null);
                fragTran.commit();

            } else {
                Toast.makeText(getApplicationContext(),
                        "No Network Connection", Toast.LENGTH_LONG).show();
            }
            break;
        case 3:
            if (CommonUtils.isNetworkConnected(getApplicationContext())) {
                fragTran.replace(R.id.content_frame, frag3);
                fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                fragTran.addToBackStack(null);
                fragTran.commit();

            } else {
                Toast.makeText(getApplicationContext(),
                        "No Network Connection", Toast.LENGTH_LONG).show();
            }

            break;



        default:
            // return "";
        }
    }

这就是我从 GridView onClick 调用的方式:

final FragmentTransaction fragTran = getFragmentManager()
                .beginTransaction();

        gridView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View v, int arg2,
                    long arg3) {
                if (DASHBOARD_LINKS[arg2].equals("frag1")) {
                    if (CommonUtils.isNetworkConnected(getActivity())) {
                        fragTran.replace(R.id.content_frame,
                                frag1);
                        fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                        fragTran.addToBackStack(null);
                        fragTran.commit();
                    } else {
                        Toast.makeText(getActivity(), "No Network Connection",
                                Toast.LENGTH_LONG).show();
                    }
                }
                if (DASHBOARD_LINKS[arg2].equals("frag2")) {
                    fragTran.replace(R.id.content_frame, frag2);
                    fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                    fragTran.addToBackStack(null);
                    fragTran.commit();
                }
                if (DASHBOARD_LINKS[arg2].equals("frag3")) {
                    fragTran.replace(R.id.content_frame, frag3);
                    fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                    fragTran.addToBackStack(null);
                    fragTran.commit();
                }
            }
        });

最佳答案

像这样添加你的 fragment :

int count = fragmentManager.getBackStackEntryCount();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.content_frame, dashboardFragment)
        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
        .addToBackStack(String.valueOf(count))
        .commit();

然后,当您单击您的网格时,只需如上所示添加它们。但是,如果您单击抽屉导航中的项目,请先执行此操作:

fragmentManager.popBackStackImmediate("0", 0); // "0" here is a tag of transaction you added before. "0" is for first added fragment (your home fragment, I assume). You can pop back stack to second with "1", if you like

这将清除之前 fragment 的内存,并且您不会在按下“后退”时返回到它们。

最后,在您的 Activity 中实现这一点:

@Override
public void onBackPressed() {
    if (fragmentManager.getBackStackEntryCount() <= 1) {
        finish();      
        return;
    }
    super.onBackPressed();
}

如果您在第一个主页 fragment 中,这将完成您的应用程序。

关于android - 如何在 Fragment Android 中处理 onBackPressed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22320044/

相关文章:

android - AOSP的libc++.so和NDK的libc++_shared.so一样吗?

android - 无法运行 adb reverse (React-Native)

android - 方向更改后 fragment saveInstanceState 变为空

android - ApiDemos 示例中 FragmentLayout 类中的奇怪 FragmentTransaction

android - 从一个 fragment 调用另一个 fragment

android - NFC 的编程 Intent 过滤器

android - ActiveAndroid 不支持 byte[]?

android - 运行时权限异常

android - 更改 Spinner 的外观

android - 动态更新 ViewPager?