2012-03-30 14 views
5

Estoy intentando implementar un botón de actualización en mi aplicación para permitir que un usuario se vuelva a sincronizar manualmente en un servidor web. El código funciona, pero tengo problemas para entender las vistas de acción (al menos, creo que eso es lo que se supone que debo usar).Cambiar la vista en el elemento de menú en la barra de acciones

Mi elemento de menú está aquí:

<item 
    android:id="@+id/main_menu_refresh" 
    android:enabled="true" 
    android:icon="@drawable/refresh" 
    android:orderInCategory="1" 
    android:showAsAction="ifRoom" 
    android:title="@string/refresh" 
    android:actionViewClass="android.widget.ProgressBar"> 
</item> 

El problema es que siempre muestra el ProgressBar. Me preguntaba si funcionaba como el widget de búsqueda (el único ejemplo que realmente veo en línea) y añadí la etiqueta collapseActionView al showAsAction y eso impedía que apareciera inmediatamente. Sin embargo, cuando hago clic en el botón Actualizar, el ícono desaparece (bien), pero también lo hace el Título en la barra de acciones, y la Barra de progreso aparece en el lado izquierdo de la ventana donde solía estar el título. Además no es lo que quería.

como algo de un último esfuerzo, he tratado de añadir esto a mi código, y quitar el actionViewClass del XML:

MenuItem refresh = (MenuItem)findViewById(R.id.main_menu_refresh); 
Log.w("MyApp", "Have Menu"); 
ProgressBar pb = new ProgressBar(ReadingList.this); 
refresh.setActionView(pb); 

eso no funcionó bien, y me da un error de puntero nulo en setActionView.

Necesito una solución a la que pueda llamar desde cualquier función (hay un período de sincronización automática al principio que me gustaría que muestre también la ProgressBar), y luego poder devolverla a su ícono estático.

He intentado leer a través de this question, pero estoy teniendo problemas para entender lo que significa la respuesta. Siento que estaba tratando de hacer exactamente lo que dice, pero supongo que no. Cualquier ayuda es muy apreciada.

Editar: Por sugerencia de sastraxi.

public class IconSwitcher extends LinearLayout{ 



public IconSwitcher(Context context) { 
    super(context); 

    ProgressBar pb = new ProgressBar(context); 
    ImageView iv = new ImageView(context); 

    addView(iv); 
    addView(pb); 
} 
} 

Esta es mi clase hasta ahora. Sin embargo, cuando intento y de referencia con:

MenuItem refresh = (MenuItem)findViewById(R.id.main_menu_refresh); 
IconSwitcher ic = (IconSwitcher) refresh.getActionView(); 

me sale un error de puntero nulo. en la creación de IconSwitcher. El botón XML es el siguiente:

<item 
    android:id="@+id/main_menu_refresh" 
    android:enabled="true" 
    android:icon="@drawable/refresh" 
    android:orderInCategory="1" 
    android:showAsAction="ifRoom" 
    android:title="@string/refresh" 
    android:actionViewClass="IconSwitcher"> 
</item> 

Solo estoy teniendo dificultades para hacer referencia a esa vista de IconSwitcher.

Editar 2: Aparentemente tengo problemas para hacer referencia al elemento de menú.

MenuItem refresh = (MenuItem)findViewById(R.id.main_menu_refresh); 
refresh.setVisible(false); 

También me da un puntero nulo cuando intento establecer la visibilidad. ¿Qué pasa con mis referencias?

+0

Esto no está fallando en setActionView, pero en el punto donde lo está haciendo (MenuItem) findViewById (R.id.main_menu_refresh). Aparentemente es una ClassCastException para convertir ActionItemView en MenuItem. – Namratha

+0

Lo descubrí. Encontré esta pregunta anterior [SO] (http://stackoverflow.com/questions/7142722/replacing-an-actionbar-menu-item-icon-with-an-indeterminate-progressbar). A partir de ahí, encontré el código que Google escribió al hacer esto [aquí] (http://developer.android.com/resources/samples/ActionBarCompat/src/com/example/android/actionbarcompat/ActionBarHelperHoneycomb.html). Básicamente fue copiar y pegar en ese punto, y funciona perfectamente. –

Respuesta

0

En lugar de fijar su vista de clase acción a un ProgressBar, ponerlo en una clase personalizada LinearLayout, como tal:

class MyViewItem extends LinearLayout 

Añadir un ProgressBar y un ImageView que los niños de su constructor con addView, y regular la las visibilidades de los niños como GONE o VISIBLE cuando su código lo requiera.

+0

Tengo problemas para entender. ¿Me puede dar un poco más de detalles sobre esta clase personalizada? Agregué más a la publicación principal para mostrar con qué estoy teniendo problemas. –

+0

Debe usar el nombre completo en XML, p. Ej. 'com.mydomain.mypackage.IconSwitcher', en lugar de simplemente' IconSwitcher'. Pruébalo, mira si las cosas empiezan a funcionar. – sastraxi

+0

No, todavía tengo un error de puntero nulo. También está definitivamente en la línea 'IconSwitcher ic = (IconSwitcher) refresh.getActionView();'. Si comento esa línea, no obtengo ningún error, pero obviamente no obtengo un botón dinámico, solo el ícono estático. ¿Debo declarar IconSwitcher en el manifiesto de alguna manera? –

0

intenta utilizar:

<item 
    android:id="@+id/main_menu_refresh" 
    android:enabled="true" 
    android:icon="@drawable/refresh" 
    android:orderInCategory="1" 
    android:title="@string/refresh" 
    app:showAsAction="ifRoom" 
    app:actionViewClass="android.widget.ProgressBar"> 
</item> 

nota de este dos líneas:

app:showAsAction="ifRoom" 
    app:actionViewClass="android.widget.ProgressBar" 
0

¿trató de ir a buscar el elemento de menú como este?

MenuItem item = getToolbar().getMenu().findItem(Menu.FIRST); 
Cuestiones relacionadas