不能关闭带有 ListView 的 AlertDialog?

AlertDialog with ListView inside it cannot be dismissed?

我在 AlertDialog 中有一个 ListView,如下所示:

代码:

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button btnDialog;
    String[] listData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnDialog = (Button) findViewById(R.id.btnShowDialog);
        btnDialog.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        int id = view.getId();

        if (id == R.id.btnShowDialog){
            fetchData();
        }
    }

    public void fetchData(){
        RequestQueue queue = Volley.newRequestQueue(this);
        String URL ="https://jsonplaceholder.typicode.com/users";

        StringRequest dataRequest = new StringRequest(Request.Method.GET, URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            JSONArray jsoArray = new JSONArray(response);
                            int len = jsoArray.length();

                            listData = new String[len];

                            for (int x = 0; x < len; x++){
                                JSONObject obj = jsoArray.getJSONObject(x);
                                listData[x] = obj.getString("name");

                                AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
                                LayoutInflater inflater = getLayoutInflater();
                                View convertView = (View) inflater.inflate(R.layout.listdialog, null);
                                alertDialog.setView(convertView);
                                alertDialog.setTitle("List");
                                ListView lv = (ListView) convertView.findViewById(R.id.listView1);
                                ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, listData);
                                lv.setAdapter(adapter);
                                lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                                    @Override
                                    public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                                        Toast.makeText(getApplicationContext(), "You picked: "+listData[position], Toast.LENGTH_SHORT).show();
                                    }
                                });
                                alertDialog.show();
                            }
                        }
                        catch (JSONException je){
                            Toast.makeText(getApplicationContext(), "JSON error: "+je.getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
               Toast.makeText(getApplicationContext(), "Error...", Toast.LENGTH_SHORT).show();
            }
        });

        queue.add(dataRequest);
    }
}

解析 JSON 并用 ListView 显示它工作正常。 但是如果你按下后退按钮,AlertDialog 将不会被关闭(repo 是 here)。通常情况下,它应该。为什么?

为您的对话框设置 setCancelable(true) 属性应该可以正常工作。

在显示您的对话框之前,按如下方式设置此标志。

     AlertDialog dialog = alertDialog.create();
     dialog.setCancelable(true);
     dialog.show();

如果你只想在触摸外部对话框而不是单击后退按钮时关闭它,那么你可以设置

     dialog.setCanceledOnTouchOutside(true);

此致!