2016-12-15 3 views
0

xml을 통해 구성 가능한 하위 항목이있는 사용자 지정보기가 있습니다. 그러나 런타임에는 Configuration 클래스와 같은 것을 통해 구성 가능합니다. 그 후 변경 사항에 대한 부모보기로 통보하고 모두 괜찮습니다.
BTW. 사실 내 질문은 측정에 영향을 미친다. 나는 런타임에 자식 항목의 크기를 바꿀 수 있지만 첫 번째 실행에서는 xml에 정의 된 레이아웃 매개 변수에 따라 크기 (너비와 높이)를 모두 설정하려고한다.측정하기 전에 View의 LayoutParams를 아는 방법?

일부 코드는 더 명확하게 설명합니다.

protected int getItemWidth() { 
    if (cell != null) { 
     int width = cell.getWidth(); 
     return width == 0 ? <layout_width_defined_in_xml> : ScreenUtils.convertToDp(context, width); 
    } else { 
     return canvasWidth; 
    } 
} 

그래서 알고 싶습니다. 측정 전에 레이아웃 매개 변수를 가져올 수 있습니까? 그걸 어떻게?

답변

0

실제로 XML에 정의 된 크기가 실제로 배치되었을 때보기에 있어야하는 크기가 아닙니다. 예를 들어 LinearLayout의 자식은 android:layout_width="0" 일 수 있지만 android:layout_weight이므로 0이 아닌 너비가 될 수 있습니다. (다른 종류의 레이아웃에도 다른 예제가 있습니다.) 또한 값 match_parentwrap_content은 자바 코드의 음의 정수 값에 매핑됩니다. 여기서는 여러분에게 도움이된다고 생각하지 않습니다.

사용자 정의보기가 하위보기를 측정하고 배치하는 데 관심이있는 경우 onMeasure()onLayout()을 다시 정의해야합니다. 수행하지 않거나 수행 할 필요가없는 경우 getWidth()getHeight()은 뷰의 실제 크기를 알려주며 getMeasuredWidth()getMeasuredHeight()은 측정 된 크기 (실제 크기와 다를 수 있음)를 알려줍니다. 단,주의해야 할 점은 첫 번째 측정/레이아웃이 4 가지 메소드를 호출하기 전에 기다려야한다는 것입니다. 그렇지 않으면이 메소드가 모두 0을 반환하기 때문입니다. 당신이보기의 레이아웃 매개 변수를 검사 할 경우

, 당신이 언급 한 바와 같이

LayoutParams params = view.getLayoutParams(); 
int width = params.width; 
int height = params.height; 

을 할 수있는, 하나 또는 그 모두는 음수가 될 수 있습니다. 이 두 가지를 비교하기 위해 LayoutParams.MATCH_PARENTLayoutParams.WRAP_CONTENT을 비교할 수 있지만 onMeasure()onLayout()을 구현하지 않으면이 방법이 도움이되는지 잘 모르겠습니다.

+0

사실 당신은 거의 정확하며이 문제에 대한 내 자신의 답변을 쓰고 싶지 않습니다. 그래서 나는 당신에게 당신의 대답을 단순화하길 원할 것입니다. '측정 전에 레이아웃 매개 변수를 얻을 수 있습니까? '** - 예 **, 어떻게? 'getLayoutParams()'메소드를 통해. 그는 항상 xml에 정의 된 기본 레이아웃 매개 변수를 반환합니다. –

+0

@SergeyShustikov 제 대답은 정확히 그 내용을 포함하고 있습니다 만, 왜 이것이 (당신과이 답변을 읽는 다른 사람 모두에게) 좋은 일이 아닐지에 대한 자세한 설명이 있습니다. 나는 당신이 다른 대답을 쓸 이유가 전혀 없다. – Karakuri

+0

ok. 너는 나에게 확신했다 :) –

-1

콜백 ViewTreeObserver.OnGlobalLayoutListener에서이 작업을 수행 할 수 있습니다. 여기에서보기 크기를 가져올 수 있으며이 크기로 다른보기의 크기를 설정할 수 있습니다.