简体   繁体   English

如何在Fragment Android中处理onBack Press

[英]How to Handle onBack Press in Fragment Android

I have 3 Fragments in my application like HomePage , Frag1 ,Frag2,Frag3,Frag4. 我的应用程序中有3个片段,如HomePage , Frag1 ,Frag2,Frag3,Frag4.

So what is happening i have used navigation drawer in my application .On the home page i have a grid view that have the link of all the four fragments. 发生了什么我在我的应用程序中使用了导航抽屉。在主页上我有一个网格视图,其中包含所有四个片段的链接。 If the user navigates from Homepage -> Frag1 -> Frag1.2 ->Frag1.3 ->HomePage. 如果用户从Homepage -> Frag1 -> Frag1.2 ->Frag1.3 ->HomePage.导航Homepage -> Frag1 -> Frag1.2 ->Frag1.3 ->HomePage.

So onBack press i want to show the previous fragments but once the user in on the Home Page and if he press the back i want to close my application.I am not getting the way how we can do this. 所以onBack press我想显示以前的片段,但是一旦用户进入主页,如果他按下后面我想关闭我的应用程序。我不知道如何做到这一点。

This is how i am calling the Fragments from the Navigation Drawer : 这就是我从导航抽屉调用碎片的方式:

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 "";
        }
    }

This is how i am calling from the GridView onClick : 这是我从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();
                }
            }
        });

Add your fragments like this: 像这样添加你的片段:

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();

Then, when you click on your grid, just add them as shown above. 然后,当您单击网格时,只需添加它们,如上所示。 But if you click on item in nav drawer, do this before: 但是,如果您单击导航抽屉中的项目,请在执行此操作之前:

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

This will clear the memory of previous fragments and you will not go back to them on "back" pressed. 这将清除以前片段的记忆,并且您不会在“后退”按下时回到它们。

And finally, implement this in your activity: 最后,在您的活动中实现此功能:

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

This will finish your app if you are in your first home fragment. 如果您在第一个家庭片段中,这将完成您的应用程序。

Just Use addToBackStack(null); 只需使用addToBackStack(null);

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

So once you add new fragment with addToBackStack(null) It will save instance into memory and on back press it will pops up current fragment and load previous one. 所以一旦你用addToBackStack(null)添加新的片段,它会将实例保存到内存中,然后按下它会弹出当前片段并加载前一片段。

You can set static flag for each fragment class separately.& on backpress of fragment check value for flag in Fragment Activity. 您可以分别为每个片段类设置静态标志。在片段活动中标记的片段检查值的背板上。 & according to that call backpress method of fragment class for performing operations &根据片段类的调用backpress方法执行操作

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

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