2013-04-08 14 views
18

Trochę utknąłem z tym - przede wszystkim poniższy link był przydatny, ale pojawił się problem z widocznością:Ustal, czy widok jest na ekranie - Android

Link: Check view visibility

mam widoku przewijania (jednostka dominująca) oraz szereg cząstkowych widoków (LinearLayout ->TableLayout) itd Istnieje Kasa ustawić do View.GONE w XML (android:visibility="gone").

mam jakiś prosty kod, aby określić, czy jest widoczny lub nie stosując getVisibility() jednak kiedy ustawić pozycję do View.VISIBLE i starają się natychmiast getDrawingRect() dostaję Rect zerami całej planszy. Każde kolejne kliknięcie otrzymuje poprawne współrzędne.

Może to być spowodowane tym, że widok nigdy nie był narysowany (zgodnie z definicją w pliku XML), co spowodowało, że nie zwrócił żadnych współrzędnych, ale ustawiłem View.VISIBLE przed próbą określenia widoczności ekranu. Czy to możliwe, że muszę uzyskać coś w rodzaju callbacku z polecenia onDraw()? lub może ustawić widoczność ukrytych elementów w kodzie. Trochę denerwujące; (

Niektóre kodu:

Rect scrollBounds = new Rect(); 
scroll.getHitRect(scrollBounds); 

Rect viewBounds = new Rect(); 

if (view.getVisibility() == View.GONE) { 
    view.setVisibility(View.VISBLE) 


    viewBounds.getDrawingRect(viewBounds); 
    if (!Rect.intersects(scrollBounds, viewBounds) { 
     // do somthing 
    } 
} 
obszar

podzial następująco:

  • ScrollView
    • LinearLayout
      • TableLayout
        • Button
        • HiddenView

Oczywiście, to jest wysoce prawdopodobne, idę o to w niewłaściwy sposób całkowicie - w zasadzie po prostu chcę się upewnić, że przewijanie się pozycjonuje, więc widok, który stał się widoczny, można zobaczyć w jego całości.

Jeśli potrzebujesz innych informacji, daj mi znać!

Odpowiedz

15

Ok, dzięki OceanLife za wskazanie mnie we właściwym kierunku! Rzeczywiście istniało wymagane oddzwanianie, a ViewTreeObserver.OnGlobalLayoutListener() załatwił sprawę. Skończyłem na tym, że zaimplementowałem słuchacza przeciwko mojej klasie fragmentów i wybrałem go tam, gdzie go potrzebowałem. Dzięki za ostrzeżenie również w odniesieniu do wielu połączeń, rozwiązałem to za pomocą metody removeOnGlobalLayoutListener() - działa urok.

Kod:

... 

// vto initialised in my onCreateView() method 

vto = getView().getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(this); 

... 

@Override 
    public void onGlobalLayout() { 

     final int i[] = new int[2]; 
     final Rect scrollBounds = new Rect(); 

     sView.getHitRect(scrollBounds); 
     tempView.getLocationOnScreen(i); 

     if (i[1] >= scrollBounds.bottom) { 
      sView.post(new Runnable() { 
       @Override 
       public void run() { 
        sView.smoothScrollTo(0, sView.getScrollY() + (i[1] - scrollBounds.bottom)); 
       } 
      }); 
     } 

     vto.removeOnGlobalLayoutListener(this); 
    } 

Właśnie zrobić kilka czyszczenia teraz ...

+1

Cool. Jeśli to pomogło, możesz zaznaczyć strzałkę/+1. Twoje zdrowie. – OceanLife

+0

Tak, próbowałem to zrobić, ale moje punkty reputacji nie pozwolą mi :( –

10

Tak więc, jeśli czytam to prawo, problem polega na tym, że chcesz poznać wymiary niektórych widoków w swoim układzie, aby dowiedzieć się, czy masz skrzyżowanie z rodzicem ScrollView.

Co myślę widzisz (jak wspomniałem) jest instrukcja zwrócić pogląd jest wysyłane, a następnie w jakimś wyścigu warunku, renderer rozwiązywaniu pomiarów dla układu i rzeczywista renderowanie gdzie obiekty widoku uzyskują rzeczywiste rozmiary. Jednym ze sposobów sprawdzenia, jaki rodzaj wymiarów ma widok na ekranie, jest użycie drzewa list-odbiornik. Używamy tego obserwatora do rozwiązania wymiarów ekranu podczas korzystania z Google Charts API, który wymaga zdefiniowania szerokości i wysokości piksela ... co oczywiście na Androidzie jest prawdopodobnie największym problemem dla programistów.Więc obserwuj (kalambur przeznaczony);

final ViewTreeObserver vto = chart.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

    /** 
    * @see android.view.ViewTreeObserver.OnGlobalLayoutListener#onGlobalLayout() 
    */ 
    @SuppressWarnings("deprecation") 
    @Override 
    public void onGlobalLayout() { 
    if (view.getVisibility() == View.GONE) { 
     view.setVisibility(View.VISBLE) 
     viewBounds.getDrawingRect(viewBounds); 
     if (!Rect.intersects(scrollBounds, viewBounds) { 
     // do something 
     } 
    } 
    } 
}); 

Słowo ostrzeżenia onGlobalLayout zostanie sprawdzony wielokrotnie jako renderer zamyka w sprawie ostatecznego rozwiązania. Ostatnie połączenie to to, które bierzemy.

Zapewni to mechanizm wykonywania operacji na wyświetlanym widoku, np. Uzyskiwanie szerokości i wysokości komponentu widoku. Mam nadzieję, że ci pomaga.

Pomyślnie: Sprytni faceci na Placu zaprojektowali bibliotekę Hamsona FEST, która pozwoli ci napisać test na ten temat obok Robotium. Check it out.

+0

Wystarczy zauważyć, że metoda jest '' '' deprecated''''. Hmm. Mam nadzieję, że instrukcje wymiany są jasne. – OceanLife

+0

Tak, to prawda, powodem, dla którego chcę znaleźć wymiary, jest sprawdzenie, czy widok jest widoczny na ekranie w stosunku do pozycji ScrollView - jeśli nie, chcę przesunąć widok przewijania wzdłuż. Niedługo wyjdę na ViewTreeObserver, gdy wyjdę z pracy! Dzięki: P –

Powiązane problemy