1

У меня есть ViewPager с некоторыми фрагментами, где пользователь вводит разные входы. Один из этих фрагментов содержит DatePicker и TimePicker, которые я храню (когда пользователь выбрал дату и время) в качестве Joda LocalDate и LocalTime.SavedInstanceState не имеет значения null, но пусто

Я хочу сохранить дату и время, чтобы сохранить этот вход, даже пользователь щелкает между фрагментами. Вот мой код:

@Override 
public void onSaveInstanceState(Bundle outState) { 
    if (selectedDate != null && selectedTime != null) { 
     outState.putString("date", selectedDate.toString()); 
     outState.putString("time", selectedTime.toString()); 
     super.onSaveInstanceState(outState); 
    } 
} 

И в моем onCreateView:

if (savedInstanceState != null){ 
    Log.d("mylog", savedInstanceState.getString("date"); 
    currentDate = LocalDate.parse(savedInstanceState.getString("date")); 
    currentTime = LocalTime.parse(savedInstanceState.getString("time")); 
    selectedDateTv.setText(currentDate.toString("dd/MM/yyyy")); 
    selectedTimeTv.setText(currentTime.toString("HH:mm")); 
} else { 
    //My code 
} 

Проблема я столкнулся в том, если пользователь добраться до этого фрагмента, но не входит любой вход, а затем проведите пальцем назад к предыдущим фрагментам и дальше к выбору даты и времени фрагмента, приложение падает на моей линии Log по адресу onCreateView.

Я не понимаю, почему, если я пытаюсь избежать сохранения данных, если мои selectedDate и selectedTime равны нулю, когда фрагмент воссоздан, пакет отличается от нуля (и, конечно, пары ключ-значение не существуют).

Можете ли вы дать мне подход к тому, как это решить? Буду признателен за любое объяснение этого поведения.

+0

Include состояние таким образом, что линии не должны работать, если она равна нулю или включить его в попытке поймать блок –

ответ

2

Bundle не null после изменения конфигурации, потому что ваша Fragment реализация не только один, чтобы использовать его. Ниже приводится цитата из documentation для Activity но это справедливо для Fragment, а также, как указано в Handling Runtime Changes:

Однако, даже если вы ничего не делаете и не реализуют onSaveInstanceState(), некоторые государства деятельности является восстановлен по умолчанию по умолчанию для класса активности onSaveInstanceState(). В частности, реализация по умолчанию вызывает соответствующий метод onSaveInstanceState() для каждого представления в макете, что позволяет каждому представлению предоставлять информацию о себе, которая должна быть сохранена.

Таким образом, в дополнение к убедившись, что Bundle не null, вы должны проверить, если дополнительные услуги с ключами «дата» и «время» есть на всех. Как вы спасаете оба ключа или ни один, достаточно проверить для одного из них:

if (savedInstanceState != null 
    && savedInstanceState.containsKey("date") 
    ){ 
    Log.d("mylog", savedInstanceState.getString("date"); 
    currentDate = LocalDate.parse(savedInstanceState.getString("date")); 
    currentTime = LocalTime.parse(savedInstanceState.getString("time")); 
    selectedDateTv.setText(currentDate.toString("dd/MM/yyyy")); 
    selectedTimeTv.setText(currentTime.toString("HH:mm")); 
} 
else { 
    //My code 
} 
0

изменить способ, как показано ниже

@Override 
public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
    if (selectedDate != null && selectedTime != null) { 
     outState.putString("date", selectedDate.toString()); 
     outState.putString("time", selectedTime.toString()); 

    } 
} 

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

  • Нет связанных вопросов^_^