对话框包含ListView时太宽

Ted*_*opp 5 layout android dialog

当它包含一个对话框的宽度时,我遇到了问题ListView:对话框总是几乎填满了屏幕的宽度.这是一个问题的例子:

对话过于宽泛

我需要对话框宽度来匹配图标.我试过通过播放这里这里描述的对话框样式来解决这个问题,但无济于事.我认为那些线程在错误的轨道上(至少对于这个问题),因为(1)它们没有解决问题,(2)我可以通过简单地不使用a来使对话框按照需要调整大小ListView.例如,如果我用ListView简单的替换TextView(下面的详细信息),所有内容都按照需要调整:

紧凑的对话

这是我用来显示对话框的代码:

private void showDisplayStyleDialog(int id, int choices, int values) {
    final Dialog dlg = new Dialog(this);
    dlg.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dlg.setContentView(R.layout.display_style_dialog);
    final ListView lv = (ListView) dlg.findViewById(android.R.id.list);
    if (lv != null) {
        displayStyleAdapter.setChoices(choices, values);
        lv.setAdapter(displayStyleAdapter);
        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long itemId) {
                dlg.dismiss();
                setDisplayStyle(DisplayStyle
                        .valueOf(displayStyleAdapter.mValues[position]));
            }

        });
    }
    dlg.setCanceledOnTouchOutside(true);
    dlg.show();
}
Run Code Online (Sandbox Code Playgroud)

我也尝试使用a创建对话框AlertDialog.Builder,没有任何改进.对话框布局(display_style_dialog.xml)是:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/white" >
    </ListView>

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

适配器从此布局加载每一行:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/holder"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="5dp" >

    <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/display_style_image_bg"
        android:contentDescription="@string/cd_display_style" />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

使用Android Debug Monitor检查视图层次结构显示只有ListView自身是对话框的整个宽度; 每行(根据需要)的大小与图标宽度相匹配.它ListView本身正在迫使广泛的对话.如果我display_style_dialog.xml改为:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/test_string"
        android:textColor="@android:color/black"
        android:background="@android:color/white" >
    </TextView>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

并且不对代码或资源进行其他更改,结果是上面显示的紧凑对话框.据我所知,问题严重是由于ListView对话框中存在的问题.

我想我可以通过ImageView在一个VerticalLayout内部放置一些s来在短期内解决这个问题ScrollView.不幸的是,根据应用程序的内部状态,图标的排列和数量会有很大差异,因此这不是一种可持续的方法; 从长远来看,我真的需要用一个ListView.有关如何解决此问题的任何想法?

Ste*_*ven 5

首先,抱歉我的英语不好,但我会尽力解释我的意见.

ListView可以包含任何短或长的数据(例如,字符串).所以,如果你设置LayoutParams为a wrap_content,就无法知道它有多长.取决于数据,实际数据的宽度可能比屏幕的宽度长.

所以,如果你设置wrap_content,它将自动更改为match_parent/ fill_parent(我不完全知道,但其中一个)

你也可以看到身高. ListView不知道应该如何绘制行.因此,在你的情况下,ListView高度将被拉伸到Activity高度.

Google I/O 2010开始,他们解释了为什么我们不应该使用wrap_content ListView.

据我所知,在你的情况下(ListView高度为wrap_content)getView(),当ListView被初始化时,将被调用为存在多行.

所以,我的意见是你可以设置:

  1. 确切的width_value为Dialog,并将ListView宽度设置为match_parentfill_parent.

  2. ListView宽度乘以宽度的x%Activity.


添加在您的测试,TextViewDialog,

我们可以通过测量文本来了解确切的宽度值.所以,有可能使用wrap_content.