安卓 - onBackPressed()对我不起作用

9
我有一个程序。第一个活动是启动画面,第二个是登录,第三个是列表视图菜单活动,然后是其他两个活动。启动画面在3秒后消失,如果登录复选框记住我被选中,则直接进入菜单页面。
我在菜单活动中重写了onBackPressed函数,以便在用户从菜单返回时直接退出程序。但是,如果我已经通过其他活动,它不会退出;它会转到堆栈中的上一个活动,并且对话框框不会弹出,尽管它实际上出现了一秒钟就立即消失了。

这是我的onBackPressed函数:

public void onBackPressed() {
    // super.onBackPressed();
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Are you Sure want to close the Application..?")
        .setCancelable(false)
        .setTitle("EXIT")
        .setNegativeButton("No", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
            }
        })
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                finish();
            }
        });
    AlertDialog alert = builder.create();
    alert.show();
    //super.onBackPressed();
}

1
你的问题是什么? - Blackbelt
3
哇,这里有6.5行文字,我找不到任何要点。你考虑提高语法水平,让文字易读一些如何?! - WarrenFaith
很抱歉,这是我第一次。 我的问题是程序没有退出,而是返回到堆栈中的上一个活动。 而且AlertDialog甚至没有出现。 - user2401745
@user2401745 不要着急,每个人都有第一次。 - Blackbelt
1
@user2401745 如果您能够清理一下问题,那就太好了。将这些单词组成句子。 - WarrenFaith
显示剩余7条评论
6个回答

9

更新-2022年6月19日

下面的答案已经过时。我们可以使用导航架构组件和工具栏,这样后退导航就会为我们处理,或者您可以查看https://developer.android.com/guide/navigation/navigation-custom-back

有关导航架构组件,请参见

https://developer.android.com/guide/navigation/navigation-getting-started

导航组件也适用于Compose https://developer.android.com/jetpack/compose/navigation

旧答案-已过时

我建议您像WarrenFaith在下面的评论中建议的那样使用ActionBar。请查看以下链接获取更多信息

http://developer.android.com/design/patterns/navigation.html

这是同样的教程

http://www.vogella.com/articles/AndroidActionBar/article.html

您可以使用此方法。但是,这似乎也是一种不良设计。您可以查看下面的评论以了解原因

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        onBackPressed();
    }
    return super.onKeyDown(keyCode, event);
}

public void onBackPressed() {
    Intent myIntent = new Intent(MyActivity.this, MainActivity.class);

    myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(myIntent);
    finish();
    return;
}

当您在当前活动中按下返回按钮时,您会清除活动堆栈并导航到MainActivity。

此外,我建议不要在按下返回按钮时显示警报对话框。这是一种糟糕的设计。您可以在SO上搜索。我读过同样的问题,并且由commonsware回答了。


稍等片刻。你说“关闭”对话框是一个糟糕的设计,但同时你建议打开一个新的Activity?你在开玩笑吗?这比一个询问我是否意外按下返回按钮的对话框还要糟糕... 返回按钮至少应该让我回到之前的页面,而不是进入一个新创建的活动! - WarrenFaith
3
实际上,这就是所谓的“导航”结构发挥作用的地方,它会告诉你:“嘿,你可以使用返回按钮,但如果你想回到首页,只需按我的操作栏中的图标,你就回到了首页”。即使新的SlideMenu也可以成为良好的用户体验解决方案。是的,我希望它能够让我回到40个屏幕之前,因为这是返回按钮存在的原因。你是否期望浏览器中的返回按钮将你带回起始页?在哪里区分“用户想要返回一步”和“他想要完全返回”?希望我表述清楚了。 - WarrenFaith
@WarrenFaith,明白了。我只是想要一些澄清而已。我正在编辑我的答案。 - Raghunandan
@WarrenFaith 感谢您的支持和详细的话题信息。 - Raghunandan
@WarrenFaith,您能否请检查一下这个链接中的问题和答案。我是否以正确的方式提出了建议?http://stackoverflow.com/questions/16709618/how-to-close-all-activities-while-pressing-hardware-home-button/16709885#comment24055228_16709885 - Raghunandan
显示剩余3条评论

2
@Override
public void onBackPressed() {
    super.onBackPressed();
    int count = getSupportFragmentManager().getBackStackEntryCount();
    Log.e("count", "is getBackStackEntryCount -> " + count);
    for (int i = 0; i < count; ++i) {
        getSupportFragmentManager().popBackStackImmediate();
        Log.e("getBackStack", "IS REMOVED " + i);
    }
    // toolbar.setTitle("Dashboard");
}

2

你可以像这样覆盖返回按钮

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        // write your code here
    }
    return true;
}

0

解决onBackKeypress()和显示对话框的问题。 如果您使用任何方法,如onkeyDown或onKeyUp,请检查Back键是否在其中使用。如果使用了,则覆盖该键或简单地从中删除。


0

在每个startActivity()后去掉finish();将允许正确的导航,而不必调用执行onDestroy()方法的finish();。谢谢。不需要重写onBackPressed函数。只有当您的活动不再需要并且应该关闭时才使用finish()。


这比为每个活动编写一个onPressedBack方法以进行导航,更不用说所有的警报对话框了。只是这么说。 - Junior Hernandez
在所有你不希望用户返回的活动中,比如登录,只需使用“finish”。 - Junior Hernandez

0
如果你正在使用 android.support.v7.app.ActionBar,那么请尝试使用以下代码替代 onBackPressed
    @Override
    public boolean onSupportNavigateUp() {
        // do your stuff

        return super.onSupportNavigateUp();
    }

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