1

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

4 回答 4

1

您可以在 XML 中进行,而不是在代码中设置尺寸。您可以使用 LinearLayout 权重属性来获取“一半”父宽度。例如

<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>
于 2012-10-03T17:58:22.770 回答
1

看起来您正在尝试将lineScore视图的尺寸设置为 3 像素高和视图宽度的一半lineScoreTotal。不幸的是,你不能这样做——getView代码是在视图附加到活动的视图层次结构之前执行的,所以没有为任何东西定义大小。

一种方法是定义您自己的自定义视图并按照此线程onMeasure中的建议进行覆盖。这可能是最干净的方式。

另一种是尝试查询parent视图的尺寸;考虑填充等;然后mView在尝试查询尺寸之前构建适当的宽度和高度测量规范并进行布局。

另一种是创建一个布局,将总宽度分成所需的比例。由于您尚未发布布局,因此我无法提出任何具体建议。例如,如果该行的容器是一个 vertical 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`

我没有对此进行测试,所以我不能保证它会起作用,但这就是想法。

于 2012-10-03T17:13:20.283 回答
0

我让它正常工作。对于那些可能感兴趣的人:

我首先将我的gridview周围的边框设置为可以通过在xml中添加到我的gridview来控制的数量:

android:listSelector="@null"
android:layout_margin="5dp"

然后我结合了 Ted Hopp 和 Sameer 的解决方案:因为我知道我的元素的填充是什么;网格视图周围的 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;

这将我带到我想去的地方:) 谢谢!

于 2012-10-04T13:59:35.500 回答
0

我认为在屏幕上设置布局(R.layout.levelselector_item)之前无法获得视图的宽度。它应该返回 0。

于 2012-10-03T16:57:51.903 回答