2016-08-07 5 views
1

Я создаю пользовательскую ViewGroup. Мне нужно иметь 2 FrameLayout один над другим; тот, который остается на дне, должен быть 20dp, а другой должен покрывать остальную часть обзора.Правильно макет детей с onLayout в Custom ViewGroup

onMeasure

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int widthMode = MeasureSpec.getMode(widthMeasureSpec); 
    int heightMode = MeasureSpec.getMode(heightMeasureSpec); 
    int widthSize = MeasureSpec.getSize(widthMeasureSpec); 
    int heightSize = MeasureSpec.getSize(heightMeasureSpec); 
    setMeasuredDimension(widthSize, heightSize); 

    final View content = getChildAt(CONTENT_INDEX); 
    final View bar = getChildAt(BAR_INDEX); 

    content.measure(
     MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY), 
     MeasureSpec.makeMeasureSpec(heightSize - getPixels(BAR_HEIGHT), MeasureSpec.EXACTLY) 
    ); 

    bar.measure(
     MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY), 
     MeasureSpec.makeMeasureSpec(getPixels(BAR_HEIGHT), MeasureSpec.EXACTLY) 
    ); 

OnLayout

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    mInLayout = true; 

    final View content = getChildAt(CONTENT_INDEX); 
    final View bar = getChildAt(BAR_INDEX); 

    if (content.getVisibility() != GONE) { 
     content.layout(0, 0, content.getMeasuredWidth(), content.getMeasuredHeight()); 
    } 

    if (bar.getVisibility() != GONE) { 
     bar.layout(0, content.getMeasuredHeight(), bar.getMeasuredWidth(), 0); 
    } 

    mInLayout = false; 
    mFirstLayout = false; 
} 
    } 

Представления Я добавляю к этому обычаю ViewGroup

LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 

mContentContainer = new FrameLayout(getContext()); 
mContentContainer.setLayoutParams(lp); 

mBarContainer = new FrameLayout(getContext()); 
mBarContainer.setLayoutParams(lp); 

// ... adding stuff to both containers .... 

addView(mContentContainer, 0); 
addView(mBarContainer, 1); 

Вопрос

mContentContainer визуализируется правильно (сверху = 0 вниз = (totalHeight - бар высота) и матч родителя для ширины), в то время как полоса не отображается.

enter image description here

ответ

1

Последний параметр в методе View#layout() это дно View. Для вашего bar вы проезжаете 0, но это должна быть высота вашего пользовательского View, который вы можете изобразить с t и b значений, переданных в onLayout().

bar.layout(0, content.getMeasuredHeight(), bar.getMeasuredWidth(), b - t);