我有一个ViewPager
,其中包含一些用户输入不同输入的片段。其中一个片段包含DatePicker
和TimePicker
,我将其存储(当用户选择了日期和时间时)为Joda LocalDate
和LocalTime
。
我想保存日期和时间以保持输入,即使用户在片段之间滑动也是如此。这是我的代码:
@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为空,如果我试图避免保存数据,那么当重新创建片段时,bundle与null不同(当然键值对不是&#39 ; t存在)。
你能告诉我如何解决这个问题的方法吗?我很感激对这种行为的任何解释。
答案 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());
}
}