¿Cómo desactivas el historial de acciones cuando usas ShareActionProvider?

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

No hay API para hacer esto. Sin embargo, la clase es realmente simple y usted podría muy fácilmente crear su propia versión de ShareActionProvider que no guardó un historial. Solo tendrías que determinar el orden de los posibles blancos usando algún otro medio de ordenar (por ejemplo, alfabéticamente).

Para mí, la mejor solución para evitar el icono de la historia es no utilizar ShareActionProvider, en lugar de ello, 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 ponga un elemento con el ícono ic_action_share …

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

Cree 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 llamar a este método de onOptionsItemSelected

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

Inicie la actividad compartida por 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; } 

A continuación, el ShareActionProvider no agregará la actividad elegida al historial de recursos compartidos.

He creado mi propia versión de ShareActionProvider (y clases de apoyo), puede copiarlos en su proyecto ( https://gist.github.com/saulpower/10557956 ). Esto no sólo 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); } 

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 utilizar el historial, antes de crear sus vistas, llame al

 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 persistir el historial de historiales que se utilizará para ordenar los destinos compartidos. Este archivo se utilizará para toda la vista creada por onCreateActionView (). El valor predeterminado es DEFAULT_SHARE_HISTORY_FILE_NAME. Establecer en null si el historial de compartición no debe persistir entre sesiones .

EDIT: Debo aclarar – El "más utilizado" elemento no se mostrará si no hay historia, por lo que esta es actualmente la única manera de eliminar ese botón.

Aunque ha sido 2 años atrás hoy, pero me gustaría compartir mi experiencia como hice una clase personalizada ShareActionProvider y añadir 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 de 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; } } 

Agregue el código como esto:

  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); } 
  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);*** 
  • Android: XML personalizado para ShareActionProvider
  • Estilo de menú ShareActionProvider
  • No se puede emitir Proveedor de acciones para compartir el proveedor de acciones
  • Barra de herramientas El tema ShareActionProvider siempre está oscuro
  • Excepción de puntero nulo al usar el proveedor de acciones de la biblioteca de soporte
  • Cómo diseñar el Share Action Provider en Android
  • ¿Cómo ocultar el icono de acción compartida (que utiliza más) cerca del proveedor de acciones compartidas?
  • ShareActionProvider para el nivel de API inferior a 14
  • Android ShareActionProvider funciona en el modo de depuración pero no en el dispositivo real
  • Yo uso ShareActionProvider en PopupMenu, pero mostrar dos PopupMenu?
  • Aspecto de ShareActionProvider
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.