【问题标题】:Stop showing dialog box after pressing back按返回后停止显示对话框
【发布时间】:2017-11-06 17:08:31
【问题描述】:

好的,所以我有 3 个活动(A、B、C) 活动 A 是主要活动。 在活动 A 中,我有一个密码对话框和一个按钮(通向活动 B 的按钮)。

所以,当我打开我的应用程序时,会出现密码对话框。现在我的问题是,每当我在活动 B 中并按下返回按钮导致活动 A 时,密码对话框都会不断出现。我想要的是,密码对话框只有在我打开我的应用程序时才会出现,而不是当我从活动 B 回到活动 A 时才会出现。

活动 B

public void onBackPressed() {

        AlertDialog.Builder adb = new AlertDialog.Builder(Form.this);
        adb.setTitle("Go back to Activity A?"); 
        adb.setCancelable(false);
        adb.setNegativeButton("Cancel", null);
        adb.setPositiveButton("Exit", new AlertDialog.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {

                startActivity(new Intent(ActivityB.this, ActivityA.class));
            }
        });
        adb.show();
    }

在我的活动 B 中,我有一个按钮(指向活动 C 的按钮)。这就是我在活动 B 中设置 onBackPressed 的原因。

活动 A

public void toB(View view) {    
        Intent intent = new Intent(this, ActivityB.class);
        startActivity(intent);
}

【问题讨论】:

  • 在onBackPressed()中,在ActivityB中,当用户点击退出时,应该把他/她带到ActivityA,是吗?
  • 另外,您是否希望能够从 ActivityB 转到 ActivityA?请使用活动 A 代码更新您的问题。
  • 是的。我已经更新了我的代码。是 (ActivityB.this, ActivityA.class) 不是 (ActivityB.this, ActivityB.class)
  • 1.在ActivityA中调用ActivityB时,是否关闭ActivityA? 2.如果从ActivityB调用ActivityC,在ActivityC中按回想去哪里,到B还是A? 3. 显示 ActivityA 的代码。
  • 你去。按回我的活动 c 将导致我的活动 B。

标签: android android-dialog


【解决方案1】:

这很容易。当你从 Activity B 回到 Activity A 时,你所要做的就是告诉 Activity A 你来自 Activity B。

在您的onBackPressed() 中,将startActivity(new Intent(ActivityB.this, ActivityB.class)); 替换为以下代码:

Intent i = new Intent(ActivityB.this, ActivityB.class);
i.putExtra("from", "activityB");

然后,在活动 A 中,只需在显示对话框之前检查此额外内容:

Intent thisIntent = getIntent();
if (thisIntent != null && thisIntent.getExtras() != null
        && thisIntent.getExtras().containsKey("from")
        && thisIntent.getExtras().getString("from").equals("activityB")) {
        // Coming from Activity B : nothing
} else {
    // Display your dialog box
}

【讨论】:

  • 感谢您的回答。我试过了,它奏效了。我也尝试改变 startActivity(new Intent(ActivityB.this, ActivityA.class));完成();它也有效。
  • 很高兴它有帮助!如果你把 startActivity(new Intent(ActivityB.this, ActivityA.class)) 而不是 finish(),你确定应用程序在退出时会转到 ActivityA,尤其是当你在 Activity 之间有复杂的导航时。
【解决方案2】:

您可以简单地通过 bundlesavedinstance 使用一个标志来通知活动 A 它正在从活动 B 调用

【讨论】:

  • 我应该把那个标志放在哪里?在活动 A 还是 B?
  • 您在activityB中添加了一个额外的调用activityA,然后您尝试在activityA中获取它。如果可以,那么调用者是activityB,你什么也不做。否则,如果它不存在,则应用刚刚打开并显示消息。
  • 感谢您的回答。抱歉,如果我现在不能 +1 你的评论。我还没有足够的声望。
【解决方案3】:

即使您已接受答案,也请牢记以下几点。

您的导航堆栈可能是:

  • A -> B -> 按返回 -> A
  • A -> B -> C -> 按返回 -> B -> 按返回 -> A

为什么不让 Android 为您处理这个问题?如何?因为你没有完成 A,所以它的 onPause() 在你启动 B 时被调用。现在在 B 中,当按下 Back 按钮时,只需调用 finish(),而不是使用 Intent 去 A。这样,只要你的密码对话框在 A 的 onCreate() 中,A 的 onResume() 会被调用,并且不会显示对话框。

public void onBackPressed() {
    AlertDialog.Builder adb = new AlertDialog.Builder(this);
    adb.setTitle("Go back to Activity A?"); 
    adb.setCancelable(false);
    adb.setNegativeButton("Cancel", null);
    adb.setPositiveButton("Exit", new AlertDialog.OnClickListener() {

        public void onClick(DialogInterface dialog, int which) {
            //calling finish() will close this Activity(B) and go back to the previous
            //which in your case is Activity A if B was called from A
            finish();
        }
    });
    adb.show();
}

【讨论】:

  • 感谢您的解释。这就是我所做的。我首先怀疑从 B 调用 startActivity A 将调用 A 的 onCreate ,其中将出现对话框。但是从我的菜鸟来说,我想太多了。我还认为从活动 B 从 A 出发会破坏 A。但正如你所说,它只是 onPause() 对吧?
【解决方案4】:

只需添加 dialog.dismiss();在您的对话框中。 这将解决您的问题。

【讨论】:

    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多