2011-08-22 15 views
17

Me gustaría agregar una barra de progreso indeterminada a Honeycomb ActionBar, de modo que cada vez que el usuario presiona "Actualizar", el icono de actualización se convierta temporalmente en una barra de progreso indeterminada, hasta la tarea se completa. La aplicación de correo electrónico ya lo hace, pero no puedo entender cómo.Reemplazar un icono de elemento de menú de ActionBar con una ProgressBar indeterminada

¿Algún consejo?

+0

relacionado para actualización/refrescante: icono de http://stackoverflow.com/questions/9731602/animated-icon-for-actionitem – rds

Respuesta

5

Difícil decir exactamente cómo lo hace la aplicación de correo electrónico, pero es posible que desee mantenerse simple y simplemente llame al setIcon con el id. De un archivo XML StateDrawable, y simplemente cambie el estado con un temporizador.

+1

sólo es posible para un icono de pestaña y no para la propia barra de acción. ¿Esto funciona por accidente también para ActionIcons o esta respuesta es incorrecta? – Janusz

4

Resulta que Google ha publicado un ejemplo de hacer exactamente esto como parte de su proyecto de compatibilidad de ActionBarCompat más amplio. Have a look.

+0

Ese ejemplo se basa en un diseño conjunto con un icono de actualización adyacente y un progreso indeterminado, usando show/hide. En ActionBar, no tenemos ese diseño ni acceso. Probando la idea de Femi al lado ... – larham1

+0

Utiliza mostrar/ocultar en dispositivos más antiguos, sí; sin embargo, si observa las clases ActionBarHelperHoneycomb/ActionBarHelperICS, también lo hacen de la manera adecuada/actualizada para ICS y Honeycomb. Funciona en todos los dispositivos (lo sé, lo estoy aprovechando en mi propia aplicación para 2.1+, 3.x y 4.x y funciona en todos ellos, barra de progreso indeterminada incluida.) –

+0

El enlace ahora está roto (Google decidió eliminar la URL? Suspiro) – Adam

17

Para aclarar la respuesta de Jon O, la clave es establecer y desarmar una vista de acción en la acción de actualización. Esto funciona tanto en ActionBarSherlock como en la barra de acción 4.x nativa. El siguiente fragmento se puso la vista indeterminada progreso en la parte superior del icono de actualización, suponiendo que el elemento de menú de actualización tiene el ID 'refresh_option' y la disposición de reemplazo (que tiene un ProgressBar) está en disposición '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); 

desarmar el punto de vista progreso, y el icono de actualización volverán a la visibilidad:

item.setActionView(null); 

Ver a more detailed example en github.

+0

El problema es que la nueva ProgressBar es un poco más ancha que el elemento de acción normal. Por lo tanto, todos los elementos vecinos se desplazan hacia los lados un poco como aparece (y "retrocede" cuando desaparece). Alguna idea sobre como resolver esto? –

2

Puede hacerlo fácilmente por:

@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

El problema es que la nueva ProgressBar es un poco más ancha que el elemento de acción normal. Por lo tanto, todos los elementos vecinos se desplazan hacia los lados un poco como aparece (y "retrocede" cuando desaparece). ¿Alguna idea sobre cómo resolver esto? –

+0

Creé un archivo de diseño con el '' ' '' '. Evita el desplazamiento de los elementos del menú. Recuerde configurar '' 'item.setActionView (R.layout.your_layout);' '' –

4

Para simplificar larham1's answer: que ni siquiera necesita para inflar vista nueva acción en sí misma, porque tiene MenuItemthe method que acepta Identificación de diseño de acción, por lo que simplemente puede escribir :

item.setActionView(R.layout.progress_bar); 
Cuestiones relacionadas