问题描述
|
我正在尝试在对话框中显示GridView。尽管我付出了所有努力,但GridView的宽度一直扩大到整个屏幕,而不是包装到列上。下面是描述问题的布局和图像(我为GridView设置了背景色以说明问题)。
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<GridView xmlns:android=\"http://schemas.android.com/apk/res/android\"
android:id=\"@+id/colorgridview\"
android:background=\"#FF00CCBB\"
android:layout_width=\"wrap_content\"
android:layout_height=\"wrap_content\"
android:numColumns=\"4\"
android:verticalSpacing=\"5dp\"
android:horizontalSpacing=\"5dp\"
android:columnWidth=\"70dp\"
android:stretchMode=\"none\"
/>
解决方法
我知道这篇文章有点过时了。但是,如果有人需要解决方案,那么这个答案可能会派上用场。
屏幕测量后可以设置视图的宽度。
去做这个:
让您的类实现OnGlobalLayoutListener。
当调用onGlobalLayout方法时,将测量屏幕。我们可以在这里做魔术。
GridView.getLayoutParams()。width = ....
编辑:
我对如何添加onGlobalLayoutListener不太清楚。请参阅plugmind的帖子,他显示了如何添加它。
无法弄清楚如何获取视图/布局的宽度/高度
亲切的问候,
布拉姆
,我认为您应该使用ѭ1而不是
android:layout_width=\"wrap_content\"
,因为包装内容使用了它所需的最小位置。另一方面,fill_parent使用所有需要的空间。更重要的是,您应该摆脱\"android:columnWidth=\"70dp\".
,当然可以设置一个固定的layout_width(在dp中)。由于列数也是固定的,因此这对您来说是一种解决方法?
,遇到同样的问题...
我用重写onMeasure()解决了它
public class GridViewEx extends GridView {
private int mRequestedNumColumns = 0;
public GridViewEx(Context context) {
super(context);
}
public GridViewEx(Context context,AttributeSet attrs) {
super(context,attrs);
}
public GridViewEx(Context context,AttributeSet attrs,int defStyle) {
super(context,attrs,defStyle);
}
@Override
public void setNumColumns(int numColumns) {
super.setNumColumns(numColumns);
if (numColumns != mRequestedNumColumns) {
mRequestedNumColumns = numColumns;
}
}
@Override
protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
if (mRequestedNumColumns > 0) {
int width = (mRequestedNumColumns * getColumnWidth())
+ ((mRequestedNumColumns-1) * getHorizontalSpacing())
+ getListPaddingLeft() + getListPaddingRight();
setMeasuredDimension(width,getMeasuredHeight());
}
}
}