2012-08-23 14 views
9

Tengo un ShareActionProvider junto con algunas otras opciones en mi barra de acciones. Sin embargo, parece que el ShareActionProvider tiene problemas para renderizar correctamente cuando se procesa por primera vez en modo vertical y no se puede hacer clic en la primera representación. Un cambio de orientación vuelve a mostrar la pantalla y, a continuación, se visualizan todas las opciones que se supone que son visibles y, al retroceder, la barra de acciones vuelve a mostrarse, pero esta vez también se está renderizando correctamente en modo vertical.ShareActionProvider no se puede hacer clic y no se muestra correctamente en la primera representación

He adjuntado una imagen que describe la situación:

  1. La opción Compartir no se hace correctamente, debe tener un icono junto a él, y si no se ajusta a la disposición, debería conviértete en un menú de 3 puntos.

  2. Después de la orientación, todas las opciones son visibles como se esperaba.

  3. Al girar de nuevo a retrato, se vuelve a renderizar la barra de acciones y ahora el menú de 3 puntos aparece como debería y se puede hacer clic en él.

¿Alguna idea de lo que está pasando aquí?

ActionBar description

Esta es mi XML:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" > 

    <item 
     android:id="@+id/item_delete" 
     android:icon="@android:drawable/ic_menu_delete" 
     android:showAsAction="ifRoom|withText" 
     android:title="Delete" 
     android:visible="false"/> 
    <item 
     android:id="@+id/item_edit" 
     android:icon="@android:drawable/ic_menu_edit" 
     android:showAsAction="ifRoom|withText" 
     android:title="Edit" 
     android:visible="false"/> 
    <item 
     android:id="@+id/item_share" 
     android:actionProviderClass="android.widget.ShareActionProvider" 
     android:showAsAction="ifRoom|withText" 
     android:title="Share" 
     android:visible="false"/> 
    <item 
     android:id="@+id/item_save" 
     android:icon="@android:drawable/ic_menu_save" 
     android:showAsAction="ifRoom|withText" 
     android:title="Save" 
     android:visible="false"/> 
    <item 
     android:id="@+id/menu_search" 
     android:actionViewClass="android.widget.SearchView" 
     android:icon="@android:drawable/ic_menu_search" 
     android:showAsAction="ifRoom" 
     android:title="@string/menu_search" 
     android:visible="false"/> 

</menu> 

y esto es cómo manejar el menú de opciones en un fragmento:

/** 
* Hook into the OptionsMenu and add an Edit, Delete and Share option. 
*/ 
@Override 
public void onPrepareOptionsMenu(Menu menu) { 
    MenuItem deleteItem = menu.findItem(R.id.item_delete); 
    deleteItem.setVisible(true); 

    MenuItem editItem = menu.findItem(R.id.item_edit); 
    editItem.setVisible(true); 

    MenuItem shareItem = menu.findItem(R.id.item_share); 
    shareItem.setVisible(true); 
    shareActionProvider = (ShareActionProvider) shareItem.getActionProvider(); 
    shareActionProvider.setShareIntent(getShareIntent()); 

    super.onPrepareOptionsMenu(menu); 
} 

/** 
* Builds an intent that takes the path for the image and passes it to 
* the sharing mechanism as a stream built on the URI of the image path. 
* @return the intent to share the image as a stream 
*/ 
private Intent getShareIntent() 
{ 
    Intent shareIntent = new Intent(); 
    shareIntent.setAction(Intent.ACTION_SEND); 
    shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + receipt.getPhoto())); 
    shareIntent.setType("image/jpeg"); 
    return shareIntent; 
} 

Respuesta

28

Esto se debe a que debe agregar un intento al ShareActionPRovider justo después de inflar el menú, en onCreateOptionsMenu.

Si lo hace solo en onPrepareOptionsMenu, tendrá que llamar manualmente al invalidateOptionsMenu() para activar una actualización de ActionBar (como lo indica la respuesta elegida). Pero esa no es la manera de hacerlo.

Funciona bien cuando la configuración cambia, porque se llama a onPrepareOptionsMenu(), y luego su botón Compartir funcionará, ya que ahora tiene un Intento.

Para corregir esto, acaba de hacer algo como esto:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getSupportMenuInflater().inflate(R.menu.YOUR_MENU_XML, menu); 

    ShareActionProvider provider = (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider(); 

    if (provider != null) { 
     Intent shareIntent = new Intent(); 
     shareIntent.setAction(Intent.ACTION_SEND); 
     shareIntent.putExtra(Intent.EXTRA_TEXT, YOUR_TEXT); 
     shareIntent.setType("text/plain"); 
     provider.setShareIntent(shareIntent); 
    } 

    return true; 
} 

De esta manera, el ShareActionProvider tendrá un Intent desde el principio, y funcionará como se espera.

+0

¡Muy interesante! Analizaré esto tan pronto como tenga algo de tiempo libre. ¡Gracias! – span

1

Así que parece que llamar "getActivity () .invalidateOptionsMenu() "en onCreateView en la marca Fragment s el menú vuelve a renderizar como debería. Sin embargo, debería procesarse correctamente en la primera ejecución, invalidar el menú sin realizar cambios no parece una solución adecuada.

1

No creo que sea un error. Es porque tu título cambió. Era más corto ("Detalles" en lugar de "ReciboDetalles") originalmente, por lo que el sistema debe haber pensado que había más espacio para mostrar más elementos de acción.

También el ancho del ShareActionProvider es dinámico (puede ser hasta más de 2 veces el ancho normal).

Para probar una o dos cosas, le propongo que mueva el elemento de acción compartida hasta la primera posición, elimine la solución temporal y vea si todavía ocurre. También puede eliminar el elemento de acción compartida y usar 3 o más elementos de acción convencionales como prueba.

+0

Gracias, lo analizaré cuando regrese de mis vacaciones. – span

Cuestiones relacionadas