如何处理onBack preSS的片段的Andr​​oid [英] How to Handle onBack Press in Fragment Android

查看:97
本文介绍了如何处理onBack preSS的片段的Andr​​oid的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有3个片段在我的应用程序,如首页,Frag1,Frag2,Frag3,Frag4。

所以发生的我用抽屉式导航在我的应用程序。对主页我有一个网格视图具有所有的四个片段的链接。 如果用户从导航主页 - > Frag1 - > Frag1.2 - > Frag1.3 - >首页

所以onBack preSS我想表现出previous片段,但一旦在主页上,如果用户自己preSS我要关闭我的application.I我没有得到的方式回我们如何能做到这一点。

这是我如何打电话从导航抽屉的片段:

 保护无效的getURL(INT位置){
        FragmentTransaction fragTran = getSupportFragmentManager()
                .beginTransaction();
        开关(位置){
        情况下0:
            fragTran.replace(R.id.content_frame,dashboardFragment);
            fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
            // fragTran.addToBackStack(空);
            fragTran.commit();
            打破;
        情况1:

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

            } 其他 {
                Toast.makeText(getApplicationContext(),
                        没有网络连接,Toast.LENGTH_LONG).show();
            }
            打破;
        案例2:

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

            } 其他 {
                Toast.makeText(getApplicationContext(),
                        没有网络连接,Toast.LENGTH_LONG).show();
            }
            打破;
        案例3:
            如果(CommonUtils.isNetworkConnected(getApplicationContext())){
                fragTran.replace(R.id.content_frame,frag3);
                fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                fragTran.addToBackStack(空);
                fragTran.commit();

            } 其他 {
                Toast.makeText(getApplicationContext(),
                        没有网络连接,Toast.LENGTH_LONG).show();
            }

            打破;



        默认:
            // 返回 ;
        }
    }
 

这是我如何从 GridView控件的onClick要求:

 最后FragmentTransaction fragTran = getFragmentManager()
                .beginTransaction();

        gridView.setOnItemClickListener(新OnItemClickListener(){
            @覆盖
            公共无效onItemClick(适配器视图<>为arg0,视图V,INT ARG2,
                    长ARG3){
                如果(DASHBOARD_LINKS [ARG2] .equals(frag1)){
                    如果(CommonUtils.isNetworkConnected(getActivity())){
                        fragTran.replace(R.id.content_frame,
                                frag1);
                        fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                        fragTran.addToBackStack(空);
                        fragTran.commit();
                    } 其他 {
                        Toast.makeText(getActivity(),无网络连接,
                                Toast.LENGTH_LONG).show();
                    }
                }
                如果(DASHBOARD_LINKS [ARG2] .equals(frag2)){
                    fragTran.replace(R.id.content_frame,frag2);
                    fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                    fragTran.addToBackStack(空);
                    fragTran.commit();
                }
                如果(DASHBOARD_LINKS [ARG2] .equals(frag3)){
                    fragTran.replace(R.id.content_frame,frag3);
                    fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                    fragTran.addToBackStack(空);
                    fragTran.commit();
                }
            }
        });
 

解决方案

添加您的片段是这样的:

 诠释计数= fragmentManager.getBackStackEntryCount();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.content_frame,dashboardFragment)
        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
        .addToBackStack(将String.valueOf(计数))
        。承诺();
 

然后,当你点击你的网格,只需添加它们,如上图所示。但是,如果你点击导航抽屉里的项目,这样做之前:

  fragmentManager.popBackStackImmediate(0,0); //0这里是你前加入交易的标签。 0是第一次添加片段(你家的片段,我假设)。你可以弹回栈来第二位1,如果你喜欢
 

这将清除previous片段的记忆,你会不会回去给他们的回pressed。

最后,在你的活动实现的:

  @覆盖
公共无效onBack pressed(){
    如果(fragmentManager.getBackStackEntryCount()&其中; = 1){
        完();
        返回;
    }
    super.onBack pressed();
}
 

如果你在你的第一个主场片段这将完成您的应用程序。

I have 3 Fragments in my application like 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.

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.

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 :

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.

这篇关于如何处理onBack preSS的片段的Andr​​oid的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆