1

我有ViewPager一些片段,用户在其中输入不同的输入。其中一个片段包含 aDatePicker和 aTimePicker我存储(当用户选择日期和时间时)作为 JodaLocalDateLocalTime.

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

@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 为 null 时尝试避免保存数据,当重新创建片段时,bundle 与 null 不同(当然键值对不存在)。

你能给我一个解决这个问题的方法吗?我将不胜感激对这种行为的任何解释。

4

2 回答 2

3

Bundle不是null在配置更改之后,因为您的实现Fragment不是唯一使用它的实现。以下引用来自文档Activity但它也有效,Fragment处理运行时更改中所述:

然而,即使你什么都不做也没有实现onSaveInstanceState(),Activity 类的默认实现onSaveInstanceState() 也会恢复一些活动状态。具体来说,默认实现为布局中的每个 View 调用相应的 onSaveInstanceState() 方法,这允许每个 View 提供有关其自身应保存的信息。

因此,除了确保Bundleis not之外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
}
于 2016-09-21T09:18:29.790 回答
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());

    }
}
于 2016-09-21T08:45:19.847 回答