在ActionBar 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> 

Solutions Collecting From Web of "在ActionBar ShareActionProvider上设置自定义共享图标"

当我正在寻找自定义操作栏时,通常我所看到的第一个地方是ActionBarSherlock主题和样式。

我发现Sherlock主题使用在theme.xml文件中find的“actionModeShareDrawable”。

尝试改变你的主题,直接包含“actionModeShareDrawable”项目。

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

对于AppCompat ,需要对两种样式进行更改:

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并不是你真正需要的,但是应该在你的attr:actionModeShareDrawable中提到如下:

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> 

更新:忘记下面的TRICKY方式,只是子类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. 创build一个布局文件(R.layout.actionbutton_share),将原始视图置于顶部,但对用户透明(请注意“android:alpha = 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. 在你的menu.xml文件中使用被攻击的ShareActionProvider

vivimice的解决scheme是好的,但最后使用的应用程序共享的图标也隐藏了。

我没有任何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))); 

它不创buildpopup菜单,而是创build一个select器对话框。

您可以像这样覆盖非公共属性。

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

(*)表示引用Android中的非公开资源