编辑/简短回答:如果使用 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
将来内部实施发生变化,这可能会很脆弱。