¿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?
- Compartir imagen y texto a través de whatsapp
- Cómo puedo obtener mi ShareActionProvider para enviar texto dinámicamente (de los oyentes) ver buscapersonas etc
- ShareActionProvider no funciona cuando showAsAction = ifRoom
- Configuración de un icono de recurso compartido en Actionbar ShareActionProvider
- ShareActionProvider no se puede hacer clic y no se procesa correctamente en el primer procesamiento
- Android: ShareActionProvider sin historial
- Cómo eliminar YourSelf de la lista ShareActionProvider
- ActionBarSherlock & ShareActionProvider causar InflateException
- ShareActionProvider con un icono - buscando como simple actionitem
- ¿Pasar la URL de WebView a ShareActionProvider?
- No se puede emitir de ActionProvider a ShareActionProvider
- Comparte el menú usando android.support.v7 no muestra los iconos de las aplicaciones
- Icono personalizado de Android ShareActionProvider?
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);***