在导航抽屉中具有多个片段的活动中按后退按钮时退出应用程序

时间:2014-06-18 04:47:20

标签: android android-fragments navigation-drawer

我正在开发一款需要导航抽屉的应用。这个应用程序有1个MainActivity和大约10个片段。当我单击MainActivity中的导航抽屉图标时,它将显示10个片段,以便我可以选择每个片段。

我选择片段A,然后选择B,然后选择C ...到F。当我在片段F并按下后退按钮时,它会将我带回片段E,然后再返回它将带我去片段D ......

我的问题是,当我回到片段A(当然是来自片段B)并再次按下“返回”按钮时,它会将我带到一个空白的白色屏幕(我认为这是主要的活动布局)。然后再按回来,应用程序将退出。

我想要的是当我回到片段A(最后一个片段)并点击返回时,应用程序将立即退出,而不是空白的白色屏幕

我搜索了SO并找到了1个类似的问题,但还没有答案,所以我不得不提出另一个问题

我该怎么做? 非常感谢你

11 个答案:

答案 0 :(得分:9)

在最后一个屏幕退出应用

  public void onBackPressed() {

    if (manager.getBackStackEntryCount() > 1 ) {
        // If there are back-stack entries, leave the FragmentActivity
        // implementation take care of them.
        manager.popBackStack();

    } else {
        // Otherwise, ask user if he wants to leave :)
        new AlertDialog.Builder(this)
                .setTitle("Really Exit?")
                .setMessage("Are you sure you want to exit?")
                .setNegativeButton(android.R.string.no, null)
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface arg0, int arg1) {
                        MainActivity.super.onBackPressed();
                    }
                }).create().show();
    }
}

答案 1 :(得分:6)

从Fragment A中删除addToBackStack()。 希望有所帮助。

答案 2 :(得分:5)

我想我是另一个没有回答问题的人,所以我想告诉你我的解决方法:

我检查FrameLayout中是否有一个孩子。如果有的话,我会回去一个片段。然后再检查一下。因为我确实只知道白色屏幕,所以我需要在它之后检查0个孩子。如果还存在另一个片段,则无处可做,但如果childs == 0,则要求离开活动。

或者,如果您到达最后一个片段,则可以删除AlertDialog并关闭应用程序。

@Override
public void onBackPressed() {
    FrameLayout fl = (FrameLayout) findViewById(R.id.content_frame);
    if (fl.getChildCount() == 1) {
        super.onBackPressed();
        if (fl.getChildCount() == 0) {
            new AlertDialog.Builder(this)
                    .setTitle("Close App?")
                    .setMessage("Do you really want to close this beautiful app?")
                    .setPositiveButton("YES",
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog,
                                        int which) {
                                    finish();
                                }
                            })
                    .setNegativeButton("NO",
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog,
                                        int which) {
                                }
                            }).show();
            // load your first Fragment here
        }
    } else if (fl.getChildCount() == 0) {
        // load your first Fragment here
    } else {
        super.onBackPressed();
    }
}

答案 3 :(得分:4)

我刚刚解决了类似的问题。我改编了Ali Azhar的解决方案。由于我有一个启动画面活动,我不想终止应用程序,否则当我尝试恢复应用程序(按下手机上的活动应用程序按钮并选择应用程序)时,应用程序将卡在启动屏幕而不进入我的主要活动。而不是

MainActivity.super.onBackPressed();

我用过这个:

moveTaskToBack(true);

显示主屏幕。我不需要用户进行任何退出确认,因此我删除了对话框代码。我还想调整我的 replaceFragment(targetFragment,fragmentNameInBackStack)方法,以避免将片段添加到backstack,如果它是第一个片段,但事实证明没有必要这样做,因为我们制作如果backstack中的一个片段更多,那么管理器会从后台弹出,所以如果只有一个片段,那就没问题了,我们就退出了。它很好,因为我想在不同的屏幕/片段之间保留我的后导航行为。所以这是代码:

@Override
public void onBackPressed() {
    FragmentManager manager = getSupportFragmentManager();
    if (manager.getBackStackEntryCount() > 1 ) {
        manager.popBackStack();
    } else {
        // if there is only one entry in the backstack, show the home screen
        moveTaskToBack(true);
    }
}

答案 4 :(得分:1)

简单方法退出您的应用只需粘贴下面的代码

 @Override
    public void onBackPressed() {
        FragmentManager manager = getSupportFragmentManager();

        if (manager.getBackStackEntryCount() > 1) {
            // If there are back-stack entries, leave the FragmentActivity
            // implementation take care of them.
            manager.popBackStack();

        } else {
            // Otherwise, ask user if he wants to leave :)
            new AlertDialog.Builder(this)
                    .setTitle("Really Exit?")
                    .setMessage("Are you sure you want to exit?")
                    .setNegativeButton(android.R.string.no, null)
                    .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface arg0, int arg1) {
                            // MainActivity.super.onBackPressed();
                            finish();
                            moveTaskToBack(true);
                        }
                    }).create().show();
        }

答案 5 :(得分:1)

使用此方法。.简便的解决方法,但对我来说效果很好。您点击最后一个打开的片段后,将关闭应用程序。

@Override
public void onBackPressed() {
    if(getSupportFragmentManager().getBackStackEntryCount() == 1) {
        moveTaskToBack(false);
    }
    else {
        super.onBackPressed();
    }
}

答案 6 :(得分:0)

在onBack方法中,检查with片段管理器中没有可用的片段...如果它的1,则使用move taskback方法关闭应用程序

答案 7 :(得分:0)

我猜您可以避免按下后退按钮或按下后退按钮上的活动。一般情况下,如果您使用的是导航抽屉,那么根本不是问题,但您可以尝试。

    @Override
public void onBackPressed()
{
    // Do Here what ever you want do on back press;
}

或者你可以去导航抽屉 http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/

答案 8 :(得分:0)

这对我有用。

如果从MainActivity调用

supportFinishAfterTransition();

如果从片段

调用
getActivity().supportFinishAfterTransition();

答案 9 :(得分:0)

很晚才回答。但我希望至少能帮到任何人。

在下面的代码的帮助下,我实现双后退退出(它给Toast &#34;请再次点击返回退出&#34; 如果再次按下则只有应用程序退出。)< / p>

getBackStackEntryCount() - 提供后台堆栈碎片的当前计数。

  

int backStackEntryCount = getSupportFragmentManager()。getBackStackEntryCount();

如果此值== 0,则后备堆栈中没有可用的片段。所以执行双后退退出代码。

否则允许使用 super.onBackPressed();

进行背压操作
@Override
public void onBackPressed() {

    int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
    //backStackEntryCount==0 -> no fragments more.. so close the activity with warning
    if (backStackEntryCount == 0){

        if (homePressed) {
            if (doubleBackToExitPressedOnce) {
                super.onBackPressed();

                return;
            }

            this.doubleBackToExitPressedOnce = true;
            Toast.makeText(this, "Please click back again to exit", Toast.LENGTH_SHORT).show();

            new Handler().postDelayed(new Runnable() {

                @Override
                public void run() {
                    doubleBackToExitPressedOnce = false;
                }
            }, 2000);
        } else {
            homePressed = true;
        }

}
    //some fragments are there.. so allow the back press action
    else {
        super.onBackPressed();
    }

}    

全局声明这些变量

boolean homePressed = true, doubleBackToExitPressedOnce = false;

答案 10 :(得分:0)

这对我有用(退出双击以退出Fragment)

  int backButtonCount = 0;


@SuppressLint({"ResourceAsColor", "ResourceType"})
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_home, container, false);
    //binding fragment view

    view.setFocusableInTouchMode(true);
    view.requestFocus();
    view.setOnKeyListener((v, keyCode, event) -> {
        Log.i("Fragment_Home", "keyCode: " + keyCode);
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {

            Log.e(TAG, "onCreateView: " + "Fragment Hom Key up");


            if (backButtonCount >= 1) {
                Intent intent = new Intent(Intent.ACTION_MAIN);
                intent.addCategory(Intent.CATEGORY_HOME);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                startActivity(intent);
                 getActivity().finish();


            } else {
                Toast.makeText(getContext(), "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
                backButtonCount++;


                new Handler().postDelayed(() -> {

                    backButtonCount = 0;

                }, 2000);

            }