我正在使用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,但不用于以前的版本。
以下是 native
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)的其他类,因此使情况更加复杂。为了避免重复很多代码,您可以通过反射更改图标,如下所示: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
的内部实现将来发生变化,这可能会很脆弱。