Как скрыть значок общего ресурса (который используется чаще всего) рядом с поставщиком общего ресурса?

Смотрите картинку. Как я могу скрыть значок "P", что означает поделиться с Pinterest?

Они оба на панели действий, и я использую ActionBarSherlock.

3 ответа

Решение

Если вы хотите сохранить всю модель данных истории общего ресурса, но просто не хотите, чтобы была добавлена ​​дополнительная активность по умолчанию для общего ресурса. Ответ на Как вы отключите историю обмена при использовании ShareActionProvider? не достаточно хорош

Что вы должны сделать, это:

  • Скопируйте эти классы из ActionBarSherlock в код своего проекта
    • ShareActionProvider.java
    • ActivityChooserView.java
  • В своем классе ShareActionProvider.java импортируйте только что скопированный файл ActivityChooserView.java вместо расположения файла ActionBarShelock.
  • На ActivityChooserView.java -
    • найти линию if (activityCount > 0 && historySize > 0)
    • заменить эту строку на if (false) (это довольно уродливо, но это самое быстрое исправление. вы можете углубиться в код, чтобы удалить все вхождения реализации DefaultActivity)

Изменить: не забудьте установить новый ActionProvider для вашего пункта меню, из XML это будет выглядеть так: android:actionProviderClass="com.*.CustomShareActionProvider"

Это оно!

Я нашел способ обойти это. Я использую библиотеку поддержки 23.0.1, я не проверял это на других версиях библиотеки поддержки.

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

Вот пример кода:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuItem item = menu.add(Menu.NONE, R.id.menu_share, Menu.NONE, R.string.share);
    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    mShareActionProvider = new ShareActionProvider(this) {
        @Override
        public View onCreateActionView() {
            return null;
        }
    };
    item.setIcon(R.drawable.abc_ic_menu_share_mtrl_alpha);
    MenuItemCompat.setActionProvider(item, mShareActionProvider);
    return true;
}

В настоящее время я не нашел никаких проблем с использованием этой работы вокруг.

Исходя из ответа Шона, я создал необходимые классы, вы можете скопировать их в свой проект ( https://gist.github.com/saulpower/10557956). Это не только добавляет возможность отключать историю, но и фильтрует приложения, с которыми вы хотели бы поделиться (если вы знаете имя пакета).

private final String[] INTENT_FILTER = new String[] {
        "com.twitter.android",
        "com.facebook.katana"
};

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.journal_entry_menu, menu);

    // Set up ShareActionProvider's default share intent
    MenuItem shareItem = menu.findItem(R.id.action_share);

    if (shareItem instanceof SupportMenuItem) {
        mShareActionProvider = new ShareActionProvider(this);
        mShareActionProvider.setShareIntent(ShareUtils.share(mJournalEntry));
        mShareActionProvider.setIntentFilter(Arrays.asList(INTENT_FILTER));
        mShareActionProvider.setShowHistory(false);
        ((SupportMenuItem) shareItem).setSupportActionProvider(mShareActionProvider);
    }

    return super.onCreateOptionsMenu(menu);
}
Другие вопросы по тегам