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));
@pskink gave me the answer! Call to measure() requires the use of a MeasureSpec