2012-08-23 9 views
9

Ho un ShareActionProvider insieme ad alcune altre opzioni nel mio ActionBar. Sembra tuttavia che ShareActionProvider abbia problemi nel rendering correttamente quando viene eseguito il primo rendering in modalità verticale e non è selezionabile sul primo rendering. Un cambio di orientamento ridisegna lo schermo e quindi tutte le opzioni che dovrebbero essere visibili sono visibili e quando si fa ruotare di nuovo ActionBar esegue nuovamente il rendering, ma questa volta viene eseguito correttamente il rendering anche in modalità verticale.ShareActionProvider non selezionabile e non correttamente visualizzato sul primo rendering

Ho allegato un'immagine che descrive la situazione:

  1. L'opzione Condividi non sia resa correttamente, dovrebbe avere un'icona accanto ad essa e se non si adatta il layout, si dovrebbe diventare un menu a 3 punti.

  2. Dopo l'orientamento tutte le opzioni sono visibili come previsto.

  3. La rotazione di nuovo in verticale rende nuovamente ActionBar e ora il menu a 3 punti viene visualizzato come dovrebbe ed è cliccabile.

Qualche idea su cosa sta succedendo qui?

ActionBar description

Questo è il mio 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> 

e questo è come gestire il menu delle opzioni in un frammento:

/** 
* 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; 
} 

risposta

28

Questo perché è necessario aggiungere un intento allo ShareActionPRovider subito dopo aver gonfiato il menu, onCreateOptionsMenu.

Se si esegue questa operazione solo in onPrepareOptionsMenu, è necessario chiamare manualmente invalidateOptionsMenu() per attivare un aggiornamento di ActionBar (come indicato dalla risposta scelta). Ma non è il modo di farlo.

Funziona correttamente quando la configurazione cambia, perché si chiama onPrepareOptionsMenu() e quindi il pulsante di condivisione funzionerà, poiché ora ha un Intento.

Per rimediare, basta fare qualcosa di simile:

@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; 
} 

In questo modo, il ShareActionProvider avrà un Intent fin dall'inizio, e funzionerà come previsto.

+0

Molto interessante! Lo esaminerò non appena avrò un po 'di tempo libero. Grazie! – span

1

Così sembra che chiamare "getActivity () .invalidateOptionsMenu() "in onCreateView nel frammento s il menu ri-render come dovrebbe. Tuttavia, dovrebbe essere visualizzato correttamente nella prima esecuzione, invalidando il menu senza apportare modifiche ad esso non sembra una soluzione adeguata.

1

Non penso che sia un bug. È perché il tuo titolo è cambiato. Era più breve ("Dettagli" invece di "ReceiptDetail") in origine, e quindi il sistema doveva aver pensato che ci fosse più spazio per mostrare più elementi di azione.

Anche la larghezza di ShareActionProvider è dinamica (può essere fino a più di 2 volte la larghezza normale).

Per testare una o due cose, vorrei proporre di spostare l'elemento azione condivisa fino alla prima posizione, rimuovere la soluzione temporanea e vedere se si verifica ancora. Puoi anche rimuovere l'elemento azione condivisa e utilizzare 3 o più elementi azione convenzionali come test.

+0

Grazie, esaminerò questo quando torno dalla mia vacanza. – span