android - pueden - qué significa que el historial está desactivado en hangouts
¿Cómo se desactiva el historial de acciones cuando se utiliza ShareActionProvider? (8)
Aunque ya hace 2 años, me gustaría compartir mi experiencia, ya que hice una clase personalizada de ShareActionProvider y chooserView.getDataModel().setHistoryMaxSize(0);
esta línea chooserView.getDataModel().setHistoryMaxSize(0);
¡Dentro de 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;
}
}
El nuevo ShareActionProvider disponible en Android 4.0 (o en versiones anteriores si está utilizando ActionBarSherlock) tiene una característica donde el último elemento utilizado se muestra en la barra de acción. ¿Existe alguna forma de apagar esto?
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 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);
}
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, ShareActionProvider no agregará la actividad elegida al historial de acciones.
Para mí, la mejor solución para evitar el ícono del historial es no usar ShareActionProvider, en lugar de ello, créelo 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 coloca 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);
}
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)));
}
Crea 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
Punto de aclaración: no es el "último uso", es el "más utilizado", en un período de tiempo de ventana deslizante.
Si prefiere no usar el historial, entonces antes de crear sus vistas, llame al
yourShareActionProvider.setShareHistoryFileName(null);
Descripción de este método, a partir de los documentos oficiales (énfasis mío):
Establece el nombre de archivo de un archivo para conservar el historial de recursos compartidos, que se utilizará para ordenar los destinos compartidos. Este archivo se utilizará para todas las vistas creadas por onCreateActionView (). El valor predeterminado es DEFAULT_SHARE_HISTORY_FILE_NAME. Se establece en nulo si el historial de acciones no debe persistir entre sesiones .
EDITAR: Debería aclarar: el elemento "más utilizado" no se mostrará si no hay historial, por lo que esta es actualmente la única forma de eliminar ese botón.
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);
}
No hay API para hacer esto. Sin embargo, la clase es realmente simple y usted podría crear fácilmente su propia versión de ShareActionProvider
que no mantuvo un historial. Solo tendría que determinar el orden de clasificación de los posibles objetivos utilizando otros medios de ordenamiento (por ejemplo, alfabéticamente).
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);***