0

내 사용자 지정보기 MeasureSpec이 때를 이 정확히는 사양 크기를 설정하면, 뷰 높이를 선택할 때 슬라이더, 그것은 onMeasure()에 대한 규칙을 따르는 것입니다 UNSPECIFIEDAT_MOST 일 때 정의 된 크기를 사용하도록 설정합니다. 나는 다음 뷰가 그려집니다 AT_MOST에 대한 주석 행의 주석을 해제하면사용자 정의보기 레이아웃 된 onMeasure()는 최소 크기의 AT_MOST을 선택하는 경우 그려지지 않습니다

 int heightMode = MeasureSpec.getMode(heightMeasureSpec); 
     int specHeight = Math.max(BOX_MIN_HEIGHT, MeasureSpec.getSize(heightMeasureSpec)); 
     int specWidth = MeasureSpec.getSize(widthMeasureSpec); 

     int desiredHeight = Math.max(BOX_MIN_HEIGHT, HSVColorPickerPreference.this.boxHeight); 

     int chosenHeight = 0; 

     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

     if(heightMode == MeasureSpec.UNSPECIFIED) { 
      chosenHeight = desiredHeight; 
     } else if(heightMode == MeasureSpec.AT_MOST) { 
      chosenHeight = Math.min(specHeight, desiredHeight); <<< BAD results 
      //chosenHeight = specHeight; <<< GOOD results 
     } else if(heightMode == MeasureSpec.EXACTLY) { 
      chosenHeight = specHeight; 
     } 

     setMeasuredDimension(specWidth, chosenHeight); 

하지만이 모든 그려 할 수있는 뷰를 발생
(onDraw()가 호출되지 않습니다).

슬라이더는 2 개의 슬라이더와 하나의 뷰 상자가 포함 된 LinearLayout의 일부이며 각 슬라이더에는 layout_weight="1" 속성이 있습니다 (아래 이미지 참조).

GOOD :

enter image description here

BAD :

enter image description here

내가 당신에게 좋고 나쁜 로그와 이미지를 표시 아래

은 (두 개의 슬라이더와 그 아래 1 개보기가 있습니다)

좋은 기록 (마지막 줄을 보시려면 onDraw()으로 전화하십시오) :

03-26 08:06:10.288: D/AlphaSlider(9223): + onSizeChanged(w:579, h:58, oldw:0, oldh:0) 
03-26 08:06:10.288: D/AlphaSlider(9223): + onLayout(changed:true, left:10, top:10, right:589, bottom:68) 
03-26 08:06:10.288: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:1073742185) 
03-26 08:06:10.288: W/AlphaSlider(9223): MeasureSpec EXACTLY, specSize=361, desiredSise=40, chosenSize=361 
03-26 08:06:10.288: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:-2147483080) 
03-26 08:06:10.288: W/AlphaSlider(9223): MeasureSpec AT_MOST, specSize=568, desiredSise=40, chosenSize=568 
03-26 08:06:10.288: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:1073742000) 
03-26 08:06:10.288: W/AlphaSlider(9223): MeasureSpec EXACTLY, specSize=176, desiredSise=40, chosenSize=176 
03-26 08:06:10.288: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:1073742098) 
03-26 08:06:10.288: W/AlphaSlider(9223): MeasureSpec EXACTLY, specSize=274, desiredSise=40, chosenSize=274 
03-26 08:06:10.288: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:-2147483342) 
03-26 08:06:10.288: W/AlphaSlider(9223): MeasureSpec AT_MOST, specSize=306, desiredSise=40, chosenSize=306 
03-26 08:06:10.288: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:1073741913) 
03-26 08:06:10.288: W/AlphaSlider(9223): MeasureSpec EXACTLY, specSize=89, desiredSise=40, chosenSize=89 
03-26 08:06:10.288: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:1073742098) 
03-26 08:06:10.288: W/AlphaSlider(9223): MeasureSpec EXACTLY, specSize=274, desiredSise=40, chosenSize=274 
03-26 08:06:10.288: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:-2147483342) 
03-26 08:06:10.288: W/AlphaSlider(9223): MeasureSpec AT_MOST, specSize=306, desiredSise=40, chosenSize=306 
03-26 08:06:10.288: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:1073741913) 
03-26 08:06:10.288: W/AlphaSlider(9223): MeasureSpec EXACTLY, specSize=89, desiredSise=40, chosenSize=89 
03-26 08:06:10.288: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073742185) 
03-26 08:06:10.288: W/AlphaSlider(9223): MeasureSpec EXACTLY, specSize=361, desiredSise=40, chosenSize=361 
03-26 08:06:10.288: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:-2147483123) 
03-26 08:06:10.288: W/AlphaSlider(9223): MeasureSpec AT_MOST, specSize=525, desiredSise=40, chosenSize=525 
03-26 08:06:10.288: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073741986) 
03-26 08:06:10.288: W/AlphaSlider(9223): MeasureSpec EXACTLY, specSize=162, desiredSise=40, chosenSize=162 
03-26 08:06:10.288: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073742098) 
03-26 08:06:10.288: W/AlphaSlider(9223): MeasureSpec EXACTLY, specSize=274, desiredSise=40, chosenSize=274 
03-26 08:06:10.288: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:-2147483385) 
03-26 08:06:10.288: W/AlphaSlider(9223): MeasureSpec AT_MOST, specSize=263, desiredSise=40, chosenSize=263 
03-26 08:06:10.288: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073741898) 
03-26 08:06:10.288: W/AlphaSlider(9223): MeasureSpec EXACTLY, specSize=74, desiredSise=40, chosenSize=74 
03-26 08:06:10.315: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073742169) 
03-26 08:06:10.315: W/AlphaSlider(9223): MeasureSpec EXACTLY, specSize=345, desiredSise=40, chosenSize=345 
03-26 08:06:10.315: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:-2147483173) 
03-26 08:06:10.315: W/AlphaSlider(9223): MeasureSpec AT_MOST, specSize=475, desiredSise=40, chosenSize=475 
03-26 08:06:10.315: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073741969) 
03-26 08:06:10.315: W/AlphaSlider(9223): MeasureSpec EXACTLY, specSize=145, desiredSise=40, chosenSize=145 
03-26 08:06:10.315: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073742081) 
03-26 08:06:10.315: W/AlphaSlider(9223): MeasureSpec EXACTLY, specSize=257, desiredSise=40, chosenSize=257 
03-26 08:06:10.315: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:-2147483435) 
03-26 08:06:10.315: W/AlphaSlider(9223): MeasureSpec AT_MOST, specSize=213, desiredSise=40, chosenSize=213 
03-26 08:06:10.315: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073741882) 
03-26 08:06:10.315: W/AlphaSlider(9223): MeasureSpec EXACTLY, specSize=58, desiredSise=40, chosenSize=58 
03-26 08:06:10.315: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073742081) 
03-26 08:06:10.315: W/AlphaSlider(9223): MeasureSpec EXACTLY, specSize=257, desiredSise=40, chosenSize=257 
03-26 08:06:10.315: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:-2147483435) 
03-26 08:06:10.315: W/AlphaSlider(9223): MeasureSpec AT_MOST, specSize=213, desiredSise=40, chosenSize=213 
03-26 08:06:10.315: D/AlphaSlider(9223): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073741882) 
03-26 08:06:10.315: W/AlphaSlider(9223): MeasureSpec EXACTLY, specSize=58, desiredSise=40, chosenSize=58 
03-26 08:06:10.315: D/AlphaSlider(9223): + onLayout(changed:false, left:10, top:10, right:589, bottom:68) 
03-26 08:06:10.323: D/AlphaSlider(9223): + onDraw() 

BAD 로그 (onDraw()없이 전화) :

03-26 07:43:33.453: D/AlphaSlider(8145): + onSizeChanged(w:579, h:30, oldw:0, oldh:0) 
03-26 07:43:33.463: D/AlphaSlider(8145): + onLayout(changed:true, left:10, top:10,right:589,bottom:40) 
03-26 07:43:33.463: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:1073742185) 
03-26 07:43:33.463: W/AlphaSlider(8145): MeasureSpec EXACTLY, specSize=361, desiredSise=40, chosenSize=361 
03-26 07:43:33.473: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:-2147483080) 
03-26 07:43:33.473: W/AlphaSlider(8145): MeasureSpec AT_MOST, specSize=568, desiredSise=40, chosenSize=40 
03-26 07:43:33.473: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:1073741824) 
03-26 07:43:33.473: W/AlphaSlider(8145): MeasureSpec EXACTLY, specSize=30, desiredSise=40, chosenSize=30 
03-26 07:43:33.473: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:1073742098) 
03-26 07:43:33.473: W/AlphaSlider(8145): MeasureSpec EXACTLY, specSize=274, desiredSise=40, chosenSize=274 
03-26 07:43:33.473: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:-2147483342) 
03-26 07:43:33.473: W/AlphaSlider(8145): MeasureSpec AT_MOST, specSize=306, desiredSise=40, chosenSize=40 
03-26 07:43:33.473: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:1073741824) 
03-26 07:43:33.473: W/AlphaSlider(8145): MeasureSpec EXACTLY, specSize=30, desiredSise=40, chosenSize=30 
03-26 07:43:33.473: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:1073742098) 
03-26 07:43:33.473: W/AlphaSlider(8145): MeasureSpec EXACTLY, specSize=274, desiredSise=40, chosenSize=274 
03-26 07:43:33.473: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:-2147483342) 
03-26 07:43:33.473: W/AlphaSlider(8145): MeasureSpec AT_MOST, specSize=306, desiredSise=40, chosenSize=40 
03-26 07:43:33.473: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742360, heightMeasureSpec:1073741824) 
03-26 07:43:33.473: W/AlphaSlider(8145): MeasureSpec EXACTLY, specSize=30, desiredSise=40, chosenSize=30 
03-26 07:43:33.473: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073742185) 
03-26 07:43:33.473: W/AlphaSlider(8145): MeasureSpec EXACTLY, specSize=361, desiredSise=40, chosenSize=361 
03-26 07:43:33.473: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:-2147483123) 
03-26 07:43:33.473: W/AlphaSlider(8145): MeasureSpec AT_MOST, specSize=525, desiredSise=40, chosenSize=40 
03-26 07:43:33.473: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073741824) 
03-26 07:43:33.473: W/AlphaSlider(8145): MeasureSpec EXACTLY, specSize=30, desiredSise=40, chosenSize=30 
03-26 07:43:33.473: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073742098) 
03-26 07:43:33.473: W/AlphaSlider(8145): MeasureSpec EXACTLY, specSize=274, desiredSise=40, chosenSize=274 
03-26 07:43:33.473: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:-2147483385) 
03-26 07:43:33.473: W/AlphaSlider(8145): MeasureSpec AT_MOST, specSize=263, desiredSise=40, chosenSize=40 
03-26 07:43:33.473: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073741824) 
03-26 07:43:33.473: W/AlphaSlider(8145): MeasureSpec EXACTLY, specSize=30, desiredSise=40, chosenSize=30 
03-26 07:43:33.503: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073742169) 
03-26 07:43:33.503: W/AlphaSlider(8145): MeasureSpec EXACTLY, specSize=345, desiredSise=40, chosenSize=345 
03-26 07:43:33.503: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:-2147483173) 
03-26 07:43:33.503: W/AlphaSlider(8145): MeasureSpec AT_MOST, specSize=475, desiredSise=40, chosenSize=40 
03-26 07:43:33.503: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073741824) 
03-26 07:43:33.503: W/AlphaSlider(8145): MeasureSpec EXACTLY, specSize=30, desiredSise=40, chosenSize=30 
03-26 07:43:33.503: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073742081) 
03-26 07:43:33.503: W/AlphaSlider(8145): MeasureSpec EXACTLY, specSize=257, desiredSise=40, chosenSize=257 
03-26 07:43:33.503: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:-2147483435) 
03-26 07:43:33.503: W/AlphaSlider(8145): MeasureSpec AT_MOST, specSize=213, desiredSise=40, chosenSize=40 
03-26 07:43:33.503: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073741824) 
03-26 07:43:33.503: W/AlphaSlider(8145): MeasureSpec EXACTLY, specSize=30, desiredSise=40, chosenSize=30 
03-26 07:43:33.503: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073742081) 
03-26 07:43:33.503: W/AlphaSlider(8145): MeasureSpec EXACTLY, specSize=257, desiredSise=40, chosenSize=257 
03-26 07:43:33.503: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:-2147483435) 
03-26 07:43:33.503: W/AlphaSlider(8145): MeasureSpec AT_MOST, specSize=213, desiredSise=40, chosenSize=40 
03-26 07:43:33.503: D/AlphaSlider(8145): + onMeasure(widthMeasureSpec:1073742403, heightMeasureSpec:1073741824) 
03-26 07:43:33.503: W/AlphaSlider(8145): MeasureSpec EXACTLY, specSize=30, desiredSise=40, chosenSize=30 
03-26 07:43:33.503: D/AlphaSlider(8145): + onLayout(changed:false, left:10, top:10, right:589, bottom:40) 

답변

0

드디어 무슨 일이 일어나고 있는지 이해하기 때문에, 나는 여기에두고 나중에 참조 할 수 있도록 답 :

안드로이드는에 무슨하고있다 UI 구성 요소를 측정 할 때 수행하십시오.
사용자 (이 경우)가 간단한 규칙을 따르지 않으면 정확히 0이 발생할 수 있습니다.
onSizeChanged() 방법으로 0 크기 만 확인하면 무해하게 만들 수 있습니다. 그러나 내가했던 것처럼 측정 모드를 혼합하지 않으면 더 좋습니다. 설명은 다음과 같습니다.

XML 가중보기 (layout_weight 사용)로 정의되었습니다. 그것들은 그 질문에서 언급 된 커스텀 견해였습니다. 내 실수도

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

에 범인을보기위한 특정 높이를 요구하려고했다가

int desiredHeight = Math.max(BOX_MIN_HEIGHT, HSVColorPickerPreference.this.boxHeight); 

. . . 

    chosenHeight = Math.min(specHeight, desiredHeight); 

. . . 

이 충돌이 가중 레이아웃의 발견과 함께 머리를 머리에 라인입니다. 왜? weight = 1 인 예제 3 위젯을 예로 들어 보겠습니다. 그 중 하나는 위에서 설명한 것처럼 잘못 행동하고 있습니다.

LineraLayout이 자녀를 처음으로 지나칠 때 야생으로 들어가 원하는 크기를 물어볼 수 있습니다. 우리의 예제에서 2 위젯은 가능한 한 많은 것을 요구할 것이고, 커스텀 위젯은 최대 값보다 적은 것을 요구할 것입니다.

두 번째 패스는 킬러입니다. LinearLayout은 가중치가있는 위젯 중 하나를 알아 채지 못합니다. 전체적으로 가중치가 정의되어 있습니다. LinearLayout은 요청 된 측정 폼의 합계를보고 그 값보다 많은 것으로 봅니다. 그런 다음 델타 오버 플로우를 계산하고 가중치 위젯간에 오버플로를 분배하는 다른 패스를 만듭니다. 따라서 사용자 정의보기 위젯은 요청한 것보다 더 많이 잘라야하며, 0 크기로 남겨 둡니다.

친구와 맥주를 마시는 것과 비슷한 상황입니다. 당신은 맥주 하나를 주문하고 친구들은 맥주, 감자 튀김, 체이서 등을 주문합니다. 저녁이 끝날 때 수표는 모든 사람들에게 동등하게 나누어지고, 당신은 가지고있는 맥주보다 더 많은 것을 지불하게됩니다. 내 사용자 정의보기도 마찬가지입니다.

관련 문제