Android自定义图标ShareActionProvider?

前端之家收集整理的这篇文章主要介绍了Android自定义图标ShareActionProvider?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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"/>

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

谢谢,

解决方法

编辑/简答:如果使用AppCompat的ShareActionProvider,只需在主题定义中提供新的 actionModeShareDrawable.
<style name="MyTheme" parent="Theme.AppCompat">
    <item name="actionModeShareDrawable">@drawable/my_share_drawable</item>
</style>

如果不使用AppCompat,则使用this resource is defined for Lollipor or newer,但不适用于以前的版本.

下面是本机ShareActionProvider的答案(这是本问题的原始范围).

要更改此图像,您应该为应用程序的主题更改actionModeShareDrawable的值.看一下ShareActionProvider的onCreateActionView()方法

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

猜你在找的Android相关文章