¿Cómo se desactiva compartir historial cuando se utiliza ShareActionProvider?


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

Author: Quentamia, 2012-05-22

8 answers

No hay ninguna API para hacer esto. Sin embargo, la clase es realmente simple y usted podría crear muy fácilmente su propia versión de ShareActionProvider que no mantenga un historial. Solo tendría que determinar el orden de clasificación de los posibles objetivos utilizando otros medios de ordenación (por ejemplo, alfabéticamente).

 3
Author: Jake Wharton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-22 18:18:57

Para mí, la mejor solución para evitar el icono de la historia es no utilizar ShareActionProvider, en lugar de él, 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ú/activity_actions.xml poner un elemento con el icono ic_action_share...

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

Infle 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 intent 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 llamar a este método desde Onoptisitemselected

Más información- > Enviar Datos Simples a Otras Aplicaciones

 20
Author: Nissar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-09 23:56:14

Inicia la actividad de compartir por ti 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 el ShareActionProvider no agregará la actividad elegida al historial compartido.

 13
Author: svenmeier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-01 15:41:12

He creado mi propia versión del ShareActionProvider( y las clases de soporte), 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 desea 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);
}
 4
Author: saulpower,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-12 21:47:55

Punto de aclaración: No es el "último utilizado", es "más utilizado", a través de un período de tiempo de ventana deslizante.

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

yourShareActionProvider.setShareHistoryFileName(null);

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

Establece el nombre de archivo de un archivo para conservar el historial del recurso compartido que se utilizará para ordenar los destinos del recurso compartido. Este archivo se utilizará para todas las vistas creadas por onCreateActionView(). El valor predeterminado es DEFAULT_SHARE_HISTORY_FILE_NAME. Se establece en null si el historial compartido no debe persistirse entre sesiones.

EDITAR: Debo aclarar - El elemento "más utilizado" no aparecerá si no hay historial, por lo que esta es la única forma de eliminar ese botón.

 1
Author: Alexander Lucas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-22 18:41:50

Aunque ha sido hace 2 años hoy, pero me gustaría compartir mi experiencia como hice una clase ShareActionProvider personalizada y agregar esta línea chooserView.getDataModel().setHistoryMaxSize(0); dentro onCreateActionView() que hizo toda la magia para 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;
    }

}
 0
Author: Yasser Khayyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-20 15:16:50

Añade 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);

}
 -1
Author: Seven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-26 06:45:02
    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);***
 -1
Author: jiangws88,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-22 15:49:00