編集/簡単な回答: AppCompat の ShareActionProvider を使用している場合actionModeShareDrawable
は、テーマ定義に new を指定するだけです。
<style name="MyTheme" parent="Theme.AppCompat">
<item name="actionModeShareDrawable">@drawable/my_share_drawable</item>
</style>
AppCompat を使用しない場合、このリソースは Lollipor 以降に対して定義されますが、以前のバージョンに対しては定義されません。
以下は、ネイティブの回答です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
に、将来的に内部実装が変更された場合、これは脆弱になる可能性があります。