android - how - Llamar a startActivity() desde fuera de un contexto de actividad
how to get context android (21)
Además: si muestra enlaces en la vista de lista en el fragmento , no lo cree así
adapter = new ListAdapter(getActivity().getApplicationContext(),mStrings);
en lugar de llamar
adapter = new ListAdapter(getActivity(),mStrings);
el adaptador funciona bien en ambos casos, pero los enlaces solo funcionan en el último.
He implementado un ListView
en mi aplicación de Android. Me vinculo a este ListView
utilizando una subclase personalizada de la clase ArrayAdapter
. Dentro del método ArrayAdapter.getView(...)
anulado, asigno un OnClickListener
. En el método onClick
de OnClickListener
, quiero iniciar una nueva actividad. Tengo la excepción:
Calling startActivity() from outside of an Activity context requires the
FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
¿Cómo puedo obtener el Context
que está trabajando ListView
(la Activity
actual)?
Creo que tal vez esté implementando OnClickListener en el lugar equivocado; por lo general, definitivamente debería implementar un OnItemClickListener en su Actividad y configurarlo en el ListView, o tendrá problemas con sus eventos ...
Dado que agregar indicadores afecta a event_flow y stack_history, es mejor pasar el ''contexto de la aplicación'' a la no actividad desde donde debe llamar a una clase de actividad de la siguiente manera:
"ActivityClassName.this" (Aunque pase el contexto de esta manera, contendrá todos los detalles y la información que necesita para llamar a una Actividad desde un escenario sin actividad)
Por lo tanto, no es necesario establecer o agregar indicadores, esto funcionará bien en todos los casos.
Elaborando un poco más la respuesta de Alex Volovoy.
En caso de que tengas este problema con los fragmentos, getActivity () funciona bien para obtener el contexto.
En otros casos:
Si no quieres usar-
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//not recommend
luego haga una función como esta en su OutsideClass -
public void gettingContext(Context context){
real_context = context;//where real_context is a global variable of type Context
}
Ahora, en su actividad principal cada vez que realice una nueva llamada a OutsideClass, utilice el método anterior inmediatamente después de definir OutsideClass, dando el contexto de la actividad como argumento. También en tu actividad principal haz una función.
public void startNewActivity(final String activity_to_start) {
if(activity_to_start.equals("ACTIVITY_KEY"));
//ACTIVITY_KEY-is a custom key,just to
//differentiate different activities
Intent i = new Intent(MainActivity.this, ActivityToStartName.class);
activity_context.startActivity(i);
}//you can make a if-else ladder or use switch-case
Ahora vuelva a su clase externa, y para comenzar una nueva actividad, haga algo como esto:
@Override
public void onClick(View v) {
........
case R.id.any_button:
MainActivity mainAct = (MainActivity) real_context;
mainAct.startNewActivity("ACTIVITY_KEY");
break;
}
........
}
De esta manera, podrás iniciar diferentes actividades llamadas desde diferentes OutsideClass sin arruinar las banderas.
Nota: intente no almacenar en caché el objeto de contexto a través del constructor para el fragmento (con el adaptador, está bien). Un fragmento debe tener un constructor vacío; de lo contrario, la aplicación se bloquea en algunos escenarios.
recuerda llamar
OutsideClass.gettingContext(Context context);
en la función onResume () también.
En lugar de usar (getApplicationContext)
use YourActivity.this
En mi opinión, es mejor utilizar el método de startActivity()
solo en el código de su Activity.class
. Si usa eso en el Adapter
u otra clase, resultará en eso.
Enfrentó el mismo problema luego se implementó.
intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
Y consiguió resolver el problema.
Puede haber otro motivo relacionado con el adaptador de vista de lista.
Puedes ver este blog , lo describí muy bien.
Este error se produce cuando startactivity no sabe cuál es su actividad. Por lo que debe agregar actividad antes de startActivity ()
debes establecer
activity.startActivity(yourIntent);
Mi situación fue un poco diferente, estoy probando mi aplicación utilizando Espresso
y tuve que iniciar mi Activity with ActivityTestRule
desde el Context
instrumentación (que no proviene de una Activity
).
fun intent(context: Context) = Intent(context, HomeActivity::class.java)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
Tuve que cambiar las banderas y agregar una or
bitwise ( |
en Java) con Intent.FLAG_ACTIVITY_NEW_TASK
Así resulta en:
fun intent(context: Context) = Intent(context, HomeActivity::class.java)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
Para cualquier persona que obtenga esto en Xamarin.Android (MonoDroid), incluso cuando se llama a StartActivity desde la actividad: este es realmente un error de Xamarin con el nuevo tiempo de ejecución de ART, consulte https://bugzilla.xamarin.com/show_bug.cgi?id=17630
Puedes lograrlo con addFlags lugar de setFlags
myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Según la addFlags que hace:
Agregue indicadores adicionales a la intención (o con el valor de los indicadores existentes).
EDITAR
Tenga en cuenta que si está utilizando indicadores que cambia la pila de historial como dice la respuesta de Alex Volovoy :
... evite establecer marcas ya que interferirá con el flujo normal de eventos y la pila de historial.
Si está invocando el complemento share Intent in Cordova, configurar la bandera no ayudará. En su lugar usa esto
cordova.getActivity().startActivity(Intent.createChooser(shareIntent, "title"));
Si tienes un error debido al uso de crear selector como a continuación:
Intent sharingIntent = new Intent(Intent.ACTION_VIEW);
sharingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
sharingIntent.setData(Uri.parse("http://google.com"));
startActivity(Intent.createChooser(sharingIntent, "Open With"));
Establezca la bandera para crear un selector como este:
Intent sharingIntent = new Intent(Intent.ACTION_VIEW);
sharingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
sharingIntent.setData(Uri.parse("http://google.com"));
Intent chooserIntent = Intent.createChooser(sharingIntent, "Open With");
chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(chooserIntent);
También tuve el mismo problema. Compruebe todo el contexto que ha pasado. Para los '' enlaces '' necesita contexto de actividad, no contexto de aplicación .
Este es el lugar donde debes revisar:
1.) Si usó LayoutInflater , verifique qué contexto ha pasado.
2.) Si está utilizando algún adaptador, verifique qué contexto ha pasado.
Vea, si está creando una intención dentro de un listiner en algún método
override onClick (View v).
luego llama al contexto a través de esta vista también:
v.getContext ()
Ni siquiera necesitará SetFlags ...
Ya sea
- caché el objeto de contexto a través del constructor en su adaptador, o
- Consíguelo desde tu punto de vista.
O como último recurso,
- añada la bandera FLAG_ACTIVITY_NEW_TASK a su intención:
_
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Editar: evitaría establecer indicadores, ya que interferirá con el flujo normal de eventos y la pila de historial.
Yo tuve el mismo problema. El problema es con el contexto. Si desea abrir algún enlace (por ejemplo, compartir cualquier enlace a través del selector) pase el contexto de la actividad, no el contexto de la aplicación.
No olvide agregar myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
si no está en su actividad.
usa este código funciona bien para mi Compartir algo desde fuera de una actividad
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
// Append Text
String Text = "Your Text Here"
intent.putExtra(Intent.EXTRA_TEXT, Text);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Intent shareIntent = Intent.createChooser(intent,"Share . . . ");
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
G.context.getApplicationContext().startActivity(shareIntent);
CustomAdapter mAdapter = new CustomAdapter( getApplicationContext(), yourlist);
o
Context mContext = getAppliactionContext();
CustomAdapter mAdapter = new CustomAdapter( mContext, yourlist);
cambiar a continuación
CustomAdapter mAdapter = new CustomAdapter( this, yourlist);
Intent i= new Intent(context, NextActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
Intent viewIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
viewIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(viewIntent);
Espero que esto funcione.