我需要在我的
Android layout.xml中水平地对齐网格视图.我已经搜索google了很长一段时间,但没有成功找到答案.
我只能通过改变strechMode来改变gridview水平位置,但是我的项目不是靠近的.
我需要的是物品是一个靠近另一个(没有空格)并且水平居中.我选择strechmode = none,所以现在我的项目是彼此靠近,但它们在屏幕的左边,我只是希望他们水平居中.
这是我的布局xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/background" android:gravity="center"> <GridView android:id="@+id/lw_gridview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:numColumns="3" android:columnWidth="48dp" android:horizontalSpacing="0dp" android:verticalSpacing="0dp" android:stretchMode="none" /> </LinearLayout>
这是由图像适配器在gridview上设置的图像的片段:
imageView = new ImageView(context); imageView.setLayoutParams(new GridView.LayoutParams(48,48)); //on medium density imageView.setScaleType(ImageView.ScaleType.CENTER); imageView.setPadding(0,0);
我怎么能成功?
解决方法
我通过计算和设置其填充来手动对齐我的网格视图.这是我的onCreate所做的:
找出屏幕的宽度和屏幕密度
>将项目宽度和间距的常量值从DIP转换为像素
>计算我可以适合的列数.
方程式看起来像这样,numColumns是唯一的未知数:
numColumns * itemWidth(numColumns – 1)* spacingBetweenItems selectorPadding< = sreenWidth
>具有numColumns,计算我的网格视图实际需要多少水平空间
>具有网格视图的实际宽度,设置填充,使其最终在屏幕的中心
好的,这里有一些代码:
// Convert DIPs to pixels DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); mSizePx = (int) Math.floor(SIZE_DIP * metrics.scaledDensity); mSpacingPx = (int) Math.floor(SPACING_DIP * metrics.scaledDensity); GridView gridview = (GridView) findViewById(R.id.gridview); // Find out the extra space gridview uses for selector on its sides. Rect p = new Rect(); gridview.getSelector().getPadding(p); int selectorPadding = p.left + p.right; // Determine the number of columns we can fit,given screen width,// thumbnail width,and spacing between thumbnails. int numColumns = (int) Math.floor(1f * (metrics.widthPixels - selectorPadding + mSpacingPx) / (mSizePx + mSpacingPx)); int contentWidth = numColumns * mSizePx; // Width of items contentWidth += (numColumns - 1) * mSpacingPx; // Plus spaces between items contentWidth += selectorPadding; // Plus extra space for selector on sides // Now calculate amount of left and right margin so the grid gets // centered. This is what we // unfortunately cannot do with layout_width="wrap_content" // and layout_gravity="center_horizontal" int slack = metrics.widthPixels - contentWidth; gridview.setNumColumns(numColumns); gridview.setPadding(slack / 2,slack / 2,slack / 2);