在表单的输入页面之间导航时丢失输入数据

loss inputs data when navigating between form's input pages

提问人:Ali Hamed 提问时间:1/10/2023 最后编辑:Ali Hamed 更新时间:1/23/2023 访问量:56

问:

在我的 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 的新手。

Java Android-Studio 输入 移动

评论

0赞 Alexander Hoffmann 1/10/2023
您需要保存和恢复数据。用途 : stackoverflow.com/questions/16769654/...onSaveInstanceState
0赞 Ali Hamed 1/10/2023
@AlexanderHoffmann我这样做了,但问题仍然发生了。我将代码添加到问题中。

答:

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。

它可能不是理想的解决方案,但它可以完成工作。