在我的getView方法中获取LinearLayout的宽度

时间:2012-10-03 16:39:26

标签: android width android-linearlayout

我想在我的自定义适配器的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的宽度...

4 个答案:

答案 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;

这就把我带到了我想成为的地方:) 谢谢!