2012-08-23 103 views
9

我有一個ShareActionProvider以及我的ActionBar中的一些其他選項。然而,似乎ShareActionProvider在第一次以縱向模式呈現時出現問題,並且在第一次呈現時無法點擊。方向更改會重新渲染屏幕,然後所有應該可見的選項都可見,並且在旋轉時,ActionBar會再次重新渲染,但這次它也會在縱向模式下正確渲染。ShareActionProvider不可點擊,並且在第一次渲染時不能正確渲染

我已經把它貼描述的情況的圖像:

  1. 的分享選項不正確地呈現,它應該有一個圖標旁邊,如果它不適合佈局,它應該成爲一個三點菜單。

  2. 定位後所有選項都如預期一樣可見。

  3. 旋轉回肖像重新呈現的ActionBar和現在的3點菜單出現,因爲它應該和它是可點擊的。

關於這裏發生了什麼的任何想法?

ActionBar description

這是我的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> 

,這是我如何處理的選項菜單中的一個片段:

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

回答

28

這是因爲您必須在充氣菜單後在onCreateOptionsMenu之後向ShareActionPRovider添加意圖。

如果您只在onPrepareOptionsMenu中執行此操作,則必須手動調用invalidateOptionsMenu()才能觸發ActionBar更新(如所選答案所示)。但那不是做這件事的方法。

它在配置更改時正常工作,因爲調用onPrepareOptionsMenu(),然後您的共享按鈕將起作用,因爲它現在有一個Intent。

爲了解決這個問題,就做這樣的事情:

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

這樣,ShareActionProvider會從一開始就一個Intent,並預期會工作。

+0

非常有趣!我會盡快進行調查。謝謝! – span

1

這樣看來,叫「getActivity( ).invalidateOptionsMenu()「in onCreateView in the Fragment make菜單重新渲染,因爲它應該。它應該在第一次運行時正確渲染,使菜單失效而不對其進行修改,並不是一種合適的解決方案。

1

我不認爲這是一個錯誤。這是因爲你的頭銜改變了。它原本較短(「細節」而不是「ReceiptDetail」),因此係統必須認爲有更多空間顯示更多操作項目。

另外ShareActionProvider的寬度是動態的(它可以高達正常寬度的2倍以上)。

要測試一兩件事,我會建議您將共享操作項目移至第一個位置,刪除臨時解決方法,並查看它是否仍然存在。您也可以刪除共享操作項目,並使用3個或更多常規操作項目作爲測試。

+0

謝謝,當我從我的假期回來時,將看看這個。 – span