2012-02-24 12 views
5

Mam duże trudności przy korzystaniu z ViewTreeObserver. Wszystko działa dobrze przez jakiś nieprzewidywalny okres czasu, a potem słuchacz nie działa już. Jest to z pewnością to, co jest napisane w dokumencie: Zwracany ViewTreeObserver obserwator nie gwarantuje, że pozostaną ważne przez cały okres użytkowania tego poglądu Dlatego przerobić Setup za każdym razem mogę zmienić swój pogląd:ViewTreeObserver Listener nie jest wywoływany po pewnym czasie.

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

a oto jak przywołuję go:

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(); 

Odpowiedz

1

Zazwyczaj dodać addOnGlobalLayoutListener słuchacza do moich poglądów zanim układ zostanie przerysowana lub zmienione (co może się zdarzyć, kiedy pierwszy raz init pogląd czy może przed zmianą jego układ) oraz w słuchacz to pierwsza rzecz Robię to, aby usunąć słuchacza z widoku.

+0

Takie podejście oznaczałoby dodanie detektora do widoku za każdym razem, gdy zmienię ten widok. Czy możesz to zrobić, ale dlaczego Android zachowuje się w ten sposób? Tak się nie dzieje z żadnymi innymi obserwatorami/słuchaczami, których znam. – michaelsmith

+0

To jest dobre pytanie .. niestety nie mam odpowiedzi na to – Cata

+0

Po prostu zdaję sobie sprawę, że system jest przetwarzanie poprawnie, choć z opóźnieniem kilka minut ... Prawdopodobnie tylko przypadku w trybie debugowania. Sprawdzę to – michaelsmith

0

Wystąpił podobny problem, gdy czasami nie był wywoływany obiekt onGlobalLayout. Zdarzyło się to czasami, gdy obrócono urządzenie i widok listy został przerysowany.

moje rozwiązanie

Moje rozwiązanie tego problemu była następująca: Zauważyłem, że bez względu na to, onScroll słuchacz nazwano każdorazowo ListView była odświeżana. Dlatego ustawiam flagę globalną, kiedy rejestruję obiekt nasłuchujący onGlobalLayout, i przenoszę cały kod z odbiornika do oddzielnej funkcji.

Jeśli detektor został wywołany, zadzwoniłem do tej funkcji i zresetowałem flagę.

W przeciwnym razie, za każdym razem, gdy został wywołany onScroll, sprawdziłem stan flagi, a jeśli był nadal prawdziwy, wywołałem tę funkcję i zresetowałem flagę.

Powiązane problemy