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"/>

如何更改图标(或颜色)?

谢谢,

4

3 回答 3

8

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

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

如果使用 AppCompat,则此资源是为 Lollipor 或更新版本定义的,但不是为以前的版本定义的。


以下是本机的答案ShareActionProvider(这是该问题的原始范围)。

要更改此图像,您应该更改actionModeShareDrawable应用主题的值。看一下ShareActionProvider'sonCreateActionView()方法:

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将来内部实施发生变化,这可能会很脆弱。

于 2014-06-29T00:06:03.523 回答
3

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

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="actionModeShareDrawable">@drawable/ic_share</item>
</style>
于 2015-02-23T16:00:58.290 回答
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"为主题application / activity.

于 2014-05-24T16:47:40.093 回答