2017-08-28 4 views
0

J'ai un fragment, qui contient et ArrayList des intentions de notification en attente.Android: getContext() dans Fragment renvoie null uniquement lorsque vous laissez sur le bouton Précédent

Je construis cette liste de rappels dans onPause(), parce que je veux seulement que le message apparaisse lorsque l'application n'est pas exécutée en premier plan. Tout fonctionne bien si je laisse l'application sur le bouton HomeScreen, mais si je laisse sur le bouton Précédent, le compilateur me dit que j'essaie d'appeler getSystemService() sur une référence nulle.

OnPause PRINCIPALES Activitie:

@Override 
protected void onPause() { 
    super.onPause(); 
    tasksFragment.buildReminderList(); 
} 

Voici la méthode du Fragment:

public void buildReminderList() { 

    mReminderList = new ArrayList<>(); 

    if (mTaskList != null) { 

     for (int i = 0; i < mTaskList.size(); i++) { 

      if (mTaskList.get(i).hasReminder() && mTaskList.get(i).getMillisLeftToday() > 0) { 

       AlarmManager alarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE); 
       intent = new Intent(getContext(), AlertReceiver.class); 

       intent.putExtra("title", mTaskList.get(i).getName()); 
       intent.putExtra("ID", i); 

       alarmIntent = PendingIntent.getBroadcast(getContext(), i, intent, 0); 
       Calendar calendar = Calendar.getInstance(); 
       calendar.setTimeInMillis(System.currentTimeMillis()); 
       calendar.set(Calendar.HOUR_OF_DAY, mTaskList.get(i).getReminderHour()); 
       calendar.set(Calendar.MINUTE, mTaskList.get(i).getReminderMinutes()); 

       if (calendar.before(Calendar.getInstance())) { 
        calendar.add(Calendar.DATE, 1); 
       } 

       alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 60 * 24, alarmIntent); 

       mReminderList.add(alarmIntent); 
      } 
     } 
    } 
} 

Répondre

1

Lorsque vous appuyez sur le bouton de retour, le fragment n'est plus attaché à l'activité, de sorte que getContext() retourne NULL.

Vous pouvez vérifier si votre fragment est encore ajouté à l'activité, puis appelez votre getSystemService comme ci-dessous

if (isAdded()) { 
    getContext().getSystemService(Context.ALARM_SERVICE) 
} 
+0

Merci, qui évite le plantage. Mais alors il ne sauvegarde plus la liste de rappel. Une idée de comment je peux résoudre ceci? –

+0

Vous devez utiliser un service pour y parvenir, lire à propos de [récepteurs de diffusion] (https://developer.android.com/reference/android/content/BroadcastReceiver.html) –

+0

Merci. Je suppose que je peux aussi simplement déplacer la méthode buildReminderList entière du fragment dans l'activité principale. –