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");