Hello开发人员。
我在Android应用程序中有一个网格视图。网格视图具有自动适合列数的设置,最小列宽为250像素。
在网格单元格中,我有一个LinearLayout,它有一个图像视图和一些文本视图。
我希望我的图像视图始终是方形的,但遗憾的是我无法使用任何布局设置执行此操作(如果有错误的选项,请在此处打开建议)。
所以我的想法是我应该以某种方式在我的图像Loading类中获取网格列宽度并在那里动态调整imageView高度,以匹配宽度。
虽然我没有获得列宽。
如果我在public View getView(int position, View convertView, ViewGroup parent)
中设置了breakPoint,我看到我的父ViewGroup是Grid,它具有正确的列宽值,但是当我使用时:
GridView mGridView = (GridView)parent;
int width = mGridView.getColumnWidth();
应用程序崩溃,因为它说没有getColumnWidth方法。
这里有任何帮助吗?
答案 0 :(得分:6)
以防万一有人正在寻找一种方法来获得实际的columnWidth pre api 16(就像我看到这篇帖子时那样),这就是我检索它的方法。
我扩展了GridView并使用这个
覆盖了getColumnWidth方法@SuppressLint("NewApi")
@Override
public int getColumnWidth() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
return super.getColumnWidth();
else {
try {
Field field = GridView.class.getDeclaredField("mColumnWidth");
field.setAccessible(true);
Integer value = (Integer) field.get(this);
field.setAccessible(false);
return value.intValue();
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
答案 1 :(得分:5)
解决方案可能是根据您的要求扩展您的ImageView并覆盖onMesure()方法:
onMeasure(int widthMeasureSpec, int heightMeasureSpec){
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
setMeasuredDimension(getMeasuredWidth(),getMeasuredWidth());
}
答案 2 :(得分:1)
Daniel Bo的回答是人工计算价值:
private int getColumnWidth(Context context, GridView gridView) {
if (android.os.Build.VERSION.SDK_INT >= 16)
return gridView.getColumnWidth();
Resources res = context.getResources();
int lPad = (int)res.getDimension(R.dimen.left_padding);
int rPad = (int)res.getDimension(R.dimen.right_padding);
int hSpace = (int)res.getDimension(R.dimen.horizontal_spacing);
int cols = gridView.getNumColumns();
int width = gridView.getWidth();
return (width - lPad - rPad + hSpace) / cols - hSpace;
}
请注意,这仅适用于高于11(Honeycomb)的API,并假设您使用一些定义为资源的值设置GridView。例如,假设您有一个dimens.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="left_padding">4dp</dimen>
<dimen name="right_padding">8dp</dimen>
<dimen name="horizontal_spacing">2dp</dimen>
</resources>
然后你的布局XML文件有:
<GridView
...
android:horizontalSpacing="@dimen/horizontal_spacing"
android:paddingLeft="@dimen/left_padding"
android:paddingRight="@dimen/right_padding"
...
/>
如果您有许多类似的GridView,那么将这些属性放在自定义样式中可能是个好主意。
至少这对我有用,而不必使用反射。请注意,经常调用此函数可能会有点过分。
希望这有助于某人。