2010-11-28 27 views
60

J'ai une activité d'affichage de carte qui montre quelques OverlayItems. Dans la méthode onTap d'une superposition, je veux déclencher une nouvelle activité qui affiche cette photo de superposition comme un plein écran, par exemple.Comment puis-je démarrer une activité à partir d'une classe de non-activité?

Quand je le fais dans ma classe de recouvrement:

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

.. il ne peut pas trouver un contexte d'application, comme je ne suis pas dans le cadre d'une activité.

Lorsque j'ajoute une méthode pour mon activité principale, disons startFullscreen:

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

Je ne peux pas appeler getApplicationContext() et startActivity(), parce que je suis dans un contexte statique. J'ai besoin cependant de la méthode statique pour l'appeler dans la classe Overlay comme .

Mettez simplement: Comment puis-je démarrer une activité à partir d'une classe de non-activité?

Répondre

34

Votre onTap override reçoit le MapView à partir de laquelle vous pouvez obtenir le Context:

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

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

    // ... 
} 
+2

Lorsque je tente de démarrer une activité d'une classe non-activité (dans le même processus) Je reçois une exception : "android.util.AndroidRuntimeException: L'appel de startActivity() en dehors d'un contexte d'activité nécessite l'indicateur FLAG_ACTIVITY_NEW_TASK." (Je le fais dans le contexte d'un gestionnaire d'intention.) – Tom

78

Une fois que vous avez obtenu le contexte dans votre onTap(), vous pouvez également faire:

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

Cela fonctionne pour moi quand je tape sur Balloon sur une carte. –

+0

vous avez sauvé ma vie bro! –

8

I Je ne sais pas si c'est une bonne pratique ou non, mais casting a Context object to an Activity object compiles fine.

Essayez est: ((Activity) mContext).startActivity(...)

+2

Incroyablement, cela fonctionne. Et c'est la seule solution ici qui fonctionne pour startActivityForResult(). –

+10

Cela ne fonctionnera que si le contexte * est * une activité. Par exemple. Je ne pense pas que vous puissiez transformer le contexte d'application en activité. – Timmmm

+0

Timmmm a raison, et btw ApplicationContext et BaseContext d'activité étend Android.Content.Context qui est une classe abstraite –

6

Vous pouvez définir un context pour votre application dire ExampleContext qui tiendra le contexte de votre application, puis l'utiliser pour instancier une activité comme celle-ci:

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

S'il vous plaît garder à l'esprit que ce code est écrit en C# car j'utilise MonoDroid, mais je crois qu'il est très similaire à Java. Pour savoir comment créer un look ApplicationContext à ce thread

Voilà comment je fait mon Application Class

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

     } 
     public object MyObject { get; set; } 
    }