I tried to do custom component. I extended View
class and do some drawing in onDraw
overrided method. Why I need to override onMeasure
? If I didn't, everything seen to be right. May someone explain it? How should I write my onMeasure
method? I've seen couple tutorials, but each one is a little bit different than the other. Sometimes they call super.onMeasure
at the end, sometimes they use setMeasuredDimension
and didn't call it. Where is a difference?
After all I want to use several exactly the same components. I added those components to my XML
file, but I don't know how big they should be. I want to set its position and size later (why I need to set size in onMeasure
if in onDraw
when I draw it, is working as well) in custom component class. When exactly I need to do that?
actually, your answer is not complete as the values also depend on the wrapping container. In case of relative or linear layouts, the values behave like this:
In case of an horizontal scroll view, your code will work.
If you don't need to change something onMeasure - there's absolutely no need for you to override it.
Devunwired code (the selected and most voted answer here) is almost identical to what the SDK implementation already does for you (and I checked - it had done that since 2009).
You can check the onMeasure method here :
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),
getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
}
public static int getDefaultSize(int size, int measureSpec) {
int result = size;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
switch (specMode) {
case MeasureSpec.UNSPECIFIED:
result = size;
break;
case MeasureSpec.AT_MOST:
case MeasureSpec.EXACTLY:
result = specSize;
break;
}
return result;
}
Overriding SDK code to be replaced with the exact same code makes no sense.
This official doc's piece that claims "the default onMeasure() will always set a size of 100x100" - is wrong.
Source: Stackoverflow.com