2012-02-24 3 views
5

ViewTreeObserver를 사용할 때 큰 어려움이 있습니다. 모든 예측할 수없는 기간 동안 잘 작동하고 수신기가 더 이상 작동하지 않습니다. 그것은 확실히 때문에 문서에 기록 된 것입니다 :ViewTreeObserver 잠시 후 수신기가 호출되지 않습니다.

protected void shrinkToFit(final TextView t) { 
    if(vto==null||!vto.isAlive()){ 
    vto = t.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     public void onGlobalLayout() { 
      doAdjust(t); 
     } 
    }); 
    } 
} 

: 반환 ViewTreeObserver 관찰자이보기의 수명 동안 유효 보장 할 수 없습니다 그러므로 나는 내보기를 변경 설정 때마다 다시 실행 (아마도 레이아웃을 변경하기 전에 내가 먼저 뷰를 초기화하기 때 또는이 일어날 수)과에

보통
TextView t = (TextView) findViewById(R.id.maindesc); 

       t.setTextSize(Constants.MAINDESC_SIZE); 

       String todisp_1 = tarifreadtemp.area_desc + ":" 
         + tarifreadtemp.area_tarifuserdesc; 
       shrinkToFit(t); 
       t.setText(todisp_1); 
       t.invalidate(); 

답변

1

레이아웃이 다시 그려되거나 변경되기 전에 내가보기에 addOnGlobalLayoutListener 리스너를 추가가 : 여기 내가 그것을 호출 방법 처음 듣는 사람 내가보기에서 리스너를 제거하는 것입니다.

+0

이 방법은 해당보기를 변경할 때마다 수신기에보기를 추가하는 것을 의미합니다. 그렇게 할 수는 있지만 왜 안드로이드는 그런 행동을합니까? 이 사실은 내가 아는 다른 관찰자/청중에게도 발생하지 않습니다. – michaelsmith

+0

이것은 좋은 질문입니다. 불행히도 나는 그것에 대한 대답이 없습니다. – Cata

+0

저는 시스템이 올바르게 처리되고 있음을 알고 있습니다. 몇 분의 지연이 있더라도 ... 아마도 디버그 모드의 경우 일뿐입니다. 이것을 점검 할 것이다. – michaelsmith

0

가끔 onGlobalLayout이 호출되지 않은 비슷한 문제가 발생했습니다. 기기를 돌리면 목록보기가 다시 그려지는 경우가 있습니다. 다음과 같은 문제에

MY 솔루션

내 솔루션했다 : 나는 onScroll 리스너마다 호출 무슨 상관없이리스트 뷰가 다시 그려이었다 것으로 나타났습니다. 따라서 onGlobalLayout 리스너를 등록 할 때 전역 플래그를 설정하고 리스너의 모든 코드를 별도의 함수로 이동했습니다.

리스너가 호출 된 경우 해당 함수를 호출하고 플래그를 다시 설정합니다.

그렇지 않으면 onScroll이 호출 될 때마다 플래그의 상태를 확인하고 여전히 참인 경우 해당 함수를 호출하고 플래그를 다시 설정합니다.

관련 문제