¿Cómo se desactiva el historial compartido cuando se usa ShareActionProvider?

El nuevo ShareActionProvider disponible en Android 4.0 (o en versiones anteriores si usa ActionBarSherlock) tiene una función en la que se muestra el último elemento utilizado en la barra de acción. ¿Existe alguna forma de apagar esto?

preguntado el 22 de mayo de 12 a las 17:05

8 Respuestas

Para mí, la mejor solución para evitar el ícono de historial es no usar ShareActionProvider, en su lugar, crearlo como cualquier otra acción:

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

en el menú/actividad_acciones.xml coloque un elemento con el icono ic_acción_compartir...

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

Inflar el menú normalmente...

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

Crear un método con una intención 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);
        }
    }

Y finalmente llame a este método desde onOptionsItemSelected

más información ->Envío de datos simples a otras aplicaciones

respondido 09 mar '14, 23:03

Esto es incluso mejor que el ActionProvider tradicional. - Tsuharesu

Este planteamiento de « is mejor que el nativo ShareActionProvider porque no muestra el historial pero todos los aplicaciones que pueden compartir. - TruMan1

Inicie la actividad de compartir usted mismo:

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

Entonces ShareActionProvider no agregará la actividad elegida al historial compartido.

Respondido el 01 de junio de 12 a las 16:06

No estoy seguro de cómo funciona esto para otros. Al usar la biblioteca de compatibilidad v7, aún fallará con java.lang.IllegalStateException: No preceding call to #readHistoricalData. Además, la documentación establece claramente esto para onShareTargetSelected: "Nota: no debe manejar la intención aquí. Esta devolución de llamada tiene como objetivo notificar al cliente que se está compartiendo, para que el cliente pueda actualizar la interfaz de usuario si es necesario. El resultado devuelto se ignora. Siempre devuelva falso para mantener la coherencia". - Felix

Recuerde limpiar los datos de su aplicación en el dispositivo para la prueba. - julio rodrigues

El comentario de @Felix es válido. Los médicos dicen que esto no debe hacerse. Termino con 2 intentos disparados. - Loeschg

Creé mi propia versión de ShareActionProvider (y clases de apoyo), puede copiarlas en su proyecto (https://gist.github.com/saulpower/10557956). Esto no solo agrega la capacidad de desactivar el historial, sino también de filtrar las aplicaciones con las que le gustaría compartir (si conoce el nombre del paquete).

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

Respondido 12 Abr '14, 22:04

No hay una API para hacer esto. Sin embargo, la clase es realmente simple y podría crear fácilmente su propia versión de ShareActionProvider que no guardó una historia. Solo tendría que determinar el orden de clasificación de los posibles objetivos utilizando algún otro medio de ordenación (p. ej., alfabéticamente).

contestado el 22 de mayo de 12 a las 19:05

La cuestión es que quiero mantener el historial, pero SOLO en el menú desplegable. Agregar el ícono adicional es molesto y ya no cabe en la barra. - cabeza de phreak

@phreakhead Echa un vistazo a mi respuesta - stackoverflow.com/a/17290249/1446466 . Ayudará a su necesidad. - Sean

Punto de aclaración: no es el "último uso", es el "uso más frecuente", a lo largo de un período de tiempo de ventana deslizante.

Si prefiere no usar el historial, antes de crear sus vistas, llame

yourShareActionProvider.setShareHistoryFileName(null);

Descripción de este método, de la documentos oficiales (énfasis mío):

Establece el nombre de archivo de un archivo para conservar el historial de recursos compartidos, cuyo historial se utilizará para ordenar objetivos de recursos compartidos. Este archivo se usará para todas las vistas creadas por onCreateActionView(). El valor predeterminado es DEFAULT_SHARE_HISTORY_FILE_NAME. Establecer en nulo si el historial compartido no debe persistir entre sesiones.

EDITAR: debo aclarar: el elemento "usado con más frecuencia" no aparecerá si no hay un historial, por lo que actualmente es la única forma de eliminar ese botón.

contestado el 22 de mayo de 12 a las 19:05

¿Puede ser más específico, en lo que quiere decir con "no funcionó"? - Alejandro Lucas

Tengo el mismo comportamiento. El uso compartido seguía funcionando... lo que no debería ser posible. - Quentamia

Cuando llamo a setShareHistoryFileName(null), la acción de compartir ya no hace nada :( - más svenmeier

Cuando configuro el nombre de archivo como nulo en un Nexus 7 con 4.2.1, el botón de acción predeterminado desaparece correctamente. Sin embargo, intentar elegir una acción desde el menú compartir produce un bloqueo con java.lang.IllegalStateException: No preceding call to #readHistoricalData. - dokkaebi

Esto provoca un bloqueo en mi sistema: bodagetta

Aunque hoy hace 2 años, me gustaría compartir mi experiencia cuando hice una clase ShareActionProvider personalizada y agregué esta línea chooserView.getDataModel().setHistoryMaxSize(0); ¡dentro de onCreateActionView() que hizo toda la magia por mí! .. Lo probé en el dispositivo Lollipop y en el dispositivo emulador API 16 y funciona perfectamente. aquí está mi clase personalizada:

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

}

Respondido 20 Abr '16, 16:04

agradable, pero en androidx el setHistoryMaxSize() el método es inaccesible... :( - l33t

@ l33t Tienes razón ... Descubrí que incluso antes desde la biblioteca appcompat v.23 - Yasser Khayyal

agrega el código así:

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

}

respondido 26 nov., 12:06

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

respondido 22 mar '13, 15:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.