Как отключить историю обмена при использовании ShareActionProvider?

Новый ShareActionProvider, доступный в Android 4.0 (или в более ранних версиях, если вы используете ActionBarSherlock), имеет функцию, при которой последний использованный элемент отображается на панели действий. Есть ли способ отключить это?

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

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

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);
}
    getSupportMenuInflater().inflate(R.menu.share_action_provider, menu);

    // Set file with share history to the provider and set the share intent.
    MenuItem actionItem = menu.findItem(R.id.menu_item_share_action_provider_action_bar);
    ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider();
    ***actionProvider.setShareHistoryFileName(null);
    OnShareTargetSelectedListener listener = new OnShareTargetSelectedListener() {
        public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) {
            startActivity(intent);
            return true;
        }
    };
    actionProvider.setOnShareTargetSelectedListener(listener);***

shareActionProvider.setShareIntent(intent);
shareActionProvider.setOnShareTargetSelectedListener(this);

@Override
public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) {
    // start activity ourself to prevent search history
    context.startActivity(intent);
    return true;
}

Затем ShareActionProvider не добавит выбранную активность в историю общих ресурсов.

 Sharanabasu Angadi05 авг. 2013 г., 10:07
хорошее решение @svenmeier это решило мою проблему
 Felix04 нояб. 2013 г., 13:11
Я не уверен, как это работает для других. При использовании библиотеки v7 compat она по-прежнему падает сjava.lang.IllegalStateException: No preceding call to #readHistoricalData. Кроме того, в документации четко указано это дляonShareTargetSelected: «Примечание: Вы не должны обрабатывать намерение здесь. Этот обратный вызов направлен на уведомление клиента о выполнении совместного использования, поэтому клиент может обновить пользовательский интерфейс при необходимости. Результат возврата игнорируется. Всегда возвращайте false для согласованности».
 loeschg03 сент. 2014 г., 23:00
@ Комментарий Феликса действителен. Документы говорят, что это не должно быть сделано. В итоге я уволен с 2 намерениями.
 Julio Rodrigues13 нояб. 2013 г., 22:02
Не забудьте очистить данные вашего приложения на устройстве для тестирования.
Решение Вопроса

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

 Sean25 июн. 2013 г., 08:09
@ phreakhead Посмотрите на мой ответ - Stackoverflow.com / а / 17290249/1446466. Это поможет вам.
 phreakhead23 мая 2013 г., 01:03
Дело в том, что я хочу сохранить историю, но ТОЛЬКО в выпадающем меню. Добавление дополнительного значка раздражает и больше не помещается в панель.

пользовать ShareActionProvider, вместо этого создайте его как любое другое действие:

 <item 
    android:id="@+id/menu_action_share"
    android:showAsAction="ifRoom" 
    android:icon="@drawable/ic_action_share"
    android:title="@string/share"/>   

В меню / activity_actions.xml поместите элемент со значком ic_action_share ...

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_actions, menu);
    return super.onCreateOptionsMenu(menu);
 }

Нормально надувать меню ...

private void actionShare(){
     Intent i = new Intent(Intent.ACTION_SEND);
     i.setType("text/plain");
     i.putExtra(Intent.EXTRA_SUBJECT, "my string");
     i.putExtra(Intent.EXTRA_TEXT, "another string");
     startActivity(i); 
     //Or like above will always display the chooser
     //startActivity(Intent.createChooser(i, getResources().getText(R.string.share))); 
 }

Создайте метод с намерением ACTION_SEND

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menu_item_share:
            actionShare();
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

И, наконец, вызов этого метода из onOptionsItemSelected

больше информации -> Отправка простых данных в другие приложения

 Tsuharesu05 июн. 2015 г., 16:53
Это даже лучше, чем традиционный ActionProvider.
 TruMan103 июл. 2015 г., 14:06
Этоявляетс лучше родногоShareActionProvider потому что это не отображает историю, новс приложения, которые могут поделиться.

добавьте такой код:

    private void addShareSelectedListener() {
    if (null == mShareActionProvider) return;
    OnShareTargetSelectedListener listener = new OnShareTargetSelectedListener() {
        public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) {
            mContex.startActivity(intent);
            return true;
        }
    };

//Set to null if share history should not be persisted between sessions.
    mShareActionProvider.setShareHistoryFileName(null);
    mShareActionProvider.setOnShareTargetSelectedListener(listener);

}

это не «последний использованный», а «наиболее часто используемый» в течение скользящего периода времени.

Если вы предпочитаете не использовать историю, то перед созданием представлений позвоните

yourShareActionProvider.setShareHistoryFileName(null);

Описание этого метода, из официальные документы (выделение мое):

Устанавливает имя файла для сохранения истории общего ресурса, история которого будет использоваться для упорядочивания целей общего ресурса. Этот файл будет использоваться для всех представлений, созданных onCreateActionView (). По умолчанию используется DEFAULT_SHARE_HISTORY_FILE_NAME. Установите в ноль, если история сеансов не должна сохраняться между сессиями.

EDIT: я должен уточнить - «наиболее часто используемый» элемент не будет отображаться, если нет истории, поэтому в настоящее время это единственный способ удалить эту кнопку.

 Quentamia25 мая 2012 г., 20:25
Я попробовал это, и у меня это не сработало.
 Alexander Lucas25 мая 2012 г., 21:58
Можете ли вы быть более конкретным, что вы подразумеваете под «не работает»?
 Quentamia25 мая 2012 г., 22:43
У меня такое же поведение. Обмен все еще работал .. что не должно быть возможным.
 dokkaebi18 дек. 2012 г., 03:48
Когда я устанавливаю нулевое имя файла на Nexus 7 под управлением 4.2.1, кнопка действия по умолчанию исчезает правильно. Однако попытка выбрать действие из меню общего доступа приводит к сбою сjava.lang.IllegalStateException: No preceding call to #readHistoricalData.
 bodagetta07 июл. 2015 г., 02:52
Это вызывает сбой в моей системе

но я хотел бы поделиться своим опытом, поскольку я создал собственный класс ShareActionProvider и добавил эту строкуchooserView.getDataModel().setHistoryMaxSize(0); Внутри onCreateActionView (), которая сделала для меня всю магию! .. Я проверил его на устройстве Lollipop и на устройстве эмулятора API 16, и он работает отлично. вот мой пользовательский класс:

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.v7.internal.widget.ActivityChooserView;
import android.support.v7.widget.ShareActionProvider;
import android.view.View;


public class MyShareActionProvider extends ShareActionProvider {
    /**
     * Creates a new instance.
     *
     * @param context Context for accessing resources.
     */
    public MyShareActionProvider(Context context) {
        super(context);
    }

    @Override
    public View onCreateActionView() {
        ActivityChooserView chooserView = (ActivityChooserView) super.onCreateActionView();
        Drawable icon;
        if (Build.VERSION.SDK_INT >= 21) {
            icon = getContext().getDrawable(R.drawable.share_icon);
        }else{
            icon = getContext().getResources().getDrawable(R.drawable.share_icon);
        }
        chooserView.setExpandActivityOverflowButtonDrawable(icon);
        chooserView.getDataModel().setHistoryMaxSize(0);
        return chooserView;
    }

}

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