2010-10-12 17 views
225

Implementé ListView en mi aplicación Android. Me uno a este ListView usando una subclase personalizada de la clase ArrayAdapter. Dentro del método ArrayAdapter.getView(...) reemplazado, asigno un OnClickListener. En el método onClick del OnClickListener, deseo iniciar una nueva actividad. Me da la excepción:Llamar a startActivity() desde fuera del contexto de una actividad

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 el ListView (la corriente Activity) está trabajando bajo?

+1

Creo que la respuesta de Alex debe ser el 'aceptado' solución a su problema, ya que rectifica el error que mencionó de una manera más genérica –

+3

Me encanta "¿Es esto realmente lo que quiere?" ... He recibido un mensaje antes que decía "¿Estás seguro de que no olvidaste anular el registro de un receptor de transmisión en algún lado?" ¡INCREÍBLE! Felicitaciones a quien puso todos estos pequeños mensajes para ayudarnos a pichones. –

Respuesta

415

de cualquier

  • caché el objeto de contexto a través del constructor en su adaptador, o
  • obtienen de su punto de vista.

O, como último recurso,

  • add - Bandera FLAG_ACTIVITY_NEW_TASK a su intención:

_

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

Editar - evitaría el establecimiento de banderas como lo hará interferir con el flujo normal del evento y la pila de historial.

+5

¿Qué pasa con la característica _autoLink_ de TextView donde no puedo controlar la intención (y por lo tanto las banderas) creadas por el sistema? –

+36

Obtenía esta excepción cuando estaba haciendo algo como esto 'context.startActivity (intent);' Acabo de cambiar 'context' de' ApplicationContext' a 'Activity' type. Esto solucionó el problema. – Sufian

+0

@AlexSemeniuk alguna vez encuentra una solución? –

13

Creo que tal vez va a implementar la OnClickListener en el lugar equivocado - por lo general que sin duda debe implementar un OnItemClickListener en su actividad y la puso en el ListView en su lugar, o se obtendrá problemas con sus eventos ...

+2

Usted me lleva a la solución. Necesitaba usar un OnItemClickListener, asignado a ListView. Aquí hay algunos enlaces para cualquier persona: http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html http://www.androidpeople.com/android-custom-listview-tutorial-example -part-2/ Gracias por la ayuda. – Sako73

+0

Por favor brinde respuestas genéricas. La respuesta de Alex Volovoy a continuación resuelve el problema de forma genérica. –

+0

Para la posteridad: si lo define directamente como setListener (new Listener) en un componente requiere un contexto, crea una referencia implícita a la actividad completa que perderá memoria como no lo haría. Esto se puede eludir haciendo un oyente de clase interna estática o moviendo al oyente a una clase separada si necesita poder manejar entradas de más de un origen. –

70

Lo resuelto con "addFlags" en lugar de "setFlags"

myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

De acuerdo con la documentation que hace:

agregar indicadores adicionales a la intención (o con el valor de indicadores existentes)

EDITAR

Tenga en cuenta si está utilizando banderas que cambiar la pila de la historia como Alex Volovoy's answer dice:

... evitar el establecimiento de las banderas, ya que interfiere con el flujo normal de evento y pila de historia.

+1

Tengo un problema muy similar. ¿Has tenido algún problema con el historial o con cualquier otra cosa como sugieren las respuestas anteriores? –

+0

No estoy exactamente seguro de lo que está buscando, pero puede iniciar una actividad sin un historial como ese: Intent intennt = new Intent (Intent.ACTION_VIEW, "http: \\ www.google.com")); intent.addFlags (Intent.FLAG_ACTIVITY_NO_HISTORY); \t \t \t \t \t startActivity (intent); –

+0

Gracias. Estaba haciendo exactamente lo mismo. –

5
CustomAdapter mAdapter = new CustomAdapter(getApplicationContext(), yourlist); 

o

Context mContext = getAppliactionContext(); 

CustomAdapter mAdapter = new CustomAdapter(mContext, yourlist); 

cambio a continuación

CustomAdapter mAdapter = new CustomAdapter(this, yourlist); 
3

En mi opinión, es mejor usar el método de startActivity() solo en el código del Activity.class. Si usa eso en el Adapter u otra clase, resultará en eso.

8

Además: si mostrar enlaces en vista de lista en fragmento, no cree que como esto

adapter = new ListAdapter(getActivity().getApplicationContext(),mStrings); 

lugar llamar

adapter = new ListAdapter(getActivity(),mStrings); 

adaptador funciona bien en ambos casos, pero los vínculos de trabajo solo en el último.

+0

@ user2676468: esto resolvió el problema de autolink para mí. –

3

Este error se produce cuando la actividad no sabe cuál es su actividad. Lo que debe agregar actividad antes startActivity()

debe establecer

activity.startActivity(yourIntent); 
2

respuesta de Elaboración Alex Volovoy un poco más -

en caso de que u está recibiendo este problema con fragmentos, getActivity() funciona bien para obtener el contexto

En otros casos:

Si no desea usar-

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//not recommend 

luego hacer 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 cuando cada vez que realice una nueva OutsideClass llaman el método anterior inmediatamente después de definir la OutsideClass dando contexto de la actividad como argumento también en su actividad crea un 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 volver a su OutsideClass, y para iniciar una nueva actividad hacer 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 usted será capaz de iniciar diferentes actividades llamadas desde diferentes OutsideClass sin desordenar con banderas.

Nota: intente no almacenar en caché el objeto de contexto mediante el 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.

recuerde llamar

OutsideClass.gettingContext(Context context); 

en la función onResume() también.

2

También tuve el mismo problema. Verifica todo el contexto que has pasado. Para 'enlaces' necesita Contexto de la actividad no Contexto de la aplicación.

Estos son el lugar donde se debe verificar:

1.) Si utilizó LayoutInflater continuación, comprobar qué contexto que haya pasado.

2.) Si está utilizando cualquier adaptador compruebe el contexto que ha pasado.

2
Intent viewIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);  
viewIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
startActivity(viewIntent); 

espero que esto funcione.

2

Tuve el mismo problema. El problema es con el contexto. Si desea abrir cualquier 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.

4

Véase, si está creando una intención dentro de un listiner en algún método

override onClick (View v). 

continuación, llamar al contexto a través de este punto de vista también:

v.getContext() 

hay ni siquiera tendrá SetFlags .. .

32

En lugar de utilizar (getApplicationContext) uso YourActivity.this

+0

Para mí esta es la mejor solución – Kostya

+0

¡Funcionó como un amuleto! – VSG24

+0

eres el hombre! –

0
Intent i= new Intent(context, NextActivity.class); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
14

Si usted ha obtenido 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")); 

establecer el indicador para crear selector de la siguiente manera:

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); 
+0

Solución perfecta – Beraki

1

se enfrentó al mismo problema, entonces implementado
intención .addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
y se resolvió el problema.

Puede haber otro motivo relacionado con el adaptador de vista de lista.
puede ver This blog, lo describió muy bien.

+0

blog útil, Gracias. :) –

0

utilice este código.funciona bien para mí; compartir algo del exterior 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); 
+0

Configuración de banderas desordenar la historia de stacktrace – Ezio

0

Si está invocando cuota de Intención en Córdoba plugin, estableciendo el indicador no ayudará. En su lugar utilice este -

cordova.getActivity().startActivity(Intent.createChooser(shareIntent, "title")); 
0

Mi situación era un poco diferente, estoy probando mi aplicación con la Espresso y tuve que lanzar mi actividad con ActivityTestRule de la instrumentación Context (que no es la que proviene de un Activity) .

fun intent(context: Context) = Intent(context, HomeActivity::class.java) 
      .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) 

que tenía que cambiar las banderas y añadir un or bit a bit (| en Java) con Intent.FLAG_ACTIVITY_NEW_TASK

Por lo que se traduce en:

fun intent(context: Context) = Intent(context, HomeActivity::class.java) 
      .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) 
Cuestiones relacionadas