2

Когда будильник в Android отключен, я хочу создать AlertDialog. Кроме того, я хочу создать уведомление, в зависимости от того, какой параметр пользователь нажимает на переключатели в диалоговом окне. Проблема возникает, когда я пытаюсь использовать context или getApplicationContext().Использование контекста внутри класса, расширяющего BroadcastReceiver

Это мой код:

public void onReceive(final Context context, Intent intent) 
{ 
    final CharSequence[] items = {" I'm taking the dose now! "," Remind again in ten minutes. "," Ignore for now. "}; 
    String doseName = intent.getStringExtra("doseName"); 
    Toast.makeText(context, "Take medicine: " + doseName, Toast.LENGTH_LONG).show(); 

    AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    builder.setTitle("It's time for your medicine."); 
    builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int item) { 
      switch(item) 
      { 
      case 0: 
       Toast.makeText(context, "Good.", Toast.LENGTH_SHORT).show(); 
       break; 
      case 1: 
       Toast.makeText(context, "Reminder set in ten minutes.", Toast.LENGTH_SHORT).show(); 
       break; 
      case 2: 
       Intent service1 = new Intent(context, DoseAlarmService.class); 
       service1.putExtra("doseName", doseName); 
       context.startService(service1); 
       break; 
      } 
     } 
    }); 
    levelDialog = builder.create(); 
    levelDialog.show(); 
} 

Я попытался с помощью getApplicationContext вместо context внутри корпуса выключателя, но это точная ошибка я получаю:

The method getApplicationContext() is undefined for the type new DialogInterface.OnClickListener(){} 

Любые предложения о том, идти вперед?

EDIT:

До сих пор, это то, что я пробовал:

public void onReceive(final Context context, Intent intent) 
{ 
     ctx = context; 
    final CharSequence[] items = {" I'm taking the dose now! "," Remind again in ten minutes. "," Ignore for now. "}; 
    String doseName = intent.getStringExtra("doseName"); 
    Toast.makeText(ctx, "Take medicine: " + doseName, Toast.LENGTH_LONG).show(); 

    AlertDialog.Builder builder = new AlertDialog.Builder(ctx.getApplicationContext()); 
    builder.setTitle("It's time for your medicine."); 
    builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int item) { 
      switch(item) 
      { 
      case 0: 
       Toast.makeText(ctx, "Good.", Toast.LENGTH_SHORT).show(); 
       break; 
      case 1: 
       Toast.makeText(ctx, "Reminder set in ten minutes.", Toast.LENGTH_SHORT).show(); 
       break; 
      case 2: 
       Intent service1 = new Intent(ctx.getApplicationContext(), DoseAlarmService.class); 
       service1.putExtra("doseName", doseName); 
       ctx.startService(service1); 
       break; 
      } 
     } 
    }); 
    levelDialog = builder.create(); 
    levelDialog.show(); 
} 

Кроме того, вместо того, чтобы использовать ctx, i'v непосредственно использовали context.getApplicationContext() и проверил. Это не работает.

Кроме того, когда я закомментируйте все проблемные области и просто запустить, чтобы убедиться, что диалоговое окно появляется, я получаю это исключение:

07-23 13:26:21.316: E/AndroidRuntime(1756): java.lang.RuntimeException: Unable to start receiver com.dosemanager.ui.DoseAlarmReceiever: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 

Пожалуйста, помогите!

+1

вы можете использовать context.getApplicationContext(). –

+0

Теперь это еще одна проблема. Вы не можете показывать диалог без активности. Создайте новую активность и покажите диалог. –

+0

попытайтесь использовать 'Activity cxt = (Activity) context;' и использовать cxt как ваш контекст –

ответ

3

Хм, у вас уже есть свой контекст - это параметр onReceive(). Вам не нужно использовать getApplicationContext().

EDIT: вы не можете использовать контекст в корпусе коммутатора, потому что контекст определен в классе Receiver, и вы пытаетесь использовать его в классе onClickListener. я предлагаю это:

public class %YOUR_RECEIVER_CLASS% { 
     private Context context; 
     public onReceive(Context context, ...) { 
      this.context = context; 
     } 
    } 

Теперь вы можете использовать контекст везде

+0

Пробовал ... он не работает. –

+0

он может использовать контекст в onClickListener, потому что его contex является «final» –

+0

LOL no. Это окончательно или нет, но это только параметр метода, но не член класса. –

0

использование getBaseContext() вместо getApplicationContext()

пример BroadcastReceiver ::

@Override 
    public void onCreate() 
    {   
     Toast.makeText(this, "SmsSenderService()", Toast.LENGTH_LONG).show(); 

     sendBroadcastReceiver = new BroadcastReceiver() 
     { 
       public void onReceive(Context arg0, Intent intent) 
       { 
       switch (getResultCode()) 
       { 
        case Activity.RESULT_OK:     

        Toast.makeText(getBaseContext(), "SMS Sent", Toast.LENGTH_SHORT).show();   

        break; 

       } 
      } 
     }; 
+0

Я просто пробовал ... не работал. –

+0

О, боже мой, вы пытаетесь запустить метод getBaseContext в ONCLICKLISTENER. OnClickListener НЕ ИМЕЕТ ТАКОГО МЕТОДА. ВАМ НУЖНО использовать контекст для вашего onClickListener ИЛИ сделать контекст поле в вашем приемнике, как я СКАЗАЛ. Сколько раз мне нужно повторять это? Не слушайте, кто предлагает использовать getContext или getBaseContext или что-то еще, потому что они знают nothin –

Смежные вопросы