2012-06-05 11 views
12

Come mostrare Indeterminate ProgressBar quando il pulsante Refresh viene premuto in ActionBarSherlock e di nuovo Mostra pulsante Aggiorna quando Visualizza gruppo su aggiornato?Come mostrare indeterminato barra di avanzamento quando si preme il pulsante Aggiorna in ActionBarSherlock?

Aggiornamento 1: Ho una risposta che è incompleta. Sto mettendo una taglia sulla domanda in modo che più gli sviluppatori possono aiutare a costruire una buona risposta che può utile ad altri in futuro.

Come possiamo mostrare un Indeterminate ProgressBar che assomiglia a quello mostrato nell'immagine qui sotto enter image description here

+1

Sembra che hai avuto una domanda che @anadobes risposto alla vostra soddisfazione (e che si dovrebbe accettare). Ora hai un'altra domanda, indipendente, che dovresti fare come una nuova domanda anziché come una modifica a questa. Se desideri la taglia sulla nuova domanda, puoi segnalare questa domanda, spiegare la situazione e una mod potrebbe rimborsarla per te. – blahdiblah

+1

Penso che la modifica sia abbastanza vicina da non giustificare una nuova domanda. Ma, in futuro, cerca di includere questo tipo di informazioni * quando fai la domanda originale *. Occasionalmente abbiamo problemi con gli utenti che tentano di riutilizzare le domande esistenti per chiederne di nuove, cosa che non è consentita. – Will

+0

Perché farlo in primo luogo? Questo non conferma gli attuali schemi di progettazione – Bostone

risposta

31

Sembra ActionBarSherlock non fornisce metodo specifico per animare un aggiornamento MenuItem.

Ciò che è possibile fare (utilizzando l'API classica di Android) è utilizzare il metodo setActionView(int resId) e fornire l'id di un layout con una barra di avanzamento al suo interno.

All'inizio della vostra azione di aggiornamento basta chiamare:

item.setActionView(R.layout.refresh_menuitem); 

E quando è terminata l'azione di aggiornamento chiamata:

item.setActionView(null); 

Ecco un esempio di ciò che il file di layout refresh_menuitem.xml può avere:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:addStatesFromChildren="true" 
       android:focusable="true" 
       android:paddingLeft="4dp" 
       android:paddingRight="4dp" 
       android:gravity="center" 
       style="?attr/actionButtonStyle"> 
    <ProgressBar 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:focusable="true" 
      style="@android:style/Widget.ProgressBar.Small"/> 
</LinearLayout> 
+0

1 Ok, funziona. Possiamo cambiare l'aspetto di barra di avanzamento in ICS? –

+0

Ho aggiornato la domanda, per favore dai un'occhiata. –

+0

impostare lo stile ProgressBar a "@android: style/Widget.Holo.ProgressBar.Small" – omoling

10

Qui è Come si aggiunge questo tipo di ProgressBar indeterminata con un oggetto ActionBarSherlock: (in realtà è più facile l'altra, ma la Progressbar è mostrato solo e non al di sopra di un MenuItem)

1 - Metodo Mettete questa riga nel onCreate() prima della setContentView() chiama:

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 

-> Questa riga specifica che verrà utilizzata la funzione ProgressBar indeterminata.

2 - Attivare la ProgressBar indeterminata chiamando:

setSupportProgressBarIndeterminateVisibility(true); 

3 - Disabilitare la ProgressBar indeterminata chiamando:

setSupportProgressBarIndeterminateVisibility(false); 

Nota: Date un'occhiata nella cartella di esempio della cartella ActionBarSherlock. Ho trovato questo codice nel file seguente: JakeWharton-ActionBarSherlock-9598f2b \ campioni \ demos \ src \ com \ ActionBarSherlock \ campione \ demos \ IndeterminateProgress.java

+0

Sto cercando di combinare i due che hanno la barra indeterminata in stile ICS in MenuItem. –

2

Ecco un codice completo:

private static final int menuItemIdRefresh = 10; //class constant 
private boolean refresh; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuItem refreshItem = menu.add(0, menuItemIdRefresh, 0, 
      getString(R.string.action_refresh)).setShowAsActionFlags(
      MenuItem.SHOW_AS_ACTION_ALWAYS); 

    if (isRefreshing) { 
     refreshItem.setActionView(R.layout.indeterminate_progress); 
    } else { 
     refreshItem.setActionView(null); 
     refreshItem.setIcon(R.drawable.ic_refresh); 
    } 

    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case menuItemIdRefresh: { 
      //the user has pressed the refresh button 
     if (!isRefreshing) { 
      isRefreshing = true; 
      new RefreshMyViewAsyncTask().execute(""); 
     } 
    } 
     break; 

    default: 
     break; 
    } 

    return false; 
} 

Un'ultima nota, per ottenere il funzionamento del codice sopra indicato, è necessario chiamare anche il supportoInvalidateOptionsMenu(). Si può aggiungere che il metodo del RefreshMyViewAsyncTask OnPreExecute().

Spero che questo aiuti a qualcuno.

Problemi correlati