【问题标题】:Setting a custom share icon on Actionbar ShareActionProvider在操作栏 ShareActionProvider 上设置自定义共享图标
【发布时间】:2012-05-31 10:48:34
【问题描述】:

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

【问题讨论】:

    标签: android actionbarsherlock shareactionprovider


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这只能工作,因为内部版本在所有平台上都使用。内置的ShareActionProvider 使用非公共资源来指定可绘制对象,因此该解决方案非常适用于 ActionBarSherlock。
    • 将 actionModeShareDrawable 添加到主题中,似乎对姜饼和 ics 都有效。
    • 在 JB 或 GB 上对我没有影响。
    • 我正在使用 ActionBarSherlock 4.4.0,但我没有让这段代码工作...... @JakeWharton 你有解决方案吗?我需要自定义这个图标。
    【解决方案2】:

    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 并不是您真正需要的,但应该在您的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>
    

    【讨论】:

      【解决方案3】:

      更新:忘记下面的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. 创建一个布局文件 (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

      【讨论】:

      • 超级。覆盖和返回 Null 工作得很好
      • 继承,返回null的想法应该有自己的答案。它对我有用。这个答案的写法起初令人困惑。
      【解决方案4】:

      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)));
      

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

        • 此选项会导致各种设备崩溃。强烈建议不要使用非公共 Android 属性。
        • 那么有非夏洛克主题的解决方案吗?我正在使用扩展 Holo.Light 的自定义主题。问题是,我的分享操作图标需要是白色的,而不是 Holo.Light 的深灰色图标。如图所示,我已尝试覆盖非公共属性,但我的设备在启动时崩溃。无需进一步测试:)。那么..还有其他解决方案吗?
        猜你喜欢
        • 2014-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多