【问题标题】:Is it possible to pass data while navigating up in android在android中向上导航时是否可以传递数据
【发布时间】:2020-06-01 23:24:06
【问题描述】:

我有两个片段 A 和 B。我正在尝试导航到 B,然后返回到 A。在执行此操作时,我在 A 中有一些表单数据(一堆文本字段),我想保留这些数据在来回导航到 B 时。当我从 B 中 navigateUp() 时,A 中的数据被保留,但我无法将数据从 B 传递到 A。如果我在导航回 A 时使用捆绑包,我无法使用 onSaveInstanceState() 保存数据。我在片段 A 中使用了以下代码来保存表单数据(来自:https://developer.android.com/guide/components/activities/activity-lifecycle#instance-state

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        if(savedInstanceState!=null){
            with(savedInstanceState) {
                inputName.setText(getString("Name"))
            }
        }
        else{
            //I just leave it since the text fields will be empty anyways
        }
    }

override fun onSaveInstanceState(outState: Bundle) {

        outState.run {
            putString("Name",inputName.text.toString())
        }
        super.onSaveInstanceState(outState)
    }

但是当我离开时不会调用 onSaveInstaceState(因此,当调用 onCreate 时,值最终为 null 并且流程转到 if 语句)。我要做的就是在从 A 导航到 B 时将数据保存在 A 中。

【问题讨论】:

  • 查找startActivityForResult()
  • 您能否解释一下您的用例。我的意思是在什么情况下你想将数据传回前一个片段。
  • 当我选择一个单选按钮并单击另一个按钮时,该单选按钮的标签被发送回片段 A

标签: android-fragments kotlin android-navigation android-bundle android-safe-args


【解决方案1】:

不是最好的方法(我建议使用共享状态视图模型共享数据,但从您的问题来看,您是否完全使用视图模型并不清楚):

  1. 为您的片段 B 提供如下操作:
        <action
            android:id="@+id/backToA"
            app:destination="@+id/A"
            app:popUpTo="@+id/B"
            app:popUpToInclusive="true" />
  1. 为片段 A 提供您将从 B 传递的所需参数。
  2. 来自 B,而不是 navigateUp 使用 navigate 和操作 backToA 并提供您需要提供给 A 的参数

您还必须注意手动处理“通过系统返回按钮返回”场景(以覆盖 navigateUp),以及如果您有工具栏,可能还需要“通过工具栏返回” - 但这是另一回事.

【讨论】:

  • 到目前为止,我正在按照您提到的方式进行导航,并且正在传递参数。但是当我覆盖后退按钮并处理工具栏向上按钮时,它会创建一个混乱的后退堆栈(因此,如果用户不断按下 A 和 B 的所有实例,则会一个一个地弹回)。我想我应该从后台堆栈中弹出片段以防止这种情况发生。此外,我使用的是 ViewModel 但不是共享的(因为两个片段都有数据库操作,不想在一个视图模型中加载所有内容)。
  • 您可以在使用导航组件创建操作时设置 pop 属性。因此,当您从 A 转到 B 时,您会从后堆栈中弹出 A。当你从 B 到 A 时,正如答案中提到的,你弹出 B。这样可以使代码有点干净。
  • 您可以创建一个新的视图模型来在片段之间共享数据。同一个片段可以有多个视图模型,这样可能会减少一个视图模型中的代码量。
猜你喜欢
  • 2017-08-09
  • 2021-11-24
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多