Установка пользовательского значка общего ресурса на панели действий ShareActionProvider

Я пытаюсь установить значок ShareActionProvider, мне нужен сплошной белый вместо полупрозрачного белого.

Однако настройка в share_menu.xml и коде не работает. Просто интересно, есть ли у кого-нибудь обходной путь для этого, прежде чем расширять ShareActionProvider. (Я использую actionbarsherlock)

@Override
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
    inflater.inflate(R.menu.share_menu, menu);
    MenuItem actionItem = menu.findItem(R.id.share_action_provider);

    ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider();
     actionProvider.setShareIntent(mShareIntent);

    // re-setting the icon as it's not being picked up from the menu xml file
    actionItem.setIcon(R.drawable.ic_action_share);

    super.onCreateOptionsMenu(menu, inflater);

}

share_menu.xml

 <item android:id="@+id/share_action_provider"
        android:showAsAction="ifRoom"
        android:title="@string/share_with"
        android:icon="@drawable/ic_action_share"
        android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider" />

Обновить: Также попытался установить его в стиле, но не радость

<style name="Theme.MyApp" parent="Theme.Sherlock.Light">
        <item name="actionModeStyle">@style/ActionModeStyle</item>
        <item name="android:actionModeStyle">@style/ActionModeStyle</item>
</style>

<style name="ActionModeStyle" parent="Widget.Sherlock.ActionMode">
      <item name="actionModeShareDrawable">@drawable/ic_action_share</item>
  </style>

Ответы на вопрос(5)

vivimiceЭто хорошее решение, но значок последнего использованного приложения для совместного использования также становится скрытым.

Я сделал пользовательский значок общего доступа как общий элемент меню без какого-либо ShareActionProvider, просто в методе onOptionsItemSelected () использовал этот код:

Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
sendIntent.setType("text/plain");
startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)));

Он создает не всплывающее меню, а диалог выбора.

Вы можете переопределить непубличный атрибут следующим образом.

<style name="Theme.MyApp" parent="android:Theme.Holo">
        <item name="*android:actionModeShareDrawalbe">@drawable/icon</item>
</style>

(*) означает ссылку на непубличные ресурсы в Android

 19 авг. 2013 г., 10:57
Эта опция вызывает сбои на разных устройствах. Настоятельно не рекомендуется использовать непубличные атрибуты Android.
 25 нояб. 2013 г., 22:10
Так есть ли решение для не тем Шерлока? Я использую пользовательскую тему, которая расширяет Holo.Light. Дело в том, что мой значок акции должен быть белым, а не темно-серым значком Holo.Light. Я попытался переопределить непубличный атрибут, как показано, но мой сбой устройства при запуске. Нет необходимости тестировать дальше :). Так есть ли другое решение?

ОБНОВЛЕНИЕ: Забудьте о TRICKY пути ниже, просто подкласс ShareActionProvider, вернуть ноль вonCreateActionView Метод, и предоставьте свой собственный значок в файле menu.xml, все будет хорошо

===========================

Я нашел очень хитрый, но не специфичный для ActionBarSherlock способ:

Sub-class ShareActionProvider, with just a little tweak:

@Override
public View onCreateActionView() {
    View target = super.onCreateActionView();
    ViewGroup viewGroup = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.actionbutton_share, null);
    ImageView overlay = (ImageView) viewGroup.findViewById(R.id.overlay);
    ViewGroup container = (ViewGroup) viewGroup.findViewById(R.id.container);
    container.addView(target);
    container.getLayoutParams().width = overlay.getLayoutParams().width;
    container.getLayoutParams().height = overlay.getLayoutParams().height;
    return viewGroup;
}

Create a layout file (R.layout.actionbutton_share), which place the original view at top but transparent to user (Note the "android:alpha=0" part) :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:alpha="0" />

    <ImageView
        android:id="@+id/overlay"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="7dp"
        android:layout_marginRight="7dp"
        android:src="@drawable/yours_whatever_share_icon"
        tools:ignore="ContentDescription" />

</RelativeLayout>

Use the hacked ShareActionProvider in your menu.xml file

 16 сент. 2015 г., 11:53
Идея «наследовать, вернуть ноль» должна иметь собственный ответ. Это сработало для меня. То, как этот ответ написан, поначалу сбивает с толку.
 16 мар. 2015 г., 18:31
Супер Переопределение и возврат Null работал прекрасно
Решение Вопроса

Когда я пытаюсь настроить панель действий, обычно первое, на что я обращаю внимание, это темы и стили ActionBarSherlock.

Я обнаружил, что тема Шерлока использует & quot; actionModeShareDrawable & quot; как найдено вtheme.xml файл.

Попробуйте изменить свою тему, чтобы включить & quot; actionModeShareDrawable & quot; Товар напрямую.

<style name="Theme.MyApp" parent="Theme.Sherlock.Light">
    <item name="actionModeShareDrawable">@drawable/ic_action_share</item>
</style>
 28 сент. 2013 г., 04:31
Не имеет значения для меня на JB или GB.
 15 апр. 2014 г., 12:47
Я использую ActionBarSherlock 4.4.0 и у меня не работает этот фрагмент кода ... @JakeWharton У вас есть решение для этого? Мне нужно настроить этот значок.
 03 июн. 2012 г., 23:39
Это будет работать только потому, что внутренняя версия используется на всех платформах. ВстроенныйShareActionProvider использует непубличный ресурс для указания drawable, поэтому это решение очень специфично для ActionBarSherlock.
 scottyab06 июн. 2012 г., 15:31
Добавление actionModeShareDrawable в основную тему, похоже, работает как на gingerbread, так и на ics.

ЗаAppCompat необходимы изменения в 2 стилях:

1)

<style name="MyAppTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="actionBarWidgetTheme">@style/Theme.AppCompat.CustomShareIcon</item>
    <item name="android:actionBarWidgetTheme">@style/Theme.AppCompat.CustomShareIcon</item>
</style>

Другими словами, уточняяattr:actionModeShareDrawable в вашемMyAppTheme это не то, что вам действительно нужно, но это должно быть упомянуто в вашемattr:actionBarWidgetTheme следующим образом:

2)

<style name="Theme.AppCompat.CustomShareIcon" parent="@style/Theme.AppCompat">
    <item name="actionModeShareDrawable">@drawable/abc_ic_menu_share_holo_dark</item> <!-- your icon goes here -->
</style>

Ваш ответ на вопрос