2012-05-31 137 views
15

我試圖設置圖標ShareActionProvider,需要一個純白色的而不是半透明的白色。設置操作欄上的自定義共享圖標ShareActionProvider

但是,在share_menu.xml和代碼中的設置不起作用。想知道是否有人在擴展ShareActionProvider之前解決了這個問題。 (我使用actionbarsherlock)

@Override 
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { 
    inflater.inflate(R.menu.share_menu, menu); 
    MenuItem actionItem = menu.findItem(R.id.share_action_provider); 

    ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider(); 
    actionProvider.setShareIntent(mShareIntent); 

    // re-setting the icon as it's not being picked up from the menu xml file 
    actionItem.setIcon(R.drawable.ic_action_share); 

    super.onCreateOptionsMenu(menu, inflater); 

} 

share_menu.xml

<item android:id="@+id/share_action_provider" 
     android:showAsAction="ifRoom" 
     android:title="@string/share_with" 
     android:icon="@drawable/ic_action_share" 
     android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider" /> 

更新: 還試圖在風格上設置它,但沒有喜悅

<style name="Theme.MyApp" parent="Theme.Sherlock.Light"> 
     <item name="actionModeStyle">@style/ActionModeStyle</item> 
     <item name="android:actionModeStyle">@style/ActionModeStyle</item> 
</style> 

<style name="ActionModeStyle" parent="Widget.Sherlock.ActionMode"> 
     <item name="actionModeShareDrawable">@drawable/ic_action_share</item> 
    </style> 

回答

17

當我期待自定義操作欄,通常我看的第一個地方是ActionBarSherlock主題和樣式。

我發現Sherlock主題使用theme.xml文件中的「actionModeShareDrawable」。

嘗試更改主題以直接包含「actionModeShareDrawable」項目。

<style name="Theme.MyApp" parent="Theme.Sherlock.Light"> 
    <item name="actionModeShareDrawable">@drawable/ic_action_share</item> 
</style> 
+8

這隻會在內部版本在所有平臺上使用時才起作用。內置的'ShareActionProvider'使用非公共資源來指定drawable,所以這個解決方案非常適合ActionBarSherlock。 –

+3

將actionModeShareDrawable添加到主題中,似乎對薑餅和ics都有效。 – scottyab

+2

在JB或GB上對我沒有影響。 –

1

您可以重寫像這樣的非公開屬性。

<style name="Theme.MyApp" parent="android:Theme.Holo"> 
     <item name="*android:actionModeShareDrawalbe">@drawable/icon</item> 
</style> 

(*)指的Android

+1

此選項會導致各種設備崩潰。非常不鼓勵使用非公開的Android屬性。 –

+3

那麼對於非Sherlock主題有沒有解決方案?我使用擴展Holo.Light的自定義主題。事情是,我的分享行動圖標必須是白色的,而不是Holo.Light的深灰色圖標。 我試圖覆蓋非公開的屬性如圖所示,但我的設備崩潰開始.no需要進一步測試:)。所以..其他解決方案? – bajicdusko

7

參照非公共資源對於AppCompat需要變化至2種樣式:

1)

<style name="MyAppTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar"> 
    <item name="actionBarWidgetTheme">@style/Theme.AppCompat.CustomShareIcon</item> 
    <item name="android:actionBarWidgetTheme">@style/Theme.AppCompat.CustomShareIcon</item> 
</style> 

換句話說,在您的MyAppTheme中指定attr:actionModeShareDrawable不是您真正需要的,但應該在您的中提及210如下:

2)

<style name="Theme.AppCompat.CustomShareIcon" parent="@style/Theme.AppCompat"> 
    <item name="actionModeShareDrawable">@drawable/abc_ic_menu_share_holo_dark</item> <!-- your icon goes here --> 
</style> 
6

UPDATE:忘記下面的取巧的辦法,只是子類ShareActionProvider,在onCreateActionView方法返回null,並在menu.xml文件文件提供自己的圖標,一切將被罰款

===========================

我發現了一個很棘手,但沒有-ActionBarSherlock特定的方式:

  1. 子類ShareActionProvider,只是一個小調整:

    @Override 
    public View onCreateActionView() { 
        View target = super.onCreateActionView(); 
        ViewGroup viewGroup = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.actionbutton_share, null); 
        ImageView overlay = (ImageView) viewGroup.findViewById(R.id.overlay); 
        ViewGroup container = (ViewGroup) viewGroup.findViewById(R.id.container); 
        container.addView(target); 
        container.getLayoutParams().width = overlay.getLayoutParams().width; 
        container.getLayoutParams().height = overlay.getLayoutParams().height; 
        return viewGroup; 
    } 
    
  2. 創建一個佈局文件(R.layout.actionbutton_share),其將原來的視圖在頂部,但對用戶透明(注意「機器人:阿爾法= 0" 的一部分):

    <?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:tools="http://schemas.android.com/tools" 
        android:layout_width="wrap_content" 
        android:layout_height="match_parent" 
        android:orientation="vertical" > 
    
        <FrameLayout 
         android:id="@+id/container" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_centerHorizontal="true" 
         android:layout_centerVertical="true" 
         android:alpha="0" /> 
    
        <ImageView 
         android:id="@+id/overlay" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_centerHorizontal="true" 
         android:layout_centerVertical="true" 
         android:layout_marginLeft="7dp" 
         android:layout_marginRight="7dp" 
         android:src="@drawable/yours_whatever_share_icon" 
         tools:ignore="ContentDescription" /> 
    
    </RelativeLayout> 
    
  3. 使用砍死ShareActionProvider在您的菜單。xml文件

+0

超級。重寫和返回Null工作得很漂亮 – LumberHack

+1

繼承,返回null的想法應該是自己的答案。它爲我工作。這個答案寫的方式首先是令人困惑的。 –

3

vivimice的解決方案是好的,但最近使用的應用程序的共享圖標被隱藏起來了。

我做了定製的共享圖標爲一個共同的菜單項目沒有任何ShareActionProvider,只是在onOptionsItemSelected()方法中使用此代碼:

Intent sendIntent = new Intent(); 
sendIntent.setAction(Intent.ACTION_SEND); 
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); 
sendIntent.setType("text/plain"); 
startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to))); 

它創建不是一個彈出菜單,而是一個選擇對話框。