在退出应用程序之前对片段添加操作

时间:2018-11-12 13:40:17

标签: java android android-fragments fragment-backstack

我在编码方面有一个小问题。

我的目标:我有2个片段[0]和[1]。我的默认片段是[0]。按下[1]后,我按返回键,然后返回到片段[0](而不是关闭应用程序)。

这是一个可以正常工作的代码,

知道片段[1]已经在堆栈中:

getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new FragmentUn().addToBackStack(null).commit();

这是backPressed上的代码:

@Override
public void onBackPressed() {
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);

    } else if (getFragmentManager().getBackStackEntryCount() > 0){
            getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }

}

这段代码很好用,但是我想做的是一次添加一个动作(popUp)到达片段[0],该片段询问用户在按下返回键时是否要离开应用程序(此处应用程序仅关闭)

为此,我写道:

@Override
    public void onBackPressed() {
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);

        } else if (getFragmentManager().getBackStackEntryCount() > 0){
            getFragmentManager().popBackStack();
        } else {
            AlertDialog.Builder exitPopUp = new AlertDialog.Builder(this);
            exitPopUp.setTitle("Exit");
            exitPopUp.setMessage("Voulez-vous quitter L'App ?");
            exitPopUp.setPositiveButton("Oui", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    finish();
                }
            });
            exitPopUp.setNegativeButton("Non", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {

                }
            });
            exitPopUp.setNeutralButton("Noter", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    Uri uri = Uri.parse("market://details?id=" + getApplicationContext().getPackageName());
                    Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
                    // To count with Play market backstack, After pressing back button,
                    // to taken back to our application, we need to add following flags to intent.
                    goToMarket.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY |
                            Intent.FLAG_ACTIVITY_NEW_DOCUMENT |
                            Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
                    try {
                        startActivity(goToMarket);
                    } catch (ActivityNotFoundException e) {
                        startActivity(new Intent(Intent.ACTION_VIEW,
                                Uri.parse("http://play.google.com/store/apps/details?id=" + getApplicationContext().getPackageName())));
                    }
                }
            });

            exitPopUp.show();
        }
}

结果==>在片段[0]或[1]上按回车键时,应用程序立即显示弹出窗口。除了我只希望到达显示弹出窗口的片段[0]之外。 [1]-返回键-> [0]-返回键->退出弹出窗口。

那我该怎么做才能使其正常工作?预先谢谢你:)

2 个答案:

答案 0 :(得分:0)

    @Override
        public void onBackPressed() {
            super.onBackPressed();
            MainFragment main = (MainFragment) getSupportFragmentManager().findFragmentByTag("main");
            if (main != null && main.isVisible()) {
                if (mExitCheck < 1) {
                    Toast.makeText(this, "Press back again to exit", Toast.LENGTH_SHORT).show();
                } else {
                    //mExitCheck = 0 is an int
                    mExitCheck = 0;

                    //Finish() to exit the app
                    finish();
                }
                mExitCheck++;
            } else {
                showMain();
            }
        }

答案 1 :(得分:0)

最简单的方法是将int设置为0(或任何使您知道自己位于第一个片段上的标志)。

    //do this for your first fragment
    Fragment fragment = MainFragment.newInstance();
    FragmentTransaction transaction = 
    getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.layout_container, fragment, "main").commit();
    mCurrentFrag = 0;

    // and this for others
    Fragment fragment = MainFragment.newInstance();
    FragmentTransaction transaction = 
    getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.layout_container, fragment, "main").commit();
    mCurrentFrag = 1;

然后执行以下操作

@Override
public void onBackPressed() {
    if (mCurrentFrag == MAIN_FRAG){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                AlertDialog.Builder exitPopUp = new AlertDialog.Builder(MainActivity.this);
                exitPopUp.setTitle("Exit");
                exitPopUp.setMessage("Are you sure you want to exit?");
                exitPopUp.setPositiveButton("Oui", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        finish();
                    }
                });
                exitPopUp.setNegativeButton("Non", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {

                    }
                });
                exitPopUp.setNeutralButton("Noter", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Uri uri = Uri.parse("market://details?id=" + getApplicationContext().getPackageName());
                        Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
                        goToMarket.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY |
                                Intent.FLAG_ACTIVITY_NEW_DOCUMENT |
                                Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
                        try {
                            startActivity(goToMarket);
                        } catch (ActivityNotFoundException e) {
                            startActivity(new Intent(Intent.ACTION_VIEW,
                                    Uri.parse("http://play.google.com/store/apps/details?id=" + getApplicationContext().getPackageName())));
                        }
                    }
                });

                exitPopUp.show();
            }
        });
    }else{
        super.onBackPressed();
    }
}