Как я могу запустить Activity из класса non-Activity?
У меня есть активность отображения карты, которая показывает несколько OverlayItems
. В методе onTap
оверлея, я хочу вызвать новое действие, которое показывает это оверлейное фото как полноэкранный, например.
Когда я делаю это внутри моего класса оверлея:
Intent intent = new Intent();
intent.setClass(getApplicationContext, FullscreenView.class);
startActivity(intent);
.. он не может найти контекст приложения, так как я не вхожу в сферу действия.
Когда я добавляю метод к моей основной деятельности, скажем startFullscreen
:
public static void startFullscreen() {
if (sCurrentPhoto != null) {
Intent intent = new Intent();
intent.setClass(getApplicationContext(), FullscreenView.class);
startActivity(intent);
}
}
Я не могу назвать getApplicationContext()
и startActivity()
, потому что я в статическом контексте. Однако мне нужен статический метод, чтобы вызвать его в классе Overlay, например MainView.startFullscreen()
.
Проще говоря: Как запустить Activity из класса non-Activity?
Ответы
Ответ 1
Ваш переопределение onTap
получает MapView
, из которого вы можете получить Context
:
@Override
public boolean onTap(GeoPoint p, MapView mapView)
{
// ...
Intent intent = new Intent();
intent.setClass(mapView.getContext(), FullscreenView.class);
startActivity(intent);
// ...
}
Ответ 2
Как только вы получили контекст в своем onTap(), вы также можете:
Intent myIntent = new Intent(mContext, theNewActivity.class);
mContext.startActivity(myIntent);
Ответ 3
Я не знаю, хорошо это или нет, но casting a Context object to an Activity object compiles fine.
Попробуйте следующее: ((Activity) mContext).startActivity(...)
Ответ 4
Вы можете определить context
для вашего приложения, скажем ExampleContext
, который будет содержать контекст вашего приложения, а затем использовать его для создания экземпляра такой активности:
var intent = new Intent(Application.ApplicationContext, typeof(Activity2));
intent.AddFlags(ActivityFlags.NewTask);
Application.ApplicationContext.StartActivity(intent);
Пожалуйста, имейте в виду, что этот код написан в C#
, поскольку я использую MonoDroid, но я считаю, что он очень похож на Java
. Для того, чтобы создать ApplicationContext
, посмотрите на thread
Вот как я сделал свой Application Class
[Application]
public class Application : Android.App.Application, IApplication
{
public Application(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer)
{
}
public object MyObject { get; set; }
}