我想在我的自定义适配器的getView方法中获取LinearLayout元素的宽度。我的getView方法如下所示:
@Override
public View getView(int position, View v, ViewGroup parent) {
View mView = v;
if (mView == null) {
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
mView = vi.inflate(R.layout.levelselector_item, null);
}
if (mView != null) {
...
LinearLayout ln = (LinearLayout) mView.findViewById(R.id.lineScore);
LinearLayout lnTotal = (LinearLayout) mView.findViewById(R.id.lineScoreTotal);
int widthTotal = lnTotal.getWidth()/2;
ln.getLayoutParams().height = 3;
ln.getLayoutParams().width = widthTotal;
ln.requestLayout();
ln.setBackgroundColor(Color.parseColor("#eef05e"));
}
return mView;
}
问题我的widthTotal似乎没有值。如果我点击gridview的一个项目并点击后退按钮,那么我突然看到一个黄色条。如果我输入ln.getLayoutParams()。width = 20;他还展示了一个黄色短杆。我只是不知道何时何地可以获得LinearLayout的宽度...
答案 0 :(得分:1)
您似乎正在尝试将lineScore
视图的尺寸设置为3像素高,而lineScoreTotal
视图宽度的一半。不幸的是,你不能这样做 - 在视图附加到活动的视图层次结构之前执行getView
代码,因此没有为任何内容定义大小。
一种方法是定义您自己的自定义视图,并按照this thread中的建议覆盖onMeasure
。这可能是最干净的方式。
另一种方法是尝试查询parent
视图的尺寸;填充等帐户;然后构建适当的宽度和高度度量规范,并在尝试查询维度之前布置mView
。
另一种方法是创建一个布局,将总宽度分成所需的比例。由于您尚未发布布局,我无法提出任何具体建议。例如,如果行的容器是垂直LinearLayout
,您可以执行类似这样的操作:
<LinearLayout
android:orientation="vertical"
. . . >
. . .
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<View
android:layout_width="0dp"
android:layout_height="3dp"
android:layout_weight="25" />
<View
android:layout_width="0dp"
android:layout_height="3dp"
android:layout_weight="50"
android:background="#eef05e" />
<View
android:layout_width="0dp"
android:layout_height="3dp"
android:layout_weight="25" />
</LinearLayout>
. . .
</LinearLayout>
这不是特别有效(使用三个额外的视图),但它允许您使用XML执行所有操作。如果您的目标是API级别14或更高级别,您还可以使用Space
视图来提供间距。
修改强>
以下代码概述了“查询parent
视图...”的含义:
int availW = parent.getWidth() - parent.getPaddingLeft() - parent.getPaddingRight();
int widthSpec = MeasureSpec.makeMeasureSpec(availW, MeasureSpec.AT_MOST);
// similar for height
mView.measure(widthSpec, heightSpec);
mView.layout(0, 0, mView.getMeasuredWidth(), mView.getMeasuredHeight());
// now you can query the width of `mView`
我没有测试过这个,所以我不能保证它会起作用,但这就是这个想法。
答案 1 :(得分:1)
您可以在XML中执行此操作,而不是在代码中设置维度。您可以使用LinearLayout权重属性来获得“一半”父级宽度。 e.g。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:weightSum="2" >
<View
android:layout_width="0dp"
android:layout_height="3dp"
android:layout_weight="1"
android:background="#eef05e" />
</LinearLayout>
答案 2 :(得分:0)
在屏幕上设置布局(R.layout.levelselector_item)之前,我认为您无法获得视图的宽度。它应该返回0。
答案 3 :(得分:0)
我让它正常工作。对于那些可能感兴趣的人:
我首先将我的gridview边框设置为可通过在xml中添加到gridview中来控制的数量:
android:listSelector="@null"
android:layout_margin="5dp"
然后我使用了Ted Hopp和Sameer的解决方案的组合:因为我知道我的元素的填充是什么; gridview周围5dp,元素之间的2dp和元素中的15dp。我每行还有3个项目,这使我的代码看起来像:
int parentW = parent.getWidth() - parent.getPaddingLeft() - parent.getPaddingRight();
Resources r = C.getResources();
float pxPaddingBetweenItem = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, r.getDisplayMetrics());
float pxPaddingInItem = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 15, r.getDisplayMetrics());
int totalBarWidth = (parentW - (int)(2*pxPaddingBetweenItem) - (int)(6*pxPaddingInItem))/3;
这就把我带到了我想成为的地方:) 谢谢!