Android自定义图标ShareActionProvider?

6
我是一个ShareActionProvider的用户,但我想自定义图标(我想改变颜色,因为当前图标是白色)。
我使用以下代码:
        mShareActionProvider = (ShareActionProvider) item.getActionProvider();
    Intent myIntent = new Intent(Intent.ACTION_SEND);
    myIntent.setType("text/plain");
    myIntent.putExtra(Intent.EXTRA_TEXT, str_share);
    mShareActionProvider.setShareIntent(myIntent);

XML :
<item
  android:id="@+id/menu_item_share"
  android:showAsAction="ifRoom"
  android:title="@string/titlePartager"
  android:actionProviderClass="android.widget.ShareActionProvider"
  android:icon="@drawable/ic_share"/>

我该如何更改图标(或颜色)?谢谢。
3个回答

8

编辑/简短回答:如果使用AppCompat的ShareActionProvider,只需在您的主题定义中提供一个新的actionModeShareDrawable即可。

<style name="MyTheme" parent="Theme.AppCompat">
    <item name="actionModeShareDrawable">@drawable/my_share_drawable</item>
</style>

如果没有使用AppCompat,则此资源仅适用于Lollipor或更新版本,而不适用于早期版本。
以下是本问题原始范围——原生的ShareActionProvider的答案。 要更改此图像,您应该为应用程序主题更改actionModeShareDrawable的值。请查看ShareActionProvideronCreateActionView()方法:
public View onCreateActionView() {
    // Create the view and set its data model.
    ...

    // Lookup and set the expand action icon.
    TypedValue outTypedValue = new TypedValue();
    mContext.getTheme().resolveAttribute(R.attr.actionModeShareDrawable, outTypedValue, true);
    Drawable drawable = mContext.getResources().getDrawable(outTypedValue.resourceId);
    ...  

不幸的是,这个属性在Android框架中 不是 公开的(尽管如果使用兼容性库,如AppCompat或ActionBarSherlock,则是公开的)。在这种情况下,只需要为主题覆盖该值。

如果您没有使用这些库,则我所知道的唯一解决方案是创建一个ShareActionProvider的子类,并重新实现onCreateActionView()方法。然后,您可以使用任何您想要的可绘制对象。

编辑 然而,onCreateActionView()的实现使用了其他不公开的类,这使得问题更加复杂。为了避免重复大量代码,您可以通过反射来更改图标,像这样:

public class MyShareActionProvider extends ShareActionProvider
{
    private final Context mContext;

    public MyShareActionProvider(Context context)
    {
        super(context);
        mContext = context;
    }

    @Override
    public View onCreateActionView()
    {
        View view = super.onCreateActionView();
        if (view != null)
        {
            try
            {
                Drawable icon = ... // the drawable you want (you can use mContext to get it from resources)
                Method method = view.getClass().getMethod("setExpandActivityOverflowButtonDrawable", Drawable.class);
                method.invoke(view, icon);
            }
            catch (Exception e)
            {
                Log.e("MyShareActionProvider", "onCreateActionView", e);
            }
        }

        return view;
    }
}

与任何涉及反射的解决方案一样,如果将来ShareActionProvider的内部实现发生更改,这种方法可能会变得脆弱。


嗯,我不明白如何重新实现oncreateactionview,这个函数的初始代码是什么? - deveLost
@devLost 原始代码位于 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/ShareActionProvider.java 你确定你没有使用 appcompat 库吗?因为如果你使用了,这将会更容易,而这种方法涉及到复制很多框架代码。 - matiash
嗯,我试图修改这段代码,更改可绘制对象,但是出现了许多错误。我会再试一次。如果我导入appcompat库,会有什么变化? - deveLost
@deveLost 是的,因为它还使用了框架中私有的其他类。你也必须复制这些类 :/ - matiash
哦,它正在运行,太棒了!(只是我自己的一个小错误)。非常感谢!! - deveLost
显示剩余4条评论

3

要更改ShareActionProvider的图标,您需要扩展AppCompat主题并将自定义图标设置为“actionModeShareDrawable”:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="actionModeShareDrawable">@drawable/ic_share</item>
</style>

0

您可以通过定义自定义样式来更改背景颜色,例如:

<resources>
    <style name="MyTheme" parent="@android:style/Theme.Holo.Light">
        <item name="android:actionBarStyle">@style/MyActionBar</item>
    </style>

    <style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
        <item name="android:background">ANY_HEX_COLOR_CODE</item>
    </style>
</resources>

现在你需要将 "MyTheme" 设置为 应用程序/活动 的主题。

我不想改变背景颜色 :/ - deveLost
Sherlock主题使用在theme.xml文件中找到的"actionModeShareDrawable"。尝试更改您的主题,直接包含"actionModeShareDrawable"项目。<style name="Theme.MyApp" parent="Theme.Sherlock.Light"> <item name="actionModeShareDrawable">@drawable/ic_action_share</item> </style> - Karim Baidar
抱歉,我完全忘记回答了。我没有使用Sherlock,我正在使用HOlo主题,但它不起作用。 - deveLost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接