AlertDialog不适合长列表和视图和按钮(如果一起使用)

问题描述 投票:0回答:1

前段时间,我遇到了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上进行搜索,但是没有找到可行的解决方案,只有一个建议-用自定义视图编写您自己的对话框...,我决定找到真相。

android android-alertdialog
1个回答
0
投票

因为我没有找到可行的解决方案,所以我进行了调查,并做出了自己的决定。首先,我检查了默认的AlertDialog布局和源:

  1. alert_dialog_material.xml
  2. AlertDialog.java
  3. AlertController.java

以上链接在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布局中的某些内容之前,它将一直有效...

也许有人可能提供更好的解决方案?

谢谢您的关注!

© www.soinside.com 2019 - 2024. All rights reserved.