Android:点击PositiveButton后不要关闭AlertDialog

55

点击PositiveButton后,我能不能让AlertDialog保留不消失呢?

我想保持对话框的显示,以便在我的ArrayAdapter列表单词中更新一些内容。

这是我的代码。

AlertDialog.Builder sayWindows = new AlertDialog.Builder(MapActivity.this);

final EditText saySomething = new EditText(MapActivity.this);

sayWindows.setPositiveButton("ok",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    say = userName + " Says: "+saySomething.getText();
                    showPosition.setText(say);                      
                }
            });

sayWindows.setNegativeButton("cancel",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });

sayWindows.setAdapter(listWords, null);
sayWindows.setView(saySomething);
sayWindows.create().show();

我把 sayWindows.setCancelable(false) 放在 setTitle 下面,但它没有起作用。 - Yi-Ying Lu
在PositiveButton onClick中也不起作用。 - Yi-Ying Lu
2
可能是重复的问题:如何防止对话框在按钮被点击时关闭 - Suragch
禁用按钮,直到用户准备好继续操作,而不是阻止取消。 - Suragch
5个回答

80

在查看了@Little Child的解决方案后,我尝试着做了这个。如果这个可以用,请告诉我们。

    AlertDialog.Builder sayWindows = new AlertDialog.Builder(
            MapActivity.this);
    final EditText saySomething = new EditText(MapActivity.this);
    sayWindows.setPositiveButton("ok", null);
    sayWindows.setNegativeButton("cancel", null);
    sayWindows.setAdapter(listWords, null);
    sayWindows.setView(saySomething);

    final AlertDialog mAlertDialog = sayWindows.create();
    mAlertDialog.setOnShowListener(new DialogInterface.OnShowListener() {

        @Override
        public void onShow(DialogInterface dialog) {

            Button b = mAlertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
            b.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    // TODO Do something
                   say = userName + " Says: "+saySomething.getText();
                   showPosition.setText(say); 
                }
            });
        }
    });
    mAlertDialog.show();

1
谢谢,但是肯定按钮似乎没有功能。我在那里放了吐司,但它没有起作用。 - Yi-Ying Lu
1
终于搞定了,现在它可以工作了,快来看看吧。我做了一些更改,将AlertDialog分配给create,然后先设置setOnShowListener,最后调用show()。现在它可以正常工作了,希望对你也有用。如果是这样的话,我请求你将其标记为答案,以便其他人在未来可以轻松找到它。谢谢。 - Chitrang

17

基于如何防止对话框在点击按钮时关闭的最高票答案

final AlertDialog d = new AlertDialog.Builder(context)
            .setView(v)
            .setTitle(R.string.my_title)
            .setPositiveButton(android.R.string.ok, null) //Set to null. We override the onclick
            .setNegativeButton(android.R.string.cancel, null)
            .create();

    d.setOnShowListener(new DialogInterface.OnShowListener() {

        @Override
        public void onShow(DialogInterface dialog) {

            Button b = d.getButton(AlertDialog.BUTTON_POSITIVE);
            b.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    // TODO Do something

                }
            });
        }
    });  

我认为您需要覆盖(override)正按钮(positive button)的处理程序(handler)。在满足某个条件时,添加您自己的逻辑以关闭对话框(dismiss the dialog)。


我在将“AlertDialog.Builder d”更改为“AlertDialog d”后无法设置setAdapter(listWords,null)。你能告诉我为什么吗? - Yi-Ying Lu
谢谢。对我有用 :) - Dimitar Vukman

14

更加简单:

final AlertDialog alertDialog = new AlertDialog.Builder(context).setView(v)
                .setPositiveButton(android.R.string.ok, null)
                .setNegativeButton(android.R.string.cancel, null)
                .show();

        Button b = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
        b.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                //Do Your thing
            }
        });

2
这是最好的答案。 - pellyadolfo

9

使用Kotlin的答案:

val dialog = AlertDialog.Builder(context)
    .setView(v)
    .setTitle(R.string.my_title)
    .setPositiveButton(android.R.string.ok, null)
    .setNegativeButton(android.R.string.cancel, null)
    .create()

dialog.setOnShowListener {

        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
            // Apply logic here
        }

    }

AlertDialog.Builder(Kotlin 1.3.10)中,既没有公共方法.setonShowListener,也没有.getButton。我有什么遗漏吗? - Bikeboy
这些方法包含在AlertDialog中。AlertDialog dialog = new AlertDialog.Builder(context)………create(); - Sergey Sereda

8
我这样做的:
    final AlertDialog dialog = new AlertDialog.Builder(this)
            .setCancelable(false)
            .setPositiveButton("YES", null)
            .setNegativeButton("NO", null)
            .show();

    Button positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
    positiveButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
       //     Toast.makeText(SysManagerActivity.this, "dialog is open", Toast.LENGTH_SHORT).show();

        }
    });

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