2013-03-20 7 views
13

Chcę umieścić nieokreślony pasek postępu w moim pasku zadań (przy użyciu ActionBarSherlock). Wszystko działa, ale chcę, żeby był to mały pasek postępu. Używam następującego stylu:indeterminateProgressBar w stylu ActionBar - padding issue

<style name="IndeterminateProgress" parent="@android:style/Widget.ProgressBar.Small"> 
    <item name="android:progressBarPadding">32dp</item> 
    <item name="progressBarPadding">32dp</item> 
    <item name="android:itemPadding">32dp</item> 
    <item name="itemPadding">32dp</item> 
</style> 


<style name="Widget.Styled.ActionBar.Tiles" parent="Widget.Sherlock.Light.ActionBar"> 
    <item name="android:indeterminateProgressStyle">@style/IndeterminateProgress</item> 
    <item name="android:progressBarPadding">32dp</item> 
    <item name="progressBarPadding">32dp</item> 
    <item name="android:itemPadding">32dp</item> 
    <item name="itemPadding">32dp</item> 
</style> 

Problem polega na tym, że nie mogę ustawić wypełnienia na pasku postępu. Jak widać powyżej, Próbowałem wszystkich możliwych kombinacji itemPadding i progressBarPadding itp

Rezultat jest zawsze taki sam: enter image description here

Jakieś pomysły?

Odpowiedz

10

Znalazłem roztwór roboczy Jak ustawić poprzeczkę nieokreślony postępu z odpowiedniej wielkości i padding. Moje rozwiązanie nie używa obejścia z funkcją setActionView(). Jest to rozwiązanie dla wbudowanej funkcji paska postępu, obsługiwanej przez natywny pasek działań (ActionBarSherlock). Pasek postępu jest włączony/wyłączony za pomocą metody setProgressBarIndeterminateVisibility (boolean). Testowałem to na systemach Android 2, 3, 4 i ldpi, mdpi, xhdpi.

Result

AndroidManifest.xml:

<application 
    ... 
    android:theme="@style/Theme.Example"> 

/res/values/styles.xml:

<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
    ... 

    <style name="Theme.Example" parent="Theme.Sherlock"> 
     <item name="actionBarStyle">@style/Example.ActionBar</item> 
     <item name="android:actionBarStyle">@style/Example.ActionBar</item> 
    </style> 

    <style name="Example.ActionBar" parent="Widget.Sherlock.ActionBar"> 
     <item name="indeterminateProgressStyle">@style/Example.ActionBar.IndeterminateProgressBar</item> 
     <item name="android:indeterminateProgressStyle">@style/Example.ActionBar.IndeterminateProgressBar</item> 
    </style> 

    <style name="Example.ActionBar.IndeterminateProgressBar" parent="@android:style/Widget.ProgressBar.Large.Inverse"> 
     <item name="android:indeterminateDrawable">@drawable/layer_list_ab_indeterminate_progress_bar</item> 
     <item name="android:minWidth">@dimen/ab_indeterminate_progress_bar_size</item> 
     <item name="android:maxWidth">@dimen/ab_indeterminate_progress_bar_size</item> 
     <item name="android:minHeight">@dimen/ab_indeterminate_progress_bar_size</item> 
     <item name="android:maxHeight">@dimen/ab_indeterminate_progress_bar_size</item> 
    </style> 
</resources> 

/res/drawable/layer_list_ab_indeterminate_progress_bar.xml:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <!-- 
     /res/drawable-mdpi/ab_indeterminate_progress_bar asset is taken from 
     /sdk/platforms/android-18/data/res/mdpi/spinner_white_48.png 
     and its content (optical square) is resized to ~0.6 (must be even number) 

     /res/drawable-mdpi-v14/ab_indeterminate_progress_bar asset is taken from 
     /sdk/platforms/android-18/data/res/mdpi/spinner_48_outer_holo.png 
     and its content (optical square) is resized to 0.75 
     --> 
     <rotate 
      android:drawable="@drawable/ab_indeterminate_progress_bar" 
      android:interpolator="@android:anim/linear_interpolator" 
      android:pivotX="50%" 
      android:pivotY="50%" 
      android:fromDegrees="0" 
      android:toDegrees="360" /> 
    </item> 
</layer-list> 

/res/values/dimens.xml:

<dimen name="ab_indeterminate_progress_bar_size">48dp</dimen> 

końcu stworzyłem aktywa pasku postępu.Kiedyś te dwa aktywa z Android SDK:

  • /sdk/platforms/android-18/data/res/mdpi/spinner_white_48.png dla Honeycomb i starszych
  • /sdk/platform/android-18 /data/res/mdpi/spinner_48_outer_holo.png dla ICS i nowszych

aby uzyskać właściwego rozmiaru i wyściółkę, musimy zmienić wielkość aktywów. Zmieniłem rozmiar: spinner_white_48.png na ~ 0.6. Dla mdpi miało to 28 pikseli. Musi być parzysta, aby być centralnie symetryczną. Zmieniłem rozmiar tylko treści, a nie całej ikony. Zatem ikona w mdpi ma nadal 48 pikseli, ale jej zawartość (kwadrat optyczny) jest mniejsza (28 pikseli). Możesz w prosty sposób zmienić rozmiar treści: najpierw zmień "rozmiar obrazu" na 28px X 28px, a następnie zmień "rozmiar płótna" na 48px X 48px. Zmieniłem rozmiar: spinner_48_outer_holo.png na 0.75. Możesz pobrać poniższe zasoby.

Dlaczego używam różnych zasobów w przypadku architektury Honeycomb i ICS +? Ponieważ jeśli używam tylko zasobów Holo, animacja jest trochę wyskokowa na niektórych urządzeniach z Honeycomb-.

Wskazówka: możesz dodać kolejny element z pewną animacją do layer_list_ab_indeterminate_progress_bar.xml. Na przykład standardowy pasek postępu Holo wykorzystuje 2 animacje z przeciwnymi kierunkami i różnymi zakresami stopni. Zobacz progress_medium_holo.xml w SDK.

/res/drawable-mdpi/ab_indeterminate_progress_bar.png:

enter image description here

/res/drawable-mdpi-v14/ab_indeterminate_progress_bar.png (ledwo widoczne na tej stronie):

enter image description here

/res/drawable-hdpi/ab_indeterminate_progress_bar.png:

enter image description here

/res/drawable-hdpi-v14/ab_indeterminate_progress_bar.png (ledwo widoczne na tej stronie):

enter image description here

/res/drawable-xhdpi/ab_indeterminate_progress_bar.png:

enter image description here

/res/drawable-xhdpi-v14/ab_indeterminate_progress_bar.png (ledwie widoczne na tej stronie):

enter image description here

+0

Czy naprawdę nie ma sposobu, aby to zrobić bez tworzenia niestandardowych projektów i zmieniania rozmiaru zasobów? Pożądany efekt można uzyskać prawie przez ustawienie 'minWidth',' minHeight', 'maxWidth',' maxHeight' w stylu, o którym wspomniałeś, ale 'ProgressBar' pojawia się w samym rogu (bez ikony menu z przepełnionymi trzema kropkami to wygląda okropnie). Ustawienie 'padding',' layout_margin' w stylu nie ma żadnego wpływu. Czemu! czemu!!?? – janakagamini

1

Nie znam dokładnej odpowiedzi, ale te ustawienia pracował dla mnie ..

To mój refresh_spinner.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:gravity="center"> 
<ProgressBar android:layout_width="32dp" 
android:layout_height="32dp" 
android:layout_gravity="center" 
android:layout_marginRight="12dp" 
android:layout_marginLeft="12dp" 
style="?indeterminateProgressStyle" /> 
    </FrameLayout> 

I to w odpowiednim stylu xml

<style name="Widget.MyTheme.ActionBar" parent="Widget.Sherlock.ActionBar"> 
    <item name="indeterminateProgressStyle">?android:attr/progressBarStyleSmallInverse</item> 
</style> 

Ustawienia te działały dla mnie. Proszę dać mi znać, jeśli masz jakiekolwiek wątpliwości.

Pozdrowienia parvaz Bhaskar

EDIT2: od Próbowałam różnych metod skończyło się używając Android: atr/progressBarStyleSmallInverse jako jedyny ośrodek w moim style.xml które później refrenced z mojego wirowania pod xml styl jako style = „indeterminateProgressStyle?”

EDIT: zachować odniesienie swojego mENUITEM i kiedy chcesz pokazać użytkowania refresh progressbar setActionView (R.layout.your_layout) i zmienić go na null, gdy zapotrzebowanie jest ponad . onCreateOptionsMenu byłoby dobrym miejscem do pobrania elementu menu na początku.

+1

Dzięki, ale to nie działa. Szczerze mówiąc nie wiem, jak to działa, ponieważ nie odwołujesz się do pliku 'refresh_spinner.xml' w dowolnym miejscu swojego stylu. Czy na pewno masz na myśli 'ProgressBar' wewnątrz' ActionBar' –

+0

Przepraszam, że zapomniałem wspomnieć. Zastępuję menuItem po kliknięciu menuItem.setActionView (R.layout.refresh_spinner), i aby zmienić go z powrotem na normalny używam menuItem.setActionView (null), aby usunąć i zachować ikonę linii –

+0

Znałem rozwiązanie z widokiem akcji . Szukałem rozwiązania z funkcjonalnością paska postępu, która jest wbudowana w implementację paska czynności - 'setProgressBarIndeterminateVisibility (true)' Thanks anyway :) –

1

spotkam to dzisiaj i znaleźć rozwiązanie dla Android 3/4 +

ProgressBar mProgressBarInActionBar = null; 
Resources res = Resources.getSystem(); 
int id = res.getIdentifier("progress_circular", "id", "android"); 
View internal = findViewById(id); 
if(internal != null && internal instanceof ProgressBar){ 
    mProgressBarInActionBar = (ProgressBar)internal; 
} 
mProgressBarInActionBar.setPadding(0, 0, right, 0); 

ustawiona odpowiednia prawo:)

1

Miałem ten sam problem i znalazłem łatwą odpowiedź:

<style name="ActionBarProgressBar.MyStyle" parent="@android:style/Widget.Holo.ProgressBar.Large"> 
     <item name="android:minWidth">56dp</item> 
     <item name="android:maxWidth">56dp</item> 
     <item name="android:minHeight">35dp</item> 
     <item name="android:maxHeight">35dp</item> 
</style> 

Szerokość to standardowa szerokość elementu paska czynności. Jeśli zmienisz minHeight i maxHeight, obraz będzie skalowany w obie strony.

A oto stylizacji Actionbar gdzie ustawić wygląd nieokreślona toku:

<style name="action_bar_theme" parent="@android:style/Widget.Holo.ActionBar"> 
     <item name="android:indeterminateProgressStyle">@style/ActionBarProgressBar.MyStyle</item> 
</style> 

i definicją w temacie, którego używasz (nie zapomnij go używać w swoim manifeście):

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
     <item name="android:actionBarStyle">@style/action_bar_theme</item>  
</style> 

Cheers, Paul

+1

To działało dobrze, dzięki – praveenb