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传递的意图标题(以下switch语句)。我猜这是因为其目的不通过,因为他们获得这一类从通知而不是从MyWorkout.java,因此字符串标题为空。我的问题是我不知道如何解决这个问题。通知工作正常,如果我把它发送到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

addPages方法中的第45行,那里的东西是null。 – 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");