2016-06-14 3 views
0

У меня проблема, которую я уже много время борется. Я создал класс Fragment, TimePickerFragment, который расширяет DialogFragment, который вызывается в MainActivity, чтобы показать Диалог. После того, как отображается TimePicker, он должен ждать ввода пользователя, иначе код после него будет запущен напрямую, начиная с IntentService. Затем это приведет к NullReferenceException, потому что enteredTime имеет значение NULL. Кстати, я звоню 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

Я думаю, что дубликат не относятся к вопросу. Исключение NullReferenceException вызвано тем, что TimePickerDialog не ждет ввода пользователя, поэтому ожидаемое значение от TimePicker равно null и вызывает исключение. Вопрос в том, как заставить TimePicker ждать ввода. –

ответ

0

Наилучший подход будет , свяжите некоторые данные в уведомлении и в onCreate of the activ проверяйте данные, если существуют данные уведомления, и немедленно откройте свой таймер.

Для связывания данных в уведомлении:

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

Сейчас в OnCreate только проверить данные:

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

Надеется, что это поможет вам :)

+0

Спасибо за ваш комментарий. Возможно, описанный поток не был на 100% понятен. Уведомление открывает TimePickerDialog сразу после его использования. Он также запускает код, который следует за ним, который ожидает ввода пользователя. Поведение, хотя и показывает TimePicker, и код за ним работает с нулевым значением. Итак, как-то TimePicker должен ждать ввода пользователем. –

Смежные вопросы