2011-08-22 15 views
17

Chciałbym dodać nieokreślony pasek postępu do paska akcji w kształcie plastra miodu, aby za każdym razem, gdy użytkownik naciśnie "Odśwież", ikona odświeżania tymczasowo zamienia się w nieokreślony pasek postępu, do momentu zadanie zostanie wykonane. Aplikacja poczty e-mail już to robi, ale nie wiem, jak to zrobić.Zastępowanie ikony elementu menu ActionBar nieokreślonym paskiem postępu

Każda rada?

+0

pokrewne dla odświeżania/orzeźwiający: http://stackoverflow.com/questions/9731602/animated-icon-for-actionitem – rds

Odpowiedz

5

Trudno powiedzieć dokładnie, jak działa aplikacja do obsługi poczty e-mail, ale możesz zachować prostotę i po prostu zadzwonić pod numer setIcon z identyfikatorem pliku XML StateDrawable, a następnie po prostu zmienić stan za pomocą minutnika.

+1

zestaw ikon jest możliwe tylko za pomocą tabulatora ikonę, a nie dla samego Actionbar. Czy to działa przez przypadek również w ActionIcons, czy też ta odpowiedź jest niewłaściwa? – Janusz

4

Okazuje się, że Google zamieściło przykład wykonania tego w ramach szerszego projektu kompatybilności z ActionBarCompat. Have a look.

+0

Ten przykład opiera się na ustawionym układzie z sąsiednią ikoną odświeżania i nieokreślonym postępem przy użyciu polecenia pokaż/ukryj. W ActionBar nie mamy tego układu ani dostępu. Wypróbowanie pomysłu Femi ... – larham1

+0

Używa show/hide na starszych urządzeniach, tak; jednak, jeśli spojrzysz na klasy ActionBarHelperHoneycomb/ActionBarHelperICS, zrobią to w prawidłowy/zaktualizowany sposób także dla ICS i Honeycomb. Działa na wszystkich urządzeniach (wiem, używam go we własnej aplikacji dla wersji 2.1+, 3.x i 4.x i działa na nich wszystkich, w tym nieokreślony pasek postępu.) –

+0

Link jest teraz uszkodzony (Google postanowił usunąć adres URL? Westchnienie) – Adam

17

Aby wyjaśnić odpowiedź Jon ö, tym kluczem jest włączenie i wyłączenie rzutem działanie na działanie odświeżania. Działa to zarówno na pasku akcji ActionBarSherlock, jak i natywnym pasku akcji 4.x. Poniższy urywek wprowadzi postępu nieokreślony widok na góry ikony odświeżania, przy założeniu, że pozycja menu odświeżania ma ID „refresh_option” i układ zastępczy (który ma ProgressBar) jest w układzie „progress_wheel”:

MenuItem item = abmenu.findItem(R.id.refresh_option); 
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View abprogress = inflater.inflate(R.layout.progress_wheel, null); 
item.setActionView(abprogress); 

rozbrojony widok postęp, a ikona odświeżania powróci do widoczności:

item.setActionView(null); 

Zobacz a more detailed example na github.

+0

Problem polega na tym, że nowy ProgressBar jest nieco szerszy niż zwykły element akcji. Tak więc wszystkie sąsiednie przedmioty przesuwają się na boki trochę, gdy się pojawią (i "spowrotem", gdy znikają). Masz pomysł, jak rozwiązać ten problem? –

2

Można łatwo to zrobić poprzez:

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.action_refresh: 
       item.setActionView(new ProgressBar(this)); 
       break; 
     } 
     return super.onOptionsItemSelected(item); 
+0

Problem polega na tym, że nowy ProgressBar jest nieco szerszy niż zwykły element akcji. Tak więc wszystkie sąsiednie przedmioty przesuwają się na boki trochę, gdy się pojawią (i "spowrotem", gdy znikają). Wszelkie pomysły na rozwiązanie tego problemu? –

+0

Utworzono plik układu z '' ' '' '. Zapobiega przesuwaniu elementów menu. Pamiętaj, aby ustawić opcję '' item.setActionView (R.layout.your_layout); '' ' –

4

Aby uprościć larham1's answer: nawet nie trzeba nadmuchać nowy widok działania sama bo MenuItem ma the method który akceptuje id układ działania, więc można po prostu napisać :

item.setActionView(R.layout.progress_bar); 
Powiązane problemy