Wie kann ich eine Aktivität aus einer Nicht-Aktivitätsklasse starten?

74

Ich habe eine Kartenansicht, die einige zeigt OverlayItems. Bei der onTapMethode einer Überlagerung möchte ich eine neue Aktivität auslösen, die dieses Überlagerungsfoto beispielsweise als Vollbild anzeigt.

Wenn ich das in meiner Overlay-Klasse mache:

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

.. es kann keinen Anwendungskontext finden, da ich nicht im Rahmen einer Aktivität bin.

Wenn ich meiner Hauptaktivität eine Methode hinzufüge, sagen wir startFullscreen:

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

Ich kann nicht anrufen getApplicationContext()und startActivity(), weil ich mich in einem statischen Kontext befinde. Ich brauche die statische Methode jedoch, um sie in der Overlay-Klasse wie aufzurufen MainView.startFullscreen().

Einfach ausgedrückt: Wie kann ich eine Aktivität von einer Nicht-Aktivitätsklasse aus starten?

slhck
quelle

Antworten:

41

Ihr onTapOverride erhält das, MapViewvon dem Sie Folgendes erhalten können Context:

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

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

    // ...
}
Daniel Trebbien
quelle
2
Wenn ich versuche, eine Aktivität von einer Nicht-Aktivitätsklasse aus zu starten (im selben Prozess), wird eine Ausnahme angezeigt: "android.util.AndroidRuntimeException: Für den Aufruf von startActivity () außerhalb eines Aktivitätskontexts ist das Flag FLAG_ACTIVITY_NEW_TASK erforderlich." (Ich mache das im Kontext eines Intent Handlers.)
Tom
vor der startActivity hinzufügenintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Leonardo Goes
90

Sobald Sie den Kontext in Ihrem onTap () erhalten haben, können Sie auch Folgendes tun:

Intent myIntent = new Intent(mContext, theNewActivity.class);
mContext.startActivity(myIntent);
Exil
quelle
1
Du hast mein Leben gerettet, Bruder!
Kentgi Tomo
13

Ich weiß nicht, ob dies eine gute Praxis ist oder nicht, aber casting a Context object to an Activity object compiles fine.

Versuche dies: ((Activity) mContext).startActivity(...)

Ein Noob-Student
quelle
2
Unglaublich, das funktioniert. Und es ist die einzige Lösung, die für startActivityForResult () funktioniert.
SMBiggs
10
Das wird nur funktionieren , wenn der Kontext tatsächlich ist eine Tätigkeit. Ich glaube beispielsweise nicht, dass Sie den Anwendungskontext in eine Aktivität umwandeln können.
Timmmm
Timmmm ist richtig, und sowohl ApplicationContext als auch Activity BaseContext erweitern Android.Content.Context, eine abstrakte Klasse
Hat AlTaiar
9

Sie können contextfür Ihre Anwendung ein Sprichwort definieren , ExampleContextdas den Kontext Ihrer Anwendung enthält, und es dann verwenden, um eine Aktivität wie diese zu instanziieren:

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

Bitte denken Sie daran, dass dieser Code geschrieben ist, C#wenn ich MonoDroid verwende, aber ich glaube, dass er sehr ähnlich ist Java. So erstellen Sie einen ApplicationContextBlick auf diesen Thread

So habe ich meine gemacht Application Class

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

        }
        public object MyObject { get; set; }
    }
Hat AlTaiar
quelle