SavedInstanceState不为null但为空

时间:2016-09-21 08:43:46

标签: android android-fragments android-bundle android-savedstate

我有一个ViewPager,其中包含一些用户输入不同输入的片段。其中一个片段包含DatePickerTimePicker,我将其存储(当用户选择了日期和时间时)为Joda LocalDateLocalTime

我想保存日期和时间以保持输入,即使用户在片段之间滑动也是如此。这是我的代码:

@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
}

我面临的问题是,如果用户访问此片段但未输入任何输入,则向后滑动到之前的片段,然后向选择日期和时间片段,应用程序崩溃LogonCreateView

我不明白为什么如果我的selectedDate和selectedTime为空,如果我试图避免保存数据,那么当重新创建片段时,bundle与null不同(当然键值对不是&#39 ; t存在)。

你能告诉我如何解决这个问题的方法吗?我很感激对这种行为的任何解释。

2 个答案:

答案 0 :(得分:3)

配置更改后Bundle不是null,因为Fragment实施并非唯一使用它。以下引用来自Activity Fragment,但它也适用于Bundle,如documentation中所述:

  

但是,即使您不执行任何操作并且未实现onSaveInstanceState(),Activity类的默认实现onSaveInstanceState()也会恢复某些活动状态。具体来说,默认实现为布局中的每个View调用相应的onSaveInstanceState()方法,这允许每个视图提供有关应保存的自身的信息。

因此,除了确保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 } 之外,还应该检查是否存在带有“日期”和“时间”键的附加内容。当您保存两个键或没有键时,只需检查其中一个键即可:

google.maps.geometry.poly.containsLocation(place.geometry.location, polygon)

答案 1 :(得分: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());

    }
}