Autor Wątek: [ANDROID] Wyświetlanie kontrolki przez określony czas  (Przeczytany 3860 razy)

Offline Bielos

  • Użytkownik

# Listopad 17, 2011, 18:12:03
Witam, piszę aplikacje w Javie na system Android i chciał bym aby jakiś mój obiekt (tu akurat ImageView) był widzialny dajmy na to przez 4 sekundy a później robił się Invisible. W tym czasie powinien być on klikalny. Problem w tym,że nie wiem jak odliczyć te 4 sekundy w czasie których będzie możliwe kliknięcie w obiekt (onClickListener). Nie chodzi mi o zawieszenie procesu na kilka sekund np przez Object.wait(cośtam).

Pozdrawiam.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Avaj

  • Użytkownik

# Listopad 17, 2011, 19:47:55
może krótki wątek odpal, który po 4 sekundach ginie i invisibluje obiekt?

Offline Wafenek

  • Użytkownik

# Listopad 17, 2011, 20:01:50
A nie robiło sie tego przypadkiem za pomocą SystemClock?

Offline Bielos

  • Użytkownik

# Listopad 17, 2011, 20:03:55
może krótki wątek odpal, który po 4 sekundach ginie i invisibluje obiekt?

Jak mam obliczyć te 4 sekundy? :)

Offline Xender

  • Użytkownik

# Listopad 17, 2011, 20:05:02
Jak mam obliczyć te 4 sekundy? :)
<facepalm> waitem... A wątek właśnie po to aby nie blokować głównego.

Offline Bielos

  • Użytkownik

# Listopad 17, 2011, 20:48:12
Heh, nie wiem czy to wina tego wspaniałego emulatora Androida czy mojego kodu, ale jak włączam aplikacje to zanim wyświetli się layout linijki z tym nowym wątkiem zostają wykonane i w sumie nie widać efektu, a chciałem aby użytkownik widział te zmiany (czyli konsekwentne znikanie elementów aplikacji).

Niby jest to w metodzie onStart() więc teoretycznie powinno to zostać wykonane już po wczytaniu i wyświetleniu layouta.
« Ostatnia zmiana: Listopad 17, 2011, 20:50:53 wysłana przez Bielos »

Offline Zielony

  • Użytkownik
    • Ghurund Engine

# Listopad 17, 2011, 21:13:49
hint 1: http://www.android-x86.org/ (szybszy od rzeczywistego urządzenia, o ile wystarczy Ci android 2.3 bez map)
hint 2: http://developer.android.com/reference/android/view/View.html#postDelayed(java.lang.Runnable, long) (View.postDelayed to metoda, której szukasz)

Offline Solgar

  • Użytkownik

# Listopad 17, 2011, 21:38:00
Albo w ten sposób:
new Timer().schedule(task, after);Zmienna task jest obiektem typu TimerTask.
Dokumentacja Timer oraz TimerTask.

Offline Bielos

  • Użytkownik

# Listopad 17, 2011, 23:51:11
Zrobiłem tak:
Handler handler=new Handler();
Runnable r = new Runnable(){

    public void run()
    {
Zab[1].setVisibility(8);                     
    }   
};
handler.postDelayed(r, 4000);


I działa. Dzięki wielkie ;-)

Offline Bielos

  • Użytkownik

# Listopad 20, 2011, 20:37:29
Hmm, pojawił się problem, bo chciał bym aby ta operacja trwała powiedzmy 3 razy, czyli pojawia się na 4 sekundy,znika, pojawia się etc. I mam problem z wzięciem tego w pętle. Znalazłem też coś takiego jak Looper ale nie bardzo wiem jak tego użyć. Po napisaniu:
handler.postDelayed(t, 4000);
Już nic nie mogę zrobić.

Offline Solgar

  • Użytkownik

# Listopad 20, 2011, 20:45:38
Używając klasy Timer.

Offline Bielos

  • Użytkownik

# Listopad 22, 2011, 19:22:04
@up

Spróbowałem przerobić poprzedni kod na coś takiego:
Timer timer = new Timer();
TimerTask t = new TimerTask(){
    public void run(){
Zab[1].setVisibility(4);
    }
};
timer.schedule(t, 4000);

Ale aplikacja wywala się po tych 4 sekundach a debugger pisze:
Cytuj
11-22 17:06:18.084: ERROR/AndroidRuntime(338): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Offline Bielos

  • Użytkownik

# Listopad 23, 2011, 13:38:21
A da się jakoś to zrobić z klasą Looper? Próbowałem ale jakoś mi ciągle błędy wywala.

Offline Zielony

  • Użytkownik
    • Ghurund Engine

# Listopad 23, 2011, 14:46:02
hint: google -> runOnUiThread

Offline Bielos

  • Użytkownik

# Listopad 24, 2011, 15:49:08
Jak użyje tego runOnUiThread to nie mogę ustawić za to opóźnienia i w sumie jestem w punkcie wyjścia :)