2010-11-28 13 views
60

Tengo una actividad de vista de mapa que muestra unos OverlayItems. En el método onTap de una superposición, deseo activar una nueva actividad que muestre esta foto superpuesta como una pantalla completa, por ejemplo.¿Cómo puedo iniciar una actividad de una clase que no es de actividad?

Cuando hago esto en mi clase de superposición:

Intent intent = new Intent(); 
intent.setClass(getApplicationContext, FullscreenView.class); 
startActivity(intent); 

.. no puede encontrar un contexto de aplicación, ya que no estoy en el ámbito de una actividad.

Cuando agrego un método para mi actividad principal, digamos startFullscreen:

public static void startFullscreen() { 
    if (sCurrentPhoto != null) { 
     Intent intent = new Intent(); 
     intent.setClass(getApplicationContext(), FullscreenView.class); 
     startActivity(intent);   
    } 
} 

No puedo llamar getApplicationContext() y startActivity(), porque estoy en un contexto estático. Sin embargo, necesito el método estático para llamarlo a la clase Superposición como MainView.startFullscreen().

En palabras simples: ¿Cómo puedo iniciar una actividad de una clase que no es de actividad?

Respuesta

34

Su anulación onTap recibe la MapView desde donde se puede obtener el Context:

@Override 
public boolean onTap(GeoPoint p, MapView mapView) 
{ 
    // ... 

    Intent intent = new Intent(); 
    intent.setClass(mapView.getContext(), FullscreenView.class); 
    startActivity(intent); 

    // ... 
} 
+2

Cuando intento iniciar una actividad de una clase no actividad (en el mismo proceso) consigo una excepción : "android.util.AndroidRuntimeException: la llamada a startActivity() desde fuera del contexto de una actividad requiere el indicador FLAG_ACTIVITY_NEW_TASK". (Estoy haciendo esto en el contexto de un manejador de intenciones). – Tom

78

Una vez que haya obtenido el contexto en el Ontap() también se puede hacer:

Intent myIntent = new Intent(mContext, theNewActivity.class); 
mContext.startActivity(myIntent); 
+0

Funciona para mí cuando toco Globo sobre un mapa. –

+0

¡has salvado a mi hermano de la vida! –

8

I no sé si esto es una buena práctica o no, pero casting a Context object to an Activity object compiles fine.

Pruebe th es decir: ((Activity) mContext).startActivity(...)

+2

Increíblemente, esto funciona. Y es la única solución aquí que funciona para startActivityForResult(). –

+10

Esto solo va a funcionar si el contexto realmente * es * una actividad. P.ej. No creo que puedas convertir el contexto de la aplicación en una actividad. – Timmmm

+0

Timmmm tiene razón, y tanto ApplicationContext como BaseContext de Activity extienden Android.Content.Context que es una clase abstracta –

6

Se puede definir una context para su aplicación decir ExampleContext que llevará a cabo el contexto de su aplicación y luego usarla para crear instancias de una actividad como esta:

var intent = new Intent(Application.ApplicationContext, typeof(Activity2)); 
intent.AddFlags(ActivityFlags.NewTask); 
Application.ApplicationContext.StartActivity(intent); 

Por favor tener en cuenta que este código está escrito en C# ya que uso MonoDroid, pero creo que es muy similar al Java. Para saber cómo crear un aspecto ApplicationContext en este thread

Ésta es la forma en que hice mi Application Class

[Application] 
    public class Application : Android.App.Application, IApplication 
    { 
     public Application(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer) 
     { 

     } 
     public object MyObject { get; set; } 
    } 
Cuestiones relacionadas