Ошибка контекста Android toast.makeText

У меня возникли проблемы с вызовом toast.Maketext внутри прослушивателя местоположения. Контекст недоступен, что я делаю не так?

private LocationListener ll = new LocationListener() {

    public void onLocationChanged(Location l) {
        // SMSReceiver.l = l;
        String s = "";
        s += "\tTime: " + l.getTime() + "\n";
        s += "\tLatitude:  " + l.getLatitude() + "°\n";
        s += "\tLongitude: " + l.getLongitude() + "°\n";
        s += "\tAccuracy:  " + l.getAccuracy() + " metres\n";
        s += "\tAltitude:  " + l.getAltitude() + " metres\n";
        s += "\tSpeed:  " + l.getSpeed() + " metres\n";

        // TODO Auto-generated method stub
        if (l.hasSpeed()) {
            mySpeed = l.getSpeed();
        }

        Log.i(DEBUG_TAG, "On Location Changed: (" + s + ")");
ERROR HERE-->       Toast.makeText(context, s, Toast.LENGTH_SHORT).show();
    }

    public void onProviderDisabled(String arg0) {
        // TODO Auto-generated method stub

    }

    public void onProviderEnabled(String arg0) {
        // TODO Auto-generated method stub

    }

    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
        // TODO Auto-generated method stub

    }

};

person ProNeticas    schedule 03.05.2011    source источник
comment
Попробуйте этот Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();   -  person Kartik Domadiya    schedule 03.05.2011
comment
Я попробовал это и получил следующее: Метод getApplicationContext() не определен для типа new LocationListener(){}   -  person ProNeticas    schedule 03.05.2011
comment
Я должен отметить, что это в BroadcastReceiver, а не в Activity   -  person ProNeticas    schedule 03.05.2011
comment
передайте экземпляр вашей активности и выполните следующее: myactivity.getApplicationContext()   -  person Ganapathy C    schedule 03.05.2011


Ответы (3)


Если это объявление LocationListener находится внутри класса активности (скажем: MyActivity), вы должны создать Toast как:

Toast.makeText(MyActivity.this, s, Toast.LENGTH_SHORT).show();

Если LocationListener объявлен в бесконтекстном классе, как в вашем случае BroadcastReceiver, вы можете передать контекст его конструктору:

private final class MyReceiver extends BroadcastReceiver
{
    private MyLocationListener listener; 
    public MyReceiver(final Context context)
    {
        this.listener = new MyLocationListener(context);
    }

    private final class MyLocationListener implements LocationListener
    {
        private Context context;
        public MyLocationListener(final Context context)
        {
            this.context = context; 
        }

        @Override
        public void onLocationChanged(Location location)
        {
            // ...
            Toast.makeText(context, "Toast message here", Toast.LENGTH_SHORT).show();
        }

        // implement the rest of the methods
    }

    @Override
    public void onReceive(Context context, Intent intent)
    {
        // Note that you have a context here, which you can use when receiving an broadcast message
    }
}
person rekaszeru    schedule 03.05.2011
comment
Почему этот ответ получил одобрение, LocationListener в BroadcastReceiver, а не в Activity - person Rikudo Pain; 26.08.2015
comment
@RikudoPain, пожалуйста, изложите свою озабоченность, так как это неясно. Что заставляет вас думать, что анонимный экземпляр LocationListener не объявлен внутри контекстного компонента (что является распространенным выбором дизайна)? - person rekaszeru; 26.08.2015
comment
Пожалуйста, прочитайте его комментарий. Я должен отметить, что это в BroadcastReceiver, а не в Activity, возможно, он забыл отредактировать вопрос. Так как у меня такая же проблема с ним - person Rikudo Pain; 26.08.2015
comment
Без полного кода трудно предугадать, как оператор структурировал поток, но если оба BroadcastReceiver (или LocationListener) находятся в отдельном классе, и вы действительно хотите выполнять из него операции с графическим интерфейсом, вам нужно передать контекст в его конструктор для этого. Я обновлю свой ответ быстрым образцом. - person rekaszeru; 27.08.2015
comment
Правильно, и нужны некоторые изменения в объявлении переменных в Activity. - person Rikudo Pain; 27.08.2015

Убедитесь, что вы используете контекст класса Activity. Если вы используете это всплывающее уведомление в Activity, напишите Classname.this вместо контекста.

person Jaydeep Khamar    schedule 03.05.2011

Поскольку контекст недоступен, вы можете передать его в конструкторе

person vishesh    schedule 27.03.2012