提问人:Ali Hamed 提问时间:1/10/2023 最后编辑:Ali Hamed 更新时间:1/23/2023 访问量:56
在表单的输入页面之间导航时丢失输入数据
loss inputs data when navigating between form's input pages
问:
在我的 Android 应用程序中,我创建了三个活动。每个都包含一些输入字段和按钮“下一页”,除了最后一个,其中的按钮负责提交。 我的问题是,当用户填写所有输入并在单击提交按钮之前,如果他想使用手机默认集成的后退按钮返回,然后在检查第一页后,当他单击“下一步按钮”以转到第二页时,第二页中的输入消失了。(因为如您所知,活动将重新启动,因此所有输入数据都将被删除)
有什么方法可以保存数据。
当使用以下方法从第一页前进到第三页时,我确实保存了它:
Intent intent = new Intent(CreateViolationPageOne.this,CreateViolationPageTwo.class);
String allData = inputStreet.getText().toString()+","+inputVehicle.getText().toString()+","+inputBrand.getText().toString()+
inputColor.getText().toString()+","+inputNumber.getText().toString();
intent.putExtra(CreateViolationPageTwo.ALL_DATA, allData);
startActivity(intent);
注意:
我没有使用
finish()
后
StartActivity(intent)
此外,我确实在代码中使用了 onSaveInstanceState,但问题 仍在发生:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
if(!inputStreet.getText().toString().isEmpty())
savedInstanceState.putString("inputStreet", inputStreet.getText().toString());
if(!inputVehicle.getText().toString().isEmpty())
savedInstanceState.putString("inputVehicle", inputVehicle.getText().toString());
if(!inputBrand.getText().toString().isEmpty())
savedInstanceState.putString("inputBrand", inputBrand.getText().toString());
if(!inputColor.getText().toString().isEmpty())
savedInstanceState.putString("inputColor", inputColor.getText().toString());
if(!inputNumber.getText().toString().isEmpty())
savedInstanceState.putInt("inputNumber", Integer.parseInt(inputNumber.getText().toString()));
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
然后在 onCreate 方法中,我添加了:
if (savedInstanceState != null) {
if(savedInstanceState.containsKey("inputStreet"))
inputStreet.setText(savedInstanceState.getString("inputStreet"));
if(savedInstanceState.containsKey("inputVehicle"))
inputVehicle.setText(savedInstanceState.getString("inputVehicle"));
if(savedInstanceState.containsKey("inputBrand"))
inputBrand.setText(savedInstanceState.getString("inputBrand"));
if(savedInstanceState.containsKey("inputColor"))
inputColor.setText(savedInstanceState.getString("inputColor"));
if(savedInstanceState.containsKey("inputNumber"))
inputNumber.setText(Integer.toString(savedInstanceState.getInt("inputNumber")));
}
这是我的第一个 android 应用程序,我是 Android Studio 的新手。
答:
0赞
Ali Hamed
1/23/2023
#1
我找到了问题的答案。我发现,使用与输入的数据类型相对应的字段创建类是最有效的方法。举例来说,我在活动中输入了 street,因此我在类中创建了一个私有的 String street 字段来保留输入的数据。
我的班级如下所示:
public class AllViolationData implements Serializable {
private static AllViolationData violationData;
private String numberOne;
private String numberTwo;
private String inputStreet;
private String inputVehicle;
//the rest of my data fields
}
但诀窍是在其中创建此类的静态实例,并用 getter 作为它的 setter
public static void setViolationData(AllViolationData violationData) {
AllViolationData.violationData = violationData;
}
public static AllViolationData getViolationData() {
if(violationData==null){
violationData = new AllViolationData();
}
return violationData;
}
现在,当用户单击“下一步”按钮移动到下一页时,我利用 getVioationData 将数据保存在其中,然后在保存数据后开始后续活动。
最后,通过将代码放在 onCreate 函数中,我在每次激活中使用相同的对象,我不必担心静态概念,因为该对象在我第一次启动激活时将为 null,因为我在提交数据时始终将其设置为 null。
它可能不是理想的解决方案,但它可以完成工作。
评论
onSaveInstanceState