Как я могу начать занятие из класса, не являющегося занятием? - PullRequest
67 голосов
/ 28 ноября 2010

У меня есть вид деятельности карты, который показывает несколько 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 из класса, не являющегося Activity?

Ответы [ 4 ]

85 голосов
/ 17 апреля 2011

Как только вы получили контекст в вашем onTap (), вы также можете сделать:

Intent myIntent = new Intent(mContext, theNewActivity.class);
mContext.startActivity(myIntent);
37 голосов
/ 28 ноября 2010

Ваше onTap переопределение получает MapView, из которого вы можете получить Context:

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

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

    // ...
}
11 голосов
/ 29 декабря 2011

Я не знаю, хорошая ли это практика или нет, но casting a Context object to an Activity object compiles fine.

Попробуйте это: ((Activity) mContext).startActivity(...)

9 голосов
/ 14 июня 2013

Вы можете определить context для вашего приложения, скажем ExampleContext, который будет содержать контекст вашего приложения, а затем использовать его для создания экземпляра действия, подобного этому:

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

Пожалуйста, имейте в виду, чтоэтот код написан на C#, поскольку я использую MonoDroid, но я считаю, что он очень похож на Java.Чтобы узнать, как создать ApplicationContext, посмотрите на эту нить

Вот как я сделал свой Application Class

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

        }
        public object MyObject { get; set; }
    }
.
...