2012-01-05 10 views
8

Próbuję uzyskać wartości z metody myImageView.getImageMatrix(), gdy moja aktywność jest już gotowa. Próbowałem użyć metod, ale matryca, którą otrzymuję, jest domyślna.Android - Czy zdarzenie zostało wywołane po zakończeniu renderowania elementu activity.setContentView?

Jeśli zadzwonię pod numer myImageView.getImageMatrix() wywołany przez narzędzie OnClickListener, po wyświetleniu mojej aktywności otrzymam prawidłowe wartości.


Wystarczy być bardziej oczywiste:

  • nazywając getImageMatrix onStart = Matrix{[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]}

  • nazywając getImageMatrix onClick = Matrix{[0.77488154, 0.0, 7.6717987][0.0, 0.77488154, 0.0][0.0, 0.0, 1.0]}

+0

Problemem jest to, że układ nie zostanie zmierzona i renderowane aż onResume() zakończone. Sprawdź to pytanie, aby zobaczyć, jak możesz otrzymać powiadomienie, kiedy to się stanie: http://stackoverflow.com/questions/7750102/how-to-get-height-and-width-of-button – Flo

+0

Dzięki temu, onWindowFocusChanged jest nazywany gdy dane już istnieją, są one wywoływane przy każdej zmianie ostrości. Mogłabym dodać flagę, która wskaże stan init, ale nie wydaje się taka gładka. Myślę, że to jest moje rozwiązanie na razie, jakieś myśli? –

Odpowiedz

15

Można również spróbować tej metody:

ImageView myImageView = (ImageView) findViewById(R.id.myImageView); 
ViewTreeObserver vto = myImageView.getViewTreeObserver();  
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {   
    @Override   
    public void onGlobalLayout() {    
     // do something now when the object is loaded 
     // e.g. find the real size of it etc   
     myImageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);   
    }  
}); 
+0

Twoje rozwiązanie wygląda najlepiej, dzięki :) –

+0

removeGlobalOnLayoutListener() jest teraz przestarzałe, począwszy od wersji SDK Należy użyć 16 (Jelly Bean) removeOnGlobalLayoutListener(). – flo

0

Może użyć onLayoutChangeListener ale nie jestem pewien.

+0

nie wiem, w każdym razie Aby korzystać z tej klasy, aplikacja musi określać poziom API "11" lub wyższy. co niestety nie jest moim przypadkiem. –

0

Być może można użyć AsyncTask (http://developer.android.com/reference/android/os/AsyncTask.html), który monitoruje, czy ImageView został załadowany (może nie jest równy zeru).

Można wyświetlić okno dialogowe postępu w onProgressUpdate, a następnie kontynuować kod z onPostExecute.

+0

Dzięki, brzmi nieco skomplikowane, co wydaje się być trywialnym zadaniem. "powiadamia, gdy widok jest gotowy" –

4

Nie jestem 100%, ale musiałem wiedzieć coś podobnego do mojego rozwoju i dowiedziałem się, że onWindowFocusChanged() jest wywoływana, gdy widok jest załadowany. Nie jestem pewien, czy to spełni twoje potrzeby, czy nie.

+0

Dzięki temu, onWindowFocusChanged jest wywoływany, gdy dane już istnieją, jednak wywoływane są przy każdej zmianie ostrości. Mogłabym dodać flagę, która wskaże stan init, ale nie wydaje się taka gładka. Myślę, że to jest moje rozwiązanie na razie, jakiekolwiek myśli? –

+0

o tak, przepraszam, zapomniałem dodać. Mam globalną wartość boolową, której używam, aby upewnić się, że jest to pierwsze wezwanie do zmiany, a następnie zrobić to, co muszę zrobić. Domyślam się, że to zależy od tego, co musisz zrobić, ale jeśli potrzebujesz tylko uzyskać dostęp do czegoś przy pierwszym załadowaniu ekranu, to powinna to naprawić zmienna globalna, jeśli nie najbardziej elegancki kod. – MikeIsrael

+0

Jeszcze raz dziękuję, będę z tym pracował;) –

Powiązane problemy