0

У меня возникли проблемы с уведомлениями, исходящими из/отправки фрагментам. Я попытаюсь объяснить свой сценарий как можно более ясный, чтобы показать, что нужно выпустить.Android Ошибка при отправке фрагментам из уведомления

У меня есть активность, MyWorkout.java, это действие имеет расширяемый вид списка. Все элементы в развернутом виде списка отправляют пользователя во вторую активность, WorkoutDaysActivity. Все они посылают отдельно дополнительные намерения, поэтому я знаю, какой элемент пользователь нажал. В WorkoutDaysActivity.java создаются 3 фрагмента, понедельник, среда и пятница. У меня есть отдельные классы для каждого вида деятельности. Эти классы имеют вид ресайзера и таймер. У меня есть это, когда таймер заканчивается, пользователь получает уведомление. Это работает, но когда я пытаюсь отправить пользователя в WorkoutDaysActivity из уведомления, он сбой при ошибке ниже.

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.hashCode()' on a null object reference 
                       at com.bestworkouts.sheikoworkout.WorkoutDaysActivity.addPages(WorkoutDaysActivity.java:45) 
                       at com.bestworkouts.sheikoworkout.WorkoutDaysActivity.onCreate(WorkoutDaysActivity.java:29) 

Линия, он посылает меня тоже где он пытается установить заголовок (переключатель заявление ниже) на основе намерения передается от MyWorkout.java. Я предполагаю, что это связано с тем, что намерение не передается по мере поступления в этот класс из уведомления, а не из MyWorkout.java, поэтому заголовок строки имеет значение null. Моя проблема: я понятия не имею, как это исправить. Уведомление отлично работает, если я отправлю его в MyWorkout.java, но я бы предпочел отправить его обратно туда, где установлен таймер.

public class WorkoutDaysActivity extends BaseActivity{ 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.workout_days); 
    mToolBar = activateToolbar(); 
    setUpNavigationDrawer(); 



    ViewPager vp = (ViewPager) findViewById(R.id.view_pager); 
    this.addPages(vp); 

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
    tabLayout.setupWithViewPager(vp); 
    tabLayout.setOnTabSelectedListener(listener(vp)); 
} 

//ADD ALL PAGES 
private void addPages(ViewPager pager) { 
    MyFragPagerAdapter adapter = new MyFragPagerAdapter(getSupportFragmentManager()); 
    Intent intent = getIntent(); 
    String workout = intent.getStringExtra("workout"); 
    Bundle args = new Bundle(); 
    args.putString("workout", workout); 
    String title = args.getString("workout"); 
    switch(title) { 
     case "w29w1" : { 
      getSupportActionBar().setTitle("Workout 29 Week 1"); 
      break; 
     } 
     case "w29w2" : { 
      getSupportActionBar().setTitle("Workout 29 Week 2"); 
      break; 
     } 
MondayFragment mondayFragment = new MondayFragment(); 
    mondayFragment.setArguments(args); 
    adapter.addPage(mondayFragment); 
    WedFragment wedFragment = new WedFragment(); 
    wedFragment.setArguments(args); 
    adapter.addPage(wedFragment); 
    FridayFragment fridayFragment = new FridayFragment(); 
    fridayFragment.setArguments(args); 
    adapter.addPage(fridayFragment); 
    pager.setAdapter(adapter); 
} 

Это где таймер (MondayFragment.java):

private Button btnStart; 
private Button btnStop; 
private Button btnReset; 
private CountDownTimer mCountDownTimer; 
private TextView txtViewRest; 

private void start() { 
    mCountDownTimer = new CountDownTimer(5000, 1000) { 
     @Override 
     public void onTick(long millisUntilFinished) { 
      txtViewRest.setText("Rest Remaining: " + millisUntilFinished/1000 + " seconds."); 
     } 

     @Override 
     public void onFinish() { 
      txtViewRest.setText("Done!"); 
      showNotification(); 
     } 
    }.start(); 
} 
public void cancel() { 
    if (mCountDownTimer != null) { 
     mCountDownTimer.cancel(); 
     txtViewRest.setText("Rest Remaining: 5 seconds"); 
    } else return; 
} 
public void reset() { 
    if (mCountDownTimer != null) { 
     mCountDownTimer.cancel(); 
     txtViewRest.setText("Rest Remaining: 5 Seconds"); 
    } else return; 
} 

    public void showNotification() { 
    NotificationCompat.Builder builder = new NotificationCompat.Builder(getContext()); 
    builder.setSmallIcon(R.drawable.sheikoicon); 
    builder.setContentTitle("Sheiko Rest Timer"); 
    builder.setContentText("Rest timer is up, start your set!"); 
    builder.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_VIBRATE); 
    builder.setAutoCancel(true); 
    Intent intent = new Intent(getActivity(), WorkoutDaysActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(getContext()); 
    stackBuilder.addParentStack(WorkoutDaysActivity.class); 
    stackBuilder.addNextIntent(intent); 
    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_NO_CREATE); 
    builder.setContentIntent(pendingIntent); 
    NotificationManager NM = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE); 
    NM.notify(0, builder.build()); 
} 

    @Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    SharedPreferences pref = this.getActivity().getSharedPreferences("MyPref", 0); 
    View view = inflater.inflate(R.layout.monday_fragment, null); 

    txtViewRest = (TextView) view.findViewById(R.id.txtViewRest); 
    btnStart = (Button) view.findViewById(R.id.btnStart); 
    btnStop = (Button) view.findViewById(R.id.btnStop); 
    btnReset = (Button) view.findViewById(R.id.btnReset); 

    btnStart.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      start(); 
     } 
    }); 
    btnStop.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      cancel(); 
     } 
    }); 
    btnReset.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      reset(); 
     } 
    }); 

Любые и вся помощь очень ценится!

+0

Строка 45 в методе addPages, там что-то нет. – AndroidRuntimeException

+0

Да, я думаю, что это потому, что предполагается, что у вас есть намерение от предыдущего класса. Есть ли способ сохранить состояние фрагмента или что-то еще? Так что, если я отправлю его в свой фрагмент, будет такое же состояние, как и до того, как я получил уведомление? – LBJ33

+0

уверен, отметьте это сообщение http://stackoverflow.com/questions/22505327/android-save-restore-fragment-state – AndroidRuntimeException

ответ

0

Мне удалось решить проблему, я отправлю решение здесь, если у кого-то будет такая же проблема в будущем.

На самом деле это было очень простое исправление, все, что мне нужно было сделать, это добавить дополнительное намерение в код уведомления.

Так из MyWorkout.java я имел это намерение переданную WorkoutDaysActivity:

Intent intent = new Intent(getApplicationContext(), WorkoutDaysActivity.class); 
        intent.putExtra("workout", "w29w1"); 
        startActivity(intent); 

В дни тренировок деятельности, у меня было это намерение, и передал его в качестве аргумента для всех трех фрагментов, как так:

Intent intent = getIntent(); 
    String workout = intent.getStringExtra("workout"); 
    Bundle args = new Bundle(); 
    args.putString("workout", workout); 

    MondayFragment mondayFragment = new MondayFragment(); 
    mondayFragment.setArguments(args); 
    adapter.addPage(mondayFragment); 
    WedFragment wedFragment = new WedFragment(); 
    wedFragment.setArguments(args); 
    adapter.addPage(wedFragment); 

, а затем в каждом фрагменте, где я сделал уведомление мне пришлось добавить intent.putExtra

public void showNotification() { 
    NotificationCompat.Builder builder = new NotificationCompat.Builder(getContext()); 
    builder.setSmallIcon(R.drawable.sheikoicon); 
    builder.setContentTitle("Rest Timer"); 
    builder.setContentText("Rest timer is up, start your set!"); 
    builder.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_VIBRATE); 
    builder.setAutoCancel(true); 
    Intent intent = new Intent(getActivity(), WorkoutDaysActivity.class); 
    intent.putExtra("workout", workout3); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(getContext()); 
    stackBuilder.addParentStack(WorkoutDaysActivity.class); 
    stackBuilder.addNextIntent(intent); 
    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
    builder.setContentIntent(pendingIntent); 
    NotificationManager NM = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE); 
    NM.notify(0, builder.build()); 
} 

Где workout3 является:

args = getArguments(); 
    workout3 = args.getString("workout"); 
Смежные вопросы