0

我需要完全控制视图的布局,所以我使用 ViewGroup 如下:

        ViewGroup wrapper = new ViewGroup(getContext()) {
            @Override
            protected void onLayout(boolean changed, int l, int t, int r, int b) {
                setClipChildren(false);
                for (int c = 0; c < this.getChildCount(); c++) {
                    View v = this.getChildAt(c);
                    ViewGroup.LayoutParams lp = v.getLayoutParams();
                    //Log.d(TAG, "layout " + c + " w:" + lp.width + " h:" + lp.height);
                    v.layout(0, 0, lp.width, lp.height);
                }
            }
        };

        float nextY = dipY;
        for (SwipeMarkdown.Element e : markdown) {
            TextView tv = new TextView(getContext());
            tv.setText(e.text);
            tv.setTextSize(e.fontSize);
            tv.setTextColor(e.textColor);
            tv.setGravity(Gravity.CENTER);// e.textAlignment);
            tv.setBackgroundColor(Color.YELLOW);
            tv.setX(0);
            tv.setY(nextY);
            tv.measure((int)dipW, (int)dipH);
            int mh = tv.getMeasuredHeight();
            nextY = nextY + mh + e.lineSpacing;
            wrapper.addView(tv, new ViewGroup.LayoutParams((int)dipW, (int) mh));
        }

        wrapper.setY((dipH - nextY)/2); // center vertically in self
        viewGroup.addView(wrapper, new ViewGroup.LayoutParams((int) dipW, ViewGroup.LayoutParams.WRAP_CONTENT));
    }

一切正常,除了我无法让 setGravity() 对齐文本。

我错过了什么?

谢谢

更新:@pskink 给了我答案!调用measure()需要使用 a MeasureSpec,如下所示:

    tv.measure(View.MeasureSpec.makeMeasureSpec(dipW, View.MeasureSpec.EXACTLY),
               View.MeasureSpec.makeMeasureSpec(dipH, View.MeasureSpec.AT_MOST));
4

1 回答 1

0

@pskink 给了我答案!调用 measure() 需要使用 MeasureSpec

于 2016-11-11T21:40:46.700 回答