2016-06-14 3 views
0

私はすでにしばらくの間苦労している問題があります。 FragmentクラスTimePickerFragmentを作成しました。これはDialogFragmentを拡張し、MainActivityで呼び出されてダイアログを表示します。 TimePickerが表示されたら、ユーザー入力を待つ必要があります。それ以外の場合は、コードを直接実行した後、IntentServiceを開始します。 enteredTimeがヌルなので、これはNullReferenceExceptionになります。 Btw、私はbutton.PerformClick()に電話しています。ユーザーが通知をクリックした後に直接TimePickerを表示したいからです。TimePickerDialogを入力待ちにする。実行後のコードはNullReferenceExceptionになります

私はAndroidにはかなり新しく、Javaでまともな知識しか持っていません。単純に分からないので、私が完全に欠けているものがあるかもしれません。ありがとう!

MainActivityは、このように設定されています

public void onCreate(Bundle savedInstanceState) {  

if (btnShowTimePickerDialog != null) { 
      btnShowTimePickerDialog.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        showTimePickerDialog(v); 
       } 
      }); 
     } 
final ResultReceiver verifyTokenReceiver = new ResultReceiver(new Handler()) { 
      @Override 
     protected void onReceiveResult(int resultCode, Bundle resultData) { 
       if (resultData == null) { 
        return; 
       } 

      if (resultCode == Keys.SUCCESS_CODE) { 
        //TODO: GET VALUES FROM TIMEPICKER 
       if (previousActivity.equals(Keys.MAINSERVICE_CODE)){ 

        btnShowTimePickerDialog.performClick(); 


        final Intent createSessionIntent = new Intent(MainActivity.this, CreateSessionService.class); 
        createSessionIntent.putExtra(Keys.RECEIVER_KEY, createSessionReceiver); 
        createSessionIntent.putExtra(Keys.TOKEN_KEY, token); 
        createSessionIntent.putExtra(Keys.PREFERENCE_KEY, preference); 
        createSessionIntent.putExtra(Keys.ACTIVITY_KEY, previousActivity); 
        createSessionIntent.putExtra(Keys.TIME_KEY, enteredTime);//insert time 
startService(createSessionIntent); 
} 

public void showTimePickerDialog(View v) { 
    FragmentManager mFragmentManager = getSupportFragmentManager(); 
    TimePickerFragment tpf = new TimePickerFragment(); 
    tpf.show(mFragmentManager, "TimePickerDialog"); 

}

TimePickerDialogがフラグメントで作成されました:

public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener { 
TimePickerDialog.OnTimeSetListener mCallback; 
public TimePickerFragment() { super(); } 

public Dialog onCreateDialog(Bundle savedInstanceState) { 
    // Use the current time as the default values for the picker 

    final Calendar c = Calendar.getInstance(); 
    int hour = c.get(Calendar.HOUR_OF_DAY); 
    int minute = c.get(Calendar.MINUTE); 

    // Create a new instance of TimePickerDialog and return it 
    return new TimePickerDialog(getActivity(), this, hour, minute, DateFormat.is24HourFormat(getActivity())); 
} 


@Override 
public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
    ((MainActivity)getActivity()).SomeRandomMethodToGetTheEnteredTime(hourOfDay, minute); 
} 


@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 

    // This makes sure that the container activity has implemented 
    // the callback interface. If not, it throws an exception 
    try { 
     mCallback = (TimePickerDialog.OnTimeSetListener) activity; 
    } catch (Exception e) { 
     throw new ClassCastException(activity.toString() + " must implement TimePickerDialog.OnTimeSetListener"); 
    } 
} 

@Override 
public void show(FragmentManager manager, String tag) { 
    super.show(manager, tag); 
} 

}

+0

のonCreateで今
 Bundle bundle = new Bundle(); bundle.putBoolean("NOTIF", true); resultIntent.putExtra("DATA", bundle); 

データだけをチェック:通知内のデータをバンドルに

は、その質問に関係する。 NullReferenceExceptionは、TimePickerDialogがユーザーの入力を待機しないために発生します。そのため、TimePickerの期待値がnullであり、例外が発生します。 Questionは、TimePickerを入力待ちにする方法です。 –

答えて

0

最善のアプローチは次のようになりますいくつかのデータを通知に組み込み、activのonCreateに通知データが存在する場合はデータをチェックし、時間ピッカーを直接開きます。私は重複がないと思う

if(resultIntent.hasExtra("DATA")){ 
     Bundle notifBundle = getIntent().getBundleExtra("DATA"); 
     if(notifBundle.getBoolean("NOTIF")) 
      //show your time picker 

それはあなたを助けることを願っています:)

+0

ご意見ありがとうございます。おそらく、私が描いた流れは100%明確ではなかったでしょう。この通知は、使用された直後にTimePickerDialogを開きます。また、後に続くコードも実行され、ユーザーの入力が必要です。 TimePickerが表示され、その背後にあるコードはnull値で実行されますが、動作は同じです。 だから、何とかTimePickerはユーザーの入力を待つ必要があります。 –

関連する問題