1

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

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

@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不同(当然键值对不存在)。

你能给我一个如何解决这个问题的方法吗?我希望对此行为有任何解释。

+0

以这样的方式将这些行不应该运行,如果它为空或包含在尝试捕捉包括条件块 –

回答

2

Bundle不是null配置更改后,因为你Fragment实现不使用它的唯一的一个。以下报价是从documentationActivity,但它是有效的Fragment为好,在Handling Runtime Changes说:

然而,即使你什么也不做,不实现的onSaveInstanceState(),一些活动状态的是由Activity类的onSaveInstanceState()的默认实现恢复。具体而言,默认实现为布局中的每个视图调用相应的onSaveInstanceState()方法,从而允许每个视图提供有关应该保存的有关自身的信息。

所以除了确保该Bundlenull,你应该检查是否有键“日期”和“时间”的演员在那里的。当您要保存这两个键或者没有,就足够了检查其中的一个:

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()); 

    } 
} 
相关问题