0

我有一种情况,我有一个三步注册过程。每个步骤都包含在自己的活动中 - 将它们称为 A、B 和 C。只有当我完成第三步时,我才能可靠地验证其中一个输入(以及我使用 PHPMailer 向其发送确认的电子邮件地址) . 如果这返回一个错误,我想一直回到 A,这是输入电子邮件地址的地方。

只需调用一个 Intent 就足够简单了。但是,我想保留用户最初输入的输入值,这样他们就不必再次输入它们。理论上,最简单的方法是调用finish()两次。但这不起作用,因为一旦调用它就会将控制权转移回 B 并且第二次调用永远不会发生。

有没有一种简单的方法可以做到这一点,还是我必须调用 Intent 然后以某种方式通过另一种方法填充字段?谢谢!

4

2 回答 2

1

我不确定我是否完全理解您,但您可以使用该标志FLAG_ACTIVITY_CLEAR_TOP将其带回 A 并删除 B。

Intent i = new Intent(C.this, A.class)
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
finish();

当您收到错误时运行此代码,它将恢复 A。如果按下“返回”按钮,您仍然会到达 B。

您的另一个选择是将信息存储在SharedPreferences之类的内容中并从那里加载数据,但这对于您的情况可能是不必要的。

于 2013-08-14T17:27:38.110 回答
-1

要在活动之间传递数据,Bundle例如,在此类活动中使用 ——B

Intent intent = new Intent(this, C.class);
Bundle b = new Bundle();
b.putBoolean("some_boolean_value", true);
b.putInt("some_int_value", 4);
b.putString("some_string_value", "foobar");
intent.putExtra("fooBundle", b);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
finish();

然后,从您的类活动“C”中,在它出现在屏幕上之后,从onCreate方法中提取包:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState.containsKey("fooBundle")){
        Bundle b = savedInstanceState.getBundle("fooBundle");
        int nVal = b.getInt("some_int_value");
        String sVal = b.getString("some_string_value");
        boolean blnVal = b.getBoolean("some_boolean_value");
        // Do whatever you have to do, put them into textview's etc.
    }
}

请注意,如何进行检查以确保确实有一个包,如果没有,它是一个“空视图”,即没有数据可以预填充到字段中。并反转从Bundle中提取值。

当您退出课堂活动C时,它会返回活动A

编辑

OP 坚持使用“两个”后退键击,这被认为是不必要的,因为指示活动的标志已从堆栈中清除。

A -> B

在上述代码中创建意图并运行之前,堆栈现在变为......

A -> C

现在C按返回键退出活动。

一个

于 2013-08-14T17:43:25.163 回答