androidtextviewgravityviewgroup

TextView setGravity not working (ignored) with ViewGroup programmatically


I need to have full control of the layout of view so I use ViewGroup as follows:

        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));
    }

Everything works fine except I cannot get setGravity() to align the text.

What am I missing?

Thx

UPDATE: @pskink gave me the answer! Call to measure() requires the use of a MeasureSpec as follows:

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

Solution

  • @pskink gave me the answer! Call to measure() requires the use of a MeasureSpec