2012-02-06 4 views
18

vorrei mettere un ProgressBar sulla barra di azione, ma l'impostazioneStyling ProgressBar indeterminata sulla ActionBar

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
setProgressBarIndeterminateVisibility(true); 

su onCreate metodo produce medie dimensioni progressbar (48dip x 48dip) immagino. Voglio cambiare la dimensione della progressBar ma non riesco a trovare come farlo. Mi potete aiutare per favore?

risposta

28

È necessario creare il proprio stile da applicare a ActionBar. C'è un ottimo tutorial su questo su Android Developers Blog. Per definire la barra di avanzamento intermedia, prova a utilizzare indeterminateProgressStyle e Widget.ProgressBar.Small. Ecco un rapido esempio.

<style name="YourTheme" parent="@android:style/Theme.Holo.Light"> 
    <item name="android:actionBarStyle">@style/ActionBarIPS</item> 
</style> 

<style name="IndeterminateProgress" parent="@android:style/Widget.ProgressBar"> 
    <item name="android:indeterminateDrawable">@drawable/ic_launcher</item> 
</style> 

<style name="ActionBarIPS" parent="@android:style/Widget.ActionBar"> 
    <item name="android:indeterminateProgressStyle">@style/IndeterminateProgress</item> 
    <item name="android:background">@color/white</item> 
</style> 
+0

non funziona ... la barra di avanzamento sulla barra delle azioni è sempre la stessa ... – Matroska

+0

Ho modificato la mia risposta. Ora funziona. Scusa, non l'avevo mai provato prima. Se vuoi modificare la ProgressBar più piccola, usa invece "Widget.ProgressBar.Small". :) – adneal

+0

funziona anche se ora ho problemi di compatibilità con actionbarsherlock – Matroska

2

Per ActionBarSherlock è possibile modificare lo stato di avanzamento indeterminata dalla genitorialità l'Widget.ProgressBar.Small, questo dovrebbe funzionare senza Sherlock pure.

Ho recuperato i drawable dalla cartella di Android-15 res nell'SDK, assicuratevi di prendere progress_small_white.xml e risorse associate.

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="Dark" parent="Theme.Sherlock"> 
     <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item> 
     <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item> 
    </style> 

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

     <style name="IndeterminateProgress" parent="@android:style/Widget.ProgressBar.Small"> 
     <item name="android:indeterminateDrawable">@drawable/progress_small_holo</item> 
    </style> 
</resource> 
+0

funziona bene ma naturalmente non si muove. come applicare l'animazione progress_small_white su di esso? – urSus

+0

Quando si fa clic sull'elemento azione, è possibile sostituirlo con un layout effettivo della barra di avanzamento: refreshItem.setActionView (myProgressBarFrameLaoutInflated); – ThanksMister

15

Styled ANIMATO icona progressbar indeterminata sulla ActionBar:

1.Define res/valori/styles.xml (Questo esempio utilizza la libreria Sherlock per fornire ActionBar nelle vecchie versioni di Android in modo, se si arent utilizzando Sherlock voi dovrebbe usare i genitori gli appropriati per definire i vostri stili personalizzati):

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="MyTheme" parent="Theme.Sherlock"> 
     <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item> 
     <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item> 
    </style> 

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

    <style name="IndeterminateProgress" parent="@android:style/Widget.ProgressBar.Small"> 
     <item name="android:indeterminateDrawable">@drawable/progress_indeterminate_custom</item> 
    </style> 
</resource> 

2.Define res/drawable/progress_indeterminate_custom.xml:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
<item> 
    <rotate 
     android:drawable="@drawable/ic_progress_logo1" 
     android:fillAfter="true" 
     android:fromDegrees="-180" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:toDegrees="180" /> 
    </item> 
    <item> 
    <rotate 
     android:drawable="@drawable/ic_progress_logo2" 
     android:fillAfter="true" 
     android:fromDegrees="180" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:toDegrees="-180" /> 
</item> 
</layer-list> 

3. Sopra il codice vengono utilizzate 2 immagini (ic_progress_logo1 e ic_progress_logo2) come icona indeterminata del progresso personalizzato. Puoi usare quante più immagini/drawable vuoi aggiungendo nuovi elementi. Inoltre, puoi applicare diversi effetti/animazioni. Maggiori informazioni qui: Animation Resources

4.Apply stile che hai creato utilizzando AndroidManifest.xml:

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:name=".application.MyApplication"> 
    <activity 
     android:name=".activities.MyActivity" 
     android:label="@string/app_name" 
     android:theme="@style/MyTheme" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

5.Enjoy tua animata corso personalizzato icona indeterminato: D

+0

Si consiglia di fornire una soluzione completa, non solo un collegamento. Grazie. –

+2

Ho modificato la risposta, divertiti! –

2

Per rendere il ProgressBar su ActionBar più piccolo, ciò che si vuole fare è ignorare Widget.Holo.ProgressBar.Small come questo

<style name="Theme.MyStyle" parent="@style/Theme.AppCompat.Light.DarkActionBar"> 
    ... 
    <item name="actionBarStyle">@style/ActionBar.MyStyle</item> 
    ... 
</style> 

<style name="ActionBar.MyStyle" parent="@style/Widget.AppCompat.Light.ActionBar.Solid"> 
    ... 
    <item name="android:indeterminateProgressStyle">@style/ActionBarProgressBar.MyStyle</item> 
    ... 
</style> 

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

e imposta la dimensione su qualsiasi cosa desideri.

8

Ho lottato con tutte queste soluzioni perché non stavo usando actionbarsherlock. Ho sfruttato la risposta di Vlasto Benny Lava, che inizialmente non funzionava per me.

Ecco cosa ho fatto passo dopo passo:

1) aprire il file styles.xml, dovrebbe essere sotto /res/values/styles.xml. Se non esiste, crearlo.

2) pasta in:

<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
    <style name="myTheme" parent="android:Theme.Holo"> 
     <item name="android:actionBarStyle">@style/ActionBar.MyStyle</item> 
    </style> 

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

    <style name="ActionBarProgressBar.MyStyle" parent="@android:style/Widget.Holo.ProgressBar.Small"> 
     <item name="android:minWidth">28dp</item> 
     <item name="android:maxWidth">28dp</item> 
     <item name="android:minHeight">28dp</item> 
     <item name="android:maxHeight">28dp</item> 
    </style> 
</resources> 

Una catchya mi sono imbattuto, non è possibile utilizzare un nome di tema della "AppTheme" altrimenti le sostituzioni non funzioneranno. Ho usato "MyTheme". Questo tema utilizza Holo quindi ha un ActionBar nero come mostrato nell'immagine qui sotto. Se si desidera avere un ActionBar colore bianco poi, naturalmente, sostituire android:Theme.Holo con android:Theme.Holo.Light ecc

3) Modifica AndroidManifest.xml.

tua <application> deve contenere android:theme="@style/myTheme" in modo che l'applicazione utilizza gli stili di override da styles.xml

cioè, il mio manifesto file di tag applicazione sembra qualcosa di simile:

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/myTheme" 
    android:name="Application Name Here" > 

Perché il vostro semplicemente riducendo le dimensioni del progresso png esistente non è necessario esportare alcuna immagine e spostarle nella posizione disegnabile ecc.

Ecco come appare il mio, il si ze of the icon è perfetto per me.

enter image description here

1

Incolla sotto il codice nel metodo on Create ed eseguire questo sotto la barra nella modalità intermedia.
Se si desidera visualizzare sulla percentuale di avanzamento, poi commento progressBar.setIndeterminate(true); metodo e rimuovere il commento metodo progressBar.setProgress(65) e mantenere il vostro progresso

 progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal); 
     progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24)); 
    //progressBar.setProgress(65); 
    //progressBar.setBackgroundDrawable(getResources().getDrawable(R.color.lock_background_greeen)); 
     progressBar.setIndeterminate(true); 

    // retrieve the top view of our application 
     final FrameLayout decorView = (FrameLayout) getWindow().getDecorView(); 
     decorView.addView(progressBar); 


     ViewTreeObserver observer = progressBar.getViewTreeObserver(); 
     observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      View contentView = decorView.findViewById(android.R.id.content); 
      progressBar.setY(contentView.getY() - 10); 

      ViewTreeObserver observer = progressBar.getViewTreeObserver(); 
      observer.removeGlobalOnLayoutListener(this); 
     } 
    }); 
0

devo essere compatibile con le versioni precedenti del SDK di Android, così ho dovuto fare cose semplici e utilizzato:

styles.xml

<style name="TallerTitleBarDialogThemeStyle" parent="@android:style/Theme.Dialog"> 
    <item name="android:windowTitleSize">36dp</item> 
</style> 

A ndroidManifest.xml

android:theme="@style/TallerTitleBarDialogThemeStyle" 

per l'attività che ho bisogno di regolare.