前段时间,我遇到了AlertDialog问题:
如果它与列表适配器(通过setAdpater / setSingleChoiceItems / setMultiChoiceItems)和自定义视图(通过setView)一起使用,并且有时带有按钮,并且列表过长且不适合对话框的高度,则我的自定义添加视图和对话框按钮不是正在显示...(正在显示,但不可见,因为已由listview向下移动)这是一个测试代码:
final int TEST_COUNT = 20; //increase it if list fit your screen...
List<String> list = new LinkedList<>();
for (int i = 1; i <= TEST_COUNT; i++)
list.add("item "+i);
TextView testView = new TextView(this); //type of view doesn't matter
testView.setText("test view");
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.select_dialog_item, list);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog dialog = builder
.setTitle("Test AlertDialog")
.setAdapter(adapter, (dlg, which) -> {})
.setView(testView) //this line broke all!
.setPositiveButton("Yes", (dlg, which) -> dlg.dismiss())
.setNegativeButton("No", (dlg, which) -> dlg.dismiss())
.show();
我已经在google和SO上进行搜索,但是没有找到可行的解决方案,只有一个建议-用自定义视图编写您自己的对话框...,我决定找到真相。
因为我没有找到可行的解决方案,所以我进行了调查,并做出了自己的决定。首先,我检查了默认的AlertDialog布局和源:
以上链接在Google中找到,您当然可以在您的IDE中检查源。
我们从布局的xml中可以理解-根AlertDialogLayout视图是从LinearLayout(Compat)继承的,所有子级的高度均为WRAP_CONTENT。但是我们需要在标题和自定义视图之间的空间中安装listview。我找到的解决方案-将“ contentPanel”视图的权重设置为1。这是解决问题的示例代码,只需在问题的第一部分代码中将。show()替换为。create():
dialog.setOnShowListener(dlg -> {
AlertDialog adlg = (AlertDialog)dlg;
View v = adlg.getWindow().findViewById(R.id.contentPanel);
if (v != null)
((LinearLayoutCompat.LayoutParams)v.getLayoutParams()).weight = 1;
});
dialog.show();
当然,在Google更改其默认的Alertdialog布局中的某些内容之前,它将一直有效...
也许有人可能提供更好的解决方案?
谢谢您的关注!