15

我正在尝试设置图标 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>
4

5 回答 5

17

当我想要自定义操作栏时,通常我首先看的是 ActionBarSherlock 主题和样式。

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

尝试更改您的主题以直接包含“actionModeShareDrawable”项目。

<style name="Theme.MyApp" parent="Theme.Sherlock.Light">
    <item name="actionModeShareDrawable">@drawable/ic_action_share</item>
</style>
于 2012-06-02T17:52:00.137 回答
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>

换句话说,attr:actionModeShareDrawable在你MyAppTheme的指定不是你真正需要的,但它应该在你attr:actionBarWidgetTheme的下面提到:

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>
于 2014-02-20T23:50:55.720 回答
6

更新:忘记下面的TRICKY方式,只需子类ShareActionProvider,在onCreateActionViewMethod中返回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),将原始视图放在顶部但对用户透明(注意“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

于 2014-03-07T10:27:37.770 回答
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)));

它创建的不是弹出菜单,而是选择器对话框。

于 2014-04-14T14:28:56.397 回答
1

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

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

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

于 2012-11-18T18:08:34.990 回答