如何在Android Fragment中处理返回按钮按下事件

4
我在我的应用程序中有3个片段,例如HomePage,Frag1,Frag2,Frag3,Frag4。 因此,在我的应用程序中使用了导航抽屉。在主页上,我有一个网格视图,其中包含所有四个片段的链接。 如果用户从Homepage -> Frag1 -> Frag1.2 ->Frag1.3 ->HomePage.导航。
因此,在按下返回键时,我想显示先前的片段,但一旦用户在主页上并按下返回键,我就想关闭我的应用程序。我不知道如何做到这一点。
以下是我从导航抽屉中调用片段的方式:
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添加到返回栈中?如果没有,那么你可以检查DrawerLayout是否可见,如果可见则隐藏它,如果不可见则关闭应用程序。 - DcodeChef
2
我已经发布了完整的内容,但你还在问:你是否将片段添加到返回堆栈中? - Pooja Dubey
好的,那么您没有添加到后退栈中。 然后按照我提到的步骤进行操作。 - DcodeChef
HomePage 是你的 Fragment 还是 Activity? - Piyush
1
嗨,我创建了一个仓库来展示解决方案。请查看。https://github.com/rathodchintan/Fragment-Back-Stack - Chintan Rathod
显示剩余3条评论
3个回答

6

按照以下方式添加您的片段:

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

这将清除先前片段的内存,当按下“返回”时,您将不会回到它们。

最后,在您的活动中实现:

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

如果你在第一个主页碎片中,执行此操作将关闭你的应用程序。

1
请明确说明在代码中我首先需要为fragmentManager做什么。 - Pooja Dubey
1
我正在使用以下导入: import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; import android.support.v4.widget.DrawerLayout; - Pooja Dubey
1
对不起,我请假了,忘记了这件事。我刚刚完成了。 - Pooja Dubey
@Dmide 你好,兄弟,你在吗? - Piyush
@Dmide 我已经尝试了,但它并没有按照你的解释工作。 - Piyush
显示剩余12条评论

2

只需使用addToBackStack(null)即可。

 fragTran.replace(R.id.content_frame, dashboardFragment);
        fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
         fragTran.addToBackStack(null);
        fragTran.commit();

如果您使用addToBackStack(null)添加新的片段,它将保存实例到内存中,并在按下返回键时弹出当前片段并加载上一个片段。


嘿,不需要做这些事情。如果你只想回到上一个片段,只需使用fragmentmanage.addToBackstack(null); 这将满足您的要求。 - Yashdeep Patel
我想展示先前的历史记录,但是如果用户在主页上按返回按钮,我想关闭应用程序。 - Pooja Dubey
那么,当用户在主页(第一个片段)上按下返回键时,您不想关闭应用程序,对吗? - Yashdeep Patel
我的应用程序有两种导航方式。第一种是通过GridView,第二种是通过导航抽屉。 如果用户在GridView中单击Frag1,那么我会有多个内部Frag,如Frag1-> Frag1.2-> Frag1.3等。在这里,如果他从导航抽屉中按home按钮,它将返回到主页。现在,如果他按回退键,则应用程序需要关闭,但实际上它显示了Frag1.3-> Fra1.2-> Frag1.1。 - Pooja Dubey
希望你明白我想表达的意思。 - Pooja Dubey
显示剩余4条评论

0

您可以为每个片段类单独设置静态标志。在片段的返回按键中,检查片段活动中的标志值。根据该值调用片段类的返回按键方法以执行操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接