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

15

Я пытаюсь установить значок 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   ответов
3

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)));

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

1

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

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

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

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

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

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

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

  1. 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;
    }
    
  2. 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>
    
  3. Use the hacked ShareActionProvider in your menu.xml file

Супер Переопределение и возврат Null работал прекрасно
Идея «наследовать, вернуть ноль» должна иметь собственный ответ. Это сработало для меня. То, как этот ответ написан, поначалу сбивает с толку.
17

Когда я пытаюсь настроить панель действий, обычно первое, на что я обращаю внимание, это темы и стили 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>
Не имеет значения для меня на JB или GB.
Добавление actionModeShareDrawable в основную тему, похоже, работает как на gingerbread, так и на ics. scottyab
Я использую ActionBarSherlock 4.4.0 и у меня не работает этот фрагмент кода ... @JakeWharton У вас есть решение для этого? Мне нужно настроить этот значок.
Это будет работать только потому, что внутренняя версия используется на всех платформах. ВстроенныйShareActionProvider использует непубличный ресурс для указания drawable, поэтому это решение очень специфично для ActionBarSherlock.
7

За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>

Похожие вопросы