Thanks for the reply.

The custom layout isn't doing *just* that - it's doing a lot of other 
stuff, and I figured it'd be more practical to just have it layout all it's 
children as they should be, instead of using a more traditional layout 
(like RelativeLayout or FrameLayout) and just omitting rules and margins. 
 It's trivial to use traditional layouts to achieve the net result, but 
when I ran into the issue, it made me curious why the LayoutParams were 
being queried at all, since my overriden onMeasure and onLayout didn't 
examine them.  I believe that they're still being looked at in the various 
measure methods, as called by parent containers.

On Sunday, March 3, 2013 2:35:07 AM UTC-6, Piren wrote:
>
> I'm no expert on the layout machenism of android, but you dont really need 
> a reference to the LayoutParams to do these calculations since onMeasure 
> gets the "processed" values of these params. the width and height 
> MeasureSpecs contain the size and mode as recommended by the layout params. 
>  What you're doing might be working in the instance you're testing on, but 
> might fail on others.
>
> P.S - Maybe its because of there's missing code here, but it seems like 
> you're just having the parent layout having the same size as the child 
> layout (basically both have wrap_content on width and height)... why do you 
> need a custom class for that?
>
> On Saturday, March 2, 2013 8:10:17 AM UTC+2, momo wrote:
>>
>> I have a custom ViewGroup that's only ever managing the size and position 
>> of one child.  I've override onMeasure and onLayout so that LayoutParams 
>> are never examined, yet it fails unless I do provide LayoutParams.  Here 
>> are abbreviated summaries of the relevant portions of the class:
>>
>>
>> public class SomeSpecialLayoutManager extends ViewGroup {
>>
>>     @Override
>>     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
>> {
>>     measureChildren(widthMeasureSpec, heightMeasureSpec);
>>     int w = mChild.getMeasuredWidth();
>>     int h = mChild.getMeasuredHeight();
>>     w = Math.max(w, getSuggestedMinimumWidth());
>>     h = Math.max(h, getSuggestedMinimumHeight());
>>     w = resolveSize(w, widthMeasureSpec);
>>     h = resolveSize(h, heightMeasureSpec);
>>     setMeasuredDimension(w, h);
>>     }
>>     
>>     @Override
>>     protected void onLayout(boolean changed, int l, int t, int r, int b) {
>>     mChild.layout( 0, 0, mWidth, mHeight );
>>     }
>> }
>>
>>
>> Using the above, the following *does* work:
>>
>>     LayoutParams lp = mChild.getLayoutParams();
>>     lp.width = mWidth;
>>     lp.height = mHeight;
>>     mChild.setLayoutParams( lp );
>>
>> But since neither `onMeasure` nor `onLayout` even makes reference to 
>> `LayoutParams`, I wonder why it's required, or even how it's referenced at 
>> all.  I would assume that since the layout pass grabs `mWidth` and 
>> `mHeight` directly, there'd be no need for the `LayoutParams` at all - and 
>> that a call to requestLayout would update it appropriately.
>>
>> However, when I isolate the above in a small program outside of a 
>> complicated View tree with scrolling layers that exceed "normal" container 
>> sizes, it *does* work as expected, so I have to assume the issue is in the 
>> measure pass.
>>
>> I've read as much documentation as I can find about what's going on 
>> during the measure and layout passes, and examined the source, but I 
>> believe I must be missing something.
>>
>> TYIA.
>>
>

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to