为什么在alertdialog活动之外单击两次以将其关闭?

时间:2019-05-06 13:14:48

标签: android android-alertdialog

我正在使用一个具有对话框主题的活动,在该活动中我没有放置正面或负面按钮。通过接收外部通知(Firebase)启动此活动。当我要关闭该对话框时,需要在对话框外轻按两下才能将其关闭。确实:

  • 在第一次点击时,对话框消失,但屏幕仍然被某种遮盖的薄膜/釉覆盖(它必须是打开对话框时出现的相同“阴影”);
  • 第二次点击时,这种阴影消失了,因此返回到我的初始GUI。

我该怎么做才能避免轻按两次,而只需轻按一下即可取消对话框活动?创建对话框活动时,是否有办法避免覆盖我的GUI的阴影?

我认为我的问题与这里的问题不同:AlertDialog does not dismiss, takes twice tap to close。在后一篇文章中,需要指出的是,方法setPositiveButton()和setNegativeButton()对对话框的解雇有一个隐式调用,这不是我要解决的问题。我只是收到一个通知,此通知变成一个带有对话框主题的活动,要关闭它,我需要轻按两次,而我只想轻按一次即可关闭。这是我的活动:

public class NotificationDialogActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = getIntent();
        showDialog(this, intent);
    }

    private void showDialog(Context context, @NonNull Intent intent) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(intent.getStringExtra("title"));
        builder.setMessage(intent.getStringExtra("text"));
        builder.create().show();
    }
}

3 个答案:

答案 0 :(得分:1)

我认为问题可能在于您正在启动活动,然后从该活动中启动对话框。 (?)您可能想要添加OnCancelListener并在那里完成活动。 (?)

private void showDialog(Context context, @NonNull Intent intent) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setTitle(intent.getStringExtra("title"));
    builder.setMessage(intent.getStringExtra("text"));
    builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            NotificationDialogActivity.this.finish();
        }
    });
    builder.show();
}

或者,除非由于其他原因需要此活动,否则您可以完全摆脱它,只需将showDialog代码移至调用活动,然后执行此操作即可。

答案 1 :(得分:0)

请查看此答案。您可以解决您的问题!

Dismiss the dialog with click on outside of the dialog

答案 2 :(得分:0)

  builder.setCancelable(true);
  //Use above line to dismiss a dialog of "AlertDialog.Builder"
  //if you touch outside...
  // It Works..

  //If you use "AlertDialog" then use below line 
  //to dissmiss on touching the outside...
  builder.setCanceledOnTouchOutside(true);