2014-05-24 3 views
5

Я использую ShareActionProvider, но я хочу настроить значок (я хочу изменить цвет, потому что в настоящее время он белый).Android Custom Icon 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"/> 

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

ТНХ,

ответ

7

Редактировать/Короткий ответ: если вы используете ShareActionProvider от AppCompat, просто укажите новый 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, но не для предыдущих версий.


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

Для изменения этого изображения, вы должны изменить значение actionModeShareDrawable, для вашего приложения тему. Посмотрите на onCreateActionView() метода ShareActionProvider «s:

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(). Затем вы можете использовать любой желаемый вариант.

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

+0

mhhh, я не понимаю, как переопределить oncreateactionview, каков исходный код в этой функции? – deveLost

+0

@devLost Исходный код находится на https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/ShareActionProvider.java. Вы _sure_ вы не используете библиотеку 'appcompat'? Потому что, если бы вы это сделали, это было бы проще, этот подход предполагает дублирование большого кода рамки. – matiash

+0

mhh, я попытался изменить этот код, чтобы изменить drawable, но у меня было много ошибок. Я попробую снова. Что изменится, если я импортирую библиотеку appcompat? – deveLost

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.

+0

Я не хочу, чтобы изменить цвет фона:/ – deveLost

+0

тема Sherlock использует «actionModeShareDrawable» как найденный в файле theme.xml. Попробуйте изменить тему, чтобы включить элемент «actionModeShareDrawable» напрямую. <стиль = имя родителя "Theme.MyApp" = "Theme.Sherlock.Light"> <имя элемента = "actionModeShareDrawable"> @ вытяжке/ic_action_share –

+0

нормально, я постараюсь его в течение нескольких минут, ТНХ – deveLost

2

Чтобы изменить значок для ShareActionProvider вам необходимо расширить тему AppCompat и установить пользовательский значок на «actionModeShareDrawable»:

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