У меня проблема, которую я уже много время борется. Я создал класс 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);
}
}
Я думаю, что дубликат не относятся к вопросу. Исключение NullReferenceException вызвано тем, что TimePickerDialog не ждет ввода пользователя, поэтому ожидаемое значение от TimePicker равно null и вызывает исключение. Вопрос в том, как заставить TimePicker ждать ввода. –