2011-01-21 4 views
1

LinearLayout을 기반으로 사용자 지정 구성 요소를 만들었습니다. 아이디어처럼, 그것을 XML 레이아웃의 일부로 만드는 것입니다 : 런타임시2.2 이전 Android에서 레이아웃 최적화를 비활성화하는 방법은 무엇입니까?

<com.test.MyComponent 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center_vertical|center_horizontal" 
    /> 

, 성분 (뷰 서브 클래스의 인스턴스를 추가하여) 동적으로 컨텐츠를 생성합니다. 이것은 Android 2.2 및 2.3에서 완벽하게 작동하지만 이전 플랫폼에서는 구성 요소가 단순히 표시되지 않습니다. 왜 그것이 사라지고 결국 그 이유를 알 수 있었는지 알아 내기 위해 많은 시간을 보냈습니다.

2.2 이전 플랫폼에서 Android는 "현명한"최적화를 수행합니다. XML 레이아웃에 사용 된 사용자 정의 클래스는 LinearLayout이며 자식이 없으므로 전혀 표시하지 않습니다.

많은 해결 방법을 시도했습니다.

protected void dispatchDraw (Canvas canvas) { 
    super.dispatchDraw(canvas); 

    for (ChildView c : children) { 
     c.draw(canvas); 
    } 
} 
: 구성 요소의 코드에 다음 재정의를 추가 한 후

<com.test.MyComponent 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center_vertical|center_horizontal" 
    > 
    <View 
     android:layout_width="1px" 
     android:layout_height="1px" 
     /> 
</com.test.MyComponent> 

을 그리고 : 어느 정도 성공 단 하나 비어 있지이되도록 구성 요소에 더미보기를 추가

이렇게하면 구성 요소와 해당 내용이 표시 될 수 있지만 더미 뷰가 있으면 구성 요소와의 상호 작용이 엉망이며 더미를 숨기려고하면 구성 요소가 사라집니다.

다른 누군가가 이제는 나를 없애기 위해 하루 종일 보내는 최적화를 만드는 데 많은 노력을 기울인 것처럼 보입니다. 이 "도움이되는"최적화를 비활성화하는 방법이 있다면 누구라도 알 수 있습니까?

답변

1

최적화가 없습니다. 뷰의 크기가 0이고 클리핑 사각형과 교차하지 않거나 완전히 불투명 한 뷰로 덮여있는 경우 뷰가 그려지지 않습니다. 당신이 전에 setWillNotDraw (false)를 호출하지 않으면 BTW, 레이아웃 onDraw() 메서드를 호출하지 않습니다.

문제는 레이아웃 문제와 비슷합니다. onMeasure()를 구현 했습니까? 구현의 관련 부분을 알려 주시면 도움이됩니다.

+0

오랫동안 이에 대한 답변을 게시했지만 표시되지 않았습니다. 아직도 검토 중입니까? – Alexander

관련 문제