Android:在对话框中包装GridView

时间:2011-06-24 01:32:30

标签: android gridview android-layout

有谁知道如何包装GridView?

尽管在GridView和父LinearLayout上都将layout_width设置为wrap_content,但GridView仍然大于其3列内容(大约是内容宽度的两倍)。试图应用固定的layout_width = ... dp。这也不起作用。

如何包装GridView的任何想法?见下文。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
          android:id="@+id/layout_root"   
          android:orientation="vertical"   
          android:layout_width="wrap_content"   
          android:layout_height="wrap_content"   
          android:padding="10dp" >

    <GridView xmlns:android="http://schemas.android.com/apk/res/android"    
        android:id="@+id/gridview"   
        android:layout_width="wrap_content"   
        android:layout_height="wrap_content"   
        android:columnWidth="90dp"   
        android:numColumns="3"   
        android:verticalSpacing="10dp"   
        android:horizontalSpacing="10dp"   
        android:stretchMode="none"   
        android:gravity="center" />

</LinearLayout>   

3 个答案:

答案 0 :(得分:2)

将LinearLayout和GridView设置为“wrap_contents”将不起作用,因为如果不给它特定的大小,GridView几乎默认为“fill_parent”。 我做了一些测试,根据您创建视图的方式,您有多种解决方案:

将LinearLayout设置为android:layout_width =“100dip”

View view = getLayoutInflater().inflate(R.layout.grid_dialog, null);
dialog.setContentView(view);

=&GT; 无法正常工作:inflater在充气时没有父视图,因此它不会考虑所有的android:layout_XXX属性。

    dialog.setContentView(R.layout.grid_dialog);

=&GT; 正常工作,因为这次对话框会进行膨胀并知道父视图。如果需要,您可以使用dialog.findViewById来检索gridview ....

将GridView设置为android:layout_width =“100dip”

显然始终有效,因为它有一个父项,当它被夸大时,所以layout_XXX属性实际上有效。

所有这些并不完美,因为它没有在GridView上执行真正的wrap_content,你必须手动设置layout_width,但它应该可以工作。

答案 1 :(得分:0)

谢谢格雷戈里。我不确定如何在AlertDialog构建器中执行dialog.setContentView(R.layout.grid_dialog)。 AlertView对话框只有SetView,而不是setContentView可用。有关如何使AlertDialog膨胀以使其知道其父视图的任何提示?请参阅下面我正在使用的AlertDialog代码,它不包含GridView:

protected Dialog onCreateDialog(int id) {   
    switch(id) {   
    case CATEGORY_ID:   
            AlertDialog.Builder builder;   
            Context mContext = this;   
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);   
            View layout = inflater.inflate(R.layout.categorydialog_3_cols, (ViewGroup) findViewById(R.id.layout_root));   
            GridView gridview = (GridView) layout.findViewById(R.id.gridview);   
            gridview.setAdapter(new ImageAdapter(this));   
            gridview.setOnItemClickListener(new OnItemClickListener() {   
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {   
                Toast.makeText(FS_90x90.this, "" + position, Toast.LENGTH_SHORT).show();   
            }   
        });   
            builder = new AlertDialog.Builder(mContext);   
            builder.setView(layout);   
            dialog = builder.create();   
        break;   
    default:   
        dialog = null;   
    }   
    return dialog;   
}   

另外

  

查看layout = inflater.inflate(R.layout.categorydialog_3_cols,(ViewGroup)findViewById(R.id.layout_root));

将父视图(对于网格视图)定义为

  

(ViewGroup)findViewById(R.id.layout_root)

答案 2 :(得分:0)

您可以尝试在运行时设置宽度,如下所示:

dialog.show();
LayoutParams params = dialog.getWindow().getAttributes();
params.width = 100;
dialog.getWindow().setAttributes(params);

参考:How can I set the AlertDialog width, etc.