【问题标题】:Simple Navigation and passing data among Activities活动之间的简单导航和传递数据
【发布时间】:2015-10-12 15:10:02
【问题描述】:

我有 3 个活动。假设它们为 1,2 和 3。

每个屏幕都包含-

  1. 屏幕名称 - screen_1、screen_2 和 screen_3 分别
  2. 从屏幕 # - # 是在活动之间传递的屏幕编号。
  3. 下一个按钮 - 导航到下一个活动。

    • 导航如下-

1->2->3 反之亦然 3->2->1

  • 每次启动时,“屏幕 1”的“From_screen_#”将为空白或“0”。
  • 当我按下 Activity_1 上的下一步按钮时,它应该导航到 Activity_2,From_screen_# 为“1”。如果我按下 Activity_2 上的返回按钮,那么 From_screen_# 在 Activity_1 中应该是“2”。
  • 活动 2 上的类似行为。
  • 在 Activity_3 中单击下一个按钮,它应该导航到 Activity_2 并将 From_screen_# 作为“3”传递。所以在 Activity_2 上 From_screen_# 是“3”。当我按下 Activity_2 上的返回按钮时,它应该导航到 Activity_1 而不是 Activity 3。

  • 我不能使用硬编码导航,如覆盖 onKeyDown() 和通过 Intent 启动上一个 Activity。

我开始 NextActivity 如下-

startActivityForResult(new Intent(MainActivity.this, Two.class)
            .putExtra("from", "1"), 2);

我已经重写了 onKeyDown() 并将数据传递给之前的 Activity,如下所示-

if(keyCode == KeyEvent.KEYCODE_BACK){
        Intent intent = new Intent();
        intent.putExtra("from", "2");
        setResult(2, intent);
        finish();
}

我在 onActivityResult() 中设置 From_screen_# 如下-

if(data!=null)
        txtFrom.setText("From" + data.getStringExtra("from"));

在第三个屏幕上,我开始了第二个活动,如下所示-

startActivity(new Intent(Five.this, Two.class)
                    .putExtra("from", "3")
                    .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));

查询-

如果我从 1->2 导航,然后从 2->1 导航,我会得到正确的 From_screen_# = 1。

但是当我从 1->2->3 然后从 3->2 然后从 2->1 导航时,Activity_1 上的数据为空。如何解决?

【问题讨论】:

    标签: android android-activity


    【解决方案1】:

    首先,如果您想在按下返回按钮时覆盖默认的 Android 行为,您必须在 Activity 中覆盖 onBackPressedonKeyDown 用于通过键盘观看事件。

    恢复 Activity #1 时您没有内容,因为您的意图中没有数据(没有数据从 2 传递到 1)。你应该调查一下onResume中是否有。

    很高兴学习如何使用意图将数据从上下文传递到另一个上下文。但是,正如您可能已经注意到的那样,并不是真的要使用它们。传递自定义对象也很困难。

    我强烈建议您使用 EventBusParceler 等库。

    要解决您的问题,只需在暂停源活动时传递数据并在恢复目标活动时提取它们。

    【讨论】:

    • 我已经编辑了问题并简化了语言。如果您对理解问题有任何疑问,请告诉我。
    【解决方案2】:

    这是不可能的!!!

    1. 启动时 Activity_1 位于堆栈上。它启动 Activity_2 并将其推入堆栈。
    2. 现在 Activity_2 启动 Activity_3 并将其推入堆栈。

    所以现在堆栈包含 3 个活动。我可以使用标志“Intent.FLAG_ACTIVITY_CLEAR_TOP”从堆栈中弹出 Activity。这将重新创建 Intented Activity。

    在我的情况下,它是 Activity_2,因此它从 Activity_3 接收数据。现在这个 Activity_2 是从 Activity_3 重新创建的,所以它不能通过 Intent 将任何数据传递给 Activity_1 而不重新创建它。

    我尝试在 Activity_2 = singleTop 上设置 launch_mode 以避免重新创建 Activity_2。在这种情况下,数据不能从 Activity_3 传递到 Activity_2。但预期数据已成功从 Activity_2 传递到 Activity_1。

    我认为我们只能通过 Intent 来回传递数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多