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"/>

Как я могу изменить значок (или цвет) ?

thx,

3 ответов


редактировать / короткий ответ: если вы используете ShareActionProvider AppCompat, просто предоставьте новый actionModeShareDrawable в определении темы.

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

если не использование AppCompat, затем этот ресурс определен для Lollipor или новее, но не для предыдущих версий.


Ниже приведен ответ для родного ShareActionProvider (что было первоначальной областью этого вопроса).

для измените это изображение, вы должны изменить значение actionModeShareDrawable тема для вашего приложения. Взгляните на ShareActionProvider ' s 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);
    ...  

к сожалению, этот атрибут не public в рамках Android (хотя это is при использовании библиотек совместимости, таких как AppCompat или ActionBarSherlock). В этом случае это просто вопрос переопределения этого значения для темы.

если вы не используете ни одну из этих библиотек, единственная решение (о котором я знаю) заключается в создании подкласса ShareActionProvider и повторно onCreateActionView() метод. Затем вы можете использовать любой drawable вы хотите вместо этого.

редактировать однако это еще более осложняется тем, что реализация 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 изменения в будущем.


чтобы изменить значок ShareActionProvider, вам нужно расширить тему AppCompat и установить пользовательский значок в "actionModeShareDrawable":

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="actionModeShareDrawable">@drawable/ic_share</item>
</style>

вы можете изменить цвет фона, определив свой стиль, как:

<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.