2012-08-08 5 views
4

getView() 메소드에서 화면의 높이와 너비가 팽창했습니다. 그리드 항목입니다.post() 실행 뷰의 너비와 높이를 0으로 보는 이유는 무엇입니까?

일반적으로 레이아웃에 첨부 된 후에 크기를 가져 오기 위해 뷰에서 post()를 사용합니다. 그러나 0

final View convertViewFinal = convertView; 
convertView.post(new Runnable() { 
    @Override 
    public void run() { 
     doSomethingWithConvertView(convertViewFinal); 
    } 
}); 

...

doSomethingWithConvertView(View v) {v.getWidth(); /*returns 0*/}; 

가 어떻게 크기를 얻을 수 있습니까 반환?

답변

0

사실 전화 화면에는 convertview가 아직 그려지지 않았기 때문에 준비 될 때까지 기다려야합니다.

보기가 그려진 시점을 정확히 알기 위해서는 ViewTreeObserver를 사용해야합니다.

확인 대한 추가 정보를 원하시면이 대답 : 당신은 아마에서 onCreate 또는 ONSTART 또는 onResume에서이 호출 When Can I First Measure a View?

0

, 방법 레이아웃 측정하기 전에 실행됩니다. rootView는보다 높은 수준의 모든 뷰 그룹을 할 수있다

ViewTreeObserver vto = rootView.getViewTreeObserver(); 
     vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      public void onGlobalLayout() { 
       v.getWidth();//already measured... 
      } 
     }); 

당신 폭을 원하는 : 그러나 작업 방법이 많이있다, 이것은 하나의 좋은 방법입니다. 그러나이 수신기는 두 번 이상 실행될 수 있습니다.

1

viewTreeObserver를 사용하는 것은 분명히 효과적이지만 확장 뷰에서 호출 측정 요구 사항을 액티비티 뷰의 실행 가능 파일을 사용하여 안정적으로 수행 할 수 있음을 발견했습니다. 즉

someActivityInstance.getWindow().getDecorView().post(new Runnable() { 
    @override 
    public void run() { 
     // someMeasurements 
    } 
}); 
관련 문제