如何关闭AlertDialog.Builder对话框?

41
在以下代码中,我如何关闭警告框?我不想导致内存泄漏。我尝试在alertDialog上使用.dismiss(),但那不起作用了...谢谢
// User pressed the stop button
public void StopMsg_button_action(View view){
    final EditText password_input = new EditText(this); // create an text input field
    password_input.setHint("Enter Password"); // put a hint in it
    password_input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); // change it to password type

    AlertDialog.Builder alertDialog = new Builder(this); // create an alert box
    alertDialog.setTitle("Enter Password"); // set the title
    alertDialog.setView(password_input);  // insert the password text field in the alert box
    alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { // define the 'OK' button
        public void onClick(DialogInterface dialog, int which) {
             String entered_password = password_input.getText().toString();
             if (entered_password.equals(my_password)) {
                locManager.removeUpdates(locListener); // stop listening for GPS coordinates
                startActivity(new Intent(Emergency_1Activity.this,Main_MenuActivity.class)); // go to main menu
             } else {
                 alert("Incorrect Password");
             }
        } 
    });
    alertDialog.setNeutralButton("Cancel", new DialogInterface.OnClickListener() { // define the 'Cancel' button
        public void onClick(DialogInterface dialog, int which) {

        } 
    });
    alertDialog.show(); // show the alert box
}
9个回答

56

关于 dismiss() 有什么问题?

你应该可以使用 Dialog.dismiss()Dialog.cancel() 中的任意一个。

alertDialog.setNeutralButton("Cancel", new DialogInterface.OnClickListener() { // define the 'Cancel' button
    public void onClick(DialogInterface dialog, int which) {
        //Either of the following two lines should work.
        dialog.cancel();
        //dialog.dismiss();
    } 
});

24
AlertDialog.Builder 没有 cancel 方法。 - xmen
2
@xmenW.K. cancel() 是对话框本身的一个方法,而不是构建器的方法。 - FoamyGuy
5
但在你的代码(和问题)中,alertDialog 是一个 Builder。在 onClick 中,你应该使用来自参数的 dialog - xmen
很棒的解决方案!问题不明确。 - Mesalcode

50

使用以下代码可以显示一个 ListBox AlertDialog,当您按下其中的一个项目时,对话框将被关闭。代码的顺序很重要。

AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

String names[] ={"A","B","C","D"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(mContext,android.R.layout.simple_list_item_1,names);

LayoutInflater inflater = getLayoutInflater();
View convertView = (View)inflater.inflate(R.layout.list_layout, null);
ListView lv = (ListView) convertView.findViewById(R.id.listView1);
lv.setAdapter(adapter);
alertDialog.setView(convertView);
alertDialog.setTitle("List");
final AlertDialog ad = alertDialog.show();

lv.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id)
    {
        //Toast.makeText(mContext, position, Toast.LENGTH_LONG).show();
        ad.dismiss();
    }
});

太好了!非常感谢! - NightFury
关键在于关闭使用alertDialog.show()创建的对话框。从构建器中创建对话框并调用dismiss不会关闭我们调用show()时创建的同一个对话框。这个问题曾经让我困扰了一段时间 =) - Casey Murray

36

代码非常简单:

final AlertDialog show = alertDialog.show();

最后,在按钮的操作中,例如:

show.dismiss();

例如,使用自定义警告对话框:

enter image description here

在Java中编写代码,您可以创建一个AlertDialog对象:

public class ViewAlertRating {

    Context context;
    public ViewAlertRating(Context context) {
        this.context = context;
    }

    public void showAlert(){

        AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        View alertView = inflater.inflate(R.layout.layout_test, null);
        alertDialog.setView(alertView);

        final AlertDialog show = alertDialog.show();

        Button alertButton = (Button) alertView.findViewById(R.id.btn_test);
        alertButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                show.dismiss();
            }
        });
    }
}

编写XML布局文件 layout_test.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">


    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Valoración"
        android:id="@+id/text_test1"
        android:textSize="20sp"
        android:textColor="#ffffffff"
        android:layout_centerHorizontal="true"
        android:gravity="center_horizontal"
        android:textStyle="bold"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        android:background="#ff37dabb"
        android:paddingLeft="20dp"
        android:paddingRight="20dp" />


    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:layout_marginTop="15dp">

        <EditText
            android:layout_width="match_parent"
            android:layout_height="120dp"
            android:id="@+id/edit_test"
            android:hint="Descripción"
            android:textColor="#aa000000"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:textColorHint="#aa72777a"
            android:gravity="top" />
    </LinearLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:paddingTop="10dp"
        android:paddingLeft="15dp"
        android:paddingRight="15dp"
        android:paddingBottom="15dp" >

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:weightSum="1.00"
                android:gravity="right" >

                <Button
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="Enviar"
                    android:id="@+id/btn_test"
                    android:gravity="center_vertical|center_horizontal"
                    android:textColor="#ffffffff"
                    android:background="@drawable/btn_flat_blue_selector" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

最后,调用活动:
ViewAlertRating alertRating = new ViewAlertRating(this);
alertRating.showAlert();

2
很棒的解决方案。帮了我很多! - Jevgenij Kononov
1
我一直在寻找的东西 :-) - Maveňツ

20

如果您不想放置任何按钮并且有自定义布局,其中包含文本视图并希望在单击该文本视图时关闭警报对话框,则必须使用此方法:

AlertDialog alertDialog = builder.show();

然后检查

if(alertDialog != null && alertDialog.isShowing()){
      alertDialog.dismiss();
}

如果您想在检查某些条件后在活动的其他位置解除它,这也是正确的。


1
完美且最佳的答案,附有清晰的解释。 - Anand Savjani
2
没错,这就是方法。为什么他们没有在Builder本身中包含一个close方法,这让我感到困惑...并不是每个人都想使用默认按钮。对于自定义AlertDialog,现在只有这种方法。谢谢。 - Player1

14

这个方法演示了从Namrata先前的答案中所需的代码。

@SuppressLint("InflateParams")
private static void showDialog(Activity activity, int layoutId)
{
    LayoutInflater inflater = activity.getLayoutInflater();
    View dialoglayout = inflater.inflate(layoutId, null);

    AlertDialog.Builder builder = new AlertDialog.Builder(activity);
    builder.setView(dialoglayout);

    CustomDialog.doCustomLogic(activity, layoutId, dialoglayout);

    final AlertDialog alertDialog = builder.show();

    // caller assumes there will be a btn_close element present
    Button closeNowBtn = (Button) dialoglayout.findViewById(R.id.btn_close);
    closeNowBtn.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View v)
        {
            alertDialog.dismiss();
        }
    });
}

4

取消或关闭 AlertDialog.Builder

dialog.setNegativeButton("إلغاء", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialogInterface, int i) {
        dialogInterface.dismiss()
    }
});

你需要在对话框接口上调用 dismiss()

4

只需重写create方法并保存对话框实例,然后可以调用dismiss方法。

@Override
public AlertDialog create() {
    this.dialog = super.create();
    return this.dialog;
}

在代码的某处:

dialog.dismiss();

这是我唯一有效的解决方案。我创建了一个继承自AlertDialog.Builder的类。通过这样做,我可以创建自己的dismiss方法。 - Ângelo Polotto

0
一个完整的例子:
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    View view = getLayoutInflater().inflate(R.layout.dialog_layout,null);
    TextView tvcancel = (TextView)view.findViewById(R.id.tvcancel);
    TextView tvdisconnect = (TextView)view.findViewById(R.id.tvdisconnect);
    builder.setView(view);
    final AlertDialog ad = builder.show();

    tvdisconnect.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ad.dismiss();
            stopVpn();
        }
    });

    tvcancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ad.dismiss();
        }
    });

0

我试过这个,它有效!

.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
               alertDialog.setCancelable(true);
            }
        });

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