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は、テーマ定義に new を指定するだけです。

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

AppCompat を使用しない場合、このリソースは Lollipor 以降に対して定義されますが、以前のバージョンに対しては定義されません。


以下は、ネイティブの回答ですShareActionProvider(これは、この質問の元の範囲でした)。

この画像を変更するにactionModeShareDrawableは、アプリのテーマの値を変更する必要があります。ShareActionProvideronCreateActionView()メソッドを見てください。

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 に答える