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?
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
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. –