2013-07-09 3 views
2

나는 ... 다른 사용자 ViewGroup로 정의 ViewGroup를 추가하는 여러 가지 방법을 디버깅 하루 종일 보냈다 그리고 그들 중 누구도 작동하지 않습니다, 그리고 그것을 할 수있는 방법을 보여줍니다 공식 문서 또는 샘플이 없기 때문에 거의 미친갔습니다Android - ViewGroup onDraw는 자식보기를 반복하고 onDraw를 명시 적으로 호출해야합니까?

  1. HorizontalDockViewViewGroup
  2. GameEntryViewFrameLayout
를 확장 확장 :

기본적으로,이 정의 ViewGroup

HorizontalDockView 대체 onDraw, onMeasure 등이며 모든 것이 정상적으로 호출되며 완벽하게 작동합니다. 내가 HorizontalDockView의 생성자 내부에서 GameEntryView을 만들고 addView(gameEntryView)를 호출 할 때 는 그러나 gameEntryView 이제까지 관계없이 layoutParams의 표시되지 않습니다, addView는 어떤 스레드에서 호출, 또는 내가 부모 HorizontalDockView에, 부하, 그리고 된 setContentView를 호출하지만. 내가 horizontalDockView.getChildAt();을 통해 나열하면 모든 gameEntryView 개체가 아직 있습니다.

희망이 없으므로 GameEntryView의 onDraw, onMeasure, dispatchDraw 메쏘드를 통해 디버깅하려고 시도했으며 실제로 아무 것도 호출되지 않는다는 것을 깨달았습니다! 아니 .. 한 번도!

* 호출시 부모 (HorizontalDockView 's)의 모든 자식 뷰를 반복하고 자식을 * 명시 적으로 호출해야합니까? 나는 부모에게 슈퍼 (*)를 부탁했다.

부모 클래스와 하위 클래스 모두에서 setWillNotDraw(false);을 호출했습니다.

부모보기에 자녀를 표시하려면 어떻게합니까? 간단한 샘플 또는 기존의 작은 오픈 소스 프로젝트가 매우 높이 평가됩니다!

대단히 감사합니다!

답변

5

onLayout을 덮어 썼습니까? Android가 ViewGroup을 레이아웃하면 ViewGroup이 자녀를 배치해야합니다.

이 코드는 서로의 상단에 모든 아이를 낳는 사용자 정의 뷰 그룹에서이다 : 완전성에 대해

@Override 
protected void onLayout(final boolean changed, final int l, final int t, final int r, final int b) { 

    int count = this.getChildCount(); 
    for (int i = 0; i < count; i++) { 

     View child = this.getChildAt(i); 
     child.layout(0, 0, child.getMeasuredWidth(), child.getMeasuredHeight()); 
    } 
} 

onMeasure 재정의 :

@Override 
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { 

    int parentWidth = MeasureSpec.getSize(widthMeasureSpec); 
    int parentHeight = MeasureSpec.getSize(heightMeasureSpec); 
    this.setMeasuredDimension(parentWidth, parentHeight); 

    int count = this.getChildCount(); 
    for (int i = 0; i < count; i++) { 

     View child = this.getChildAt(i); 
     this.measureChild(
      child, 
      MeasureSpec.makeMeasureSpec(parentWidth, MeasureSpec.EXACTLY), 
      MeasureSpec.makeMeasureSpec(parentHeight, MeasureSpec.EXACTLY)); 
    } 
} 
+0

감사합니다! 자식보기 클래스에서 onLayout 및 onMeasure를 재정의하지만 부모보기 클래스에서 onLayout을 재정의하지 않았습니다! 상위 뷰 클래스에서 super.onMeasure()를 호출했지만 분명히 작동하지 않습니다. 그것을 지적 해 주셔서 고마워요! – Zennichimaro

+0

안녕하세요 @FabianZeindl, 자녀가 서로 겹치지 않고 LinearLayout처럼 순차적으로 레이아웃하게하려면 어떻게해야합니까? – Zennichimaro

+0

안드로이드 배치는 실제로 (디스플레이 조각화와 모든 것을 지나치게 일반화하기 때문에) 복잡합니다. onLayout을 적용하여 자녀에게 다른 위치와 크기를 줄 수 있습니다. 미리 계산할 수 있습니다. onMeasure 메서드를 잘 구현하여 자녀가 "행동하고"올바른 방식으로 표시되도록합니다. 그냥 시도 해 봐. –