有谁知道如何包装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>
答案 0 :(得分:2)
将LinearLayout和GridView设置为“wrap_contents”将不起作用,因为如果不给它特定的大小,GridView几乎默认为“fill_parent”。 我做了一些测试,根据您创建视图的方式,您有多种解决方案:
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 ....
显然始终有效,因为它有一个父项,当它被夸大时,所以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);