【问题标题】:Passing argument from fragment to activity using SafeArgs使用 SafeArgs 将参数从片段传递到活动
【发布时间】:2019-10-01 08:42:32
【问题描述】:

使用导航图,当我从片段导航到活动并使用安全参数传递参数时,在活动中,我无法获得参数。我怎样才能得到从片段传递的参数???

在片段中,我可以通过getArgument() 函数获取参数,但不能在活动中。

在片段中,我通过以下方式切换到另一个活动:

findNavController().navigate(AFragmentDirections.actionAFragmentToBActivity(1)

并在 B 活动中获取 onCreate 中的参数:

val args = BActivityArgs.fromBundle(savedInstanceState!!)

但我的应用程序立即崩溃。

【问题讨论】:

  • 请告诉我们您尝试了什么?
  • 请在此处添加您的源代码

标签: android kotlin android-safe-args android-navigation-graph


【解决方案1】:

接受的答案不是您的问题的答案。正如您所指出的:您不能在Activity 中使用getArguments(),您只能在片段中使用。然而,在一个活动中你可以得到这样的数据(java语法):

String aField = BActivityArgs.fromBundle(getIntent().getExtras()).getAField()

因此,如果您在接收端有Activity,只需将getArguments() 替换为getIntent().getExtras()

【讨论】:

    【解决方案2】:

    查看 Android 文档:-

    https://developer.android.com/guide/navigation/navigation-pass-data#java

    发送数据

    @Override
    public void onClick(View view) {
    EditText amountTv = (EditText) getView().findViewById(R.id.editTextAmount);
    int amount = Integer.parseInt(amountTv.getText().toString());
    ConfirmationAction action =
           SpecifyAmountFragmentDirections.confirmationAction()
    action.setAmount(amount)
    Navigation.findNavController(view).navigate(action);
    }
    

    获取数据:-

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    TextView tv = view.findViewById(R.id.textViewAmount);
    int amount = ConfirmationFragmentArgs.fromBundle(getArguments()).getAmount();
    tv.setText(amount + "")
    }
    

    【讨论】:

    • getArguments() 只能在片段中获取参数。我想在活动中争论。
    • 我已阅读您的链接,我可以通过以下方式获取论点:val args : BActivityArgs by navArgs() 在 onCreate 之外。非常感谢
    【解决方案3】:
    BActivityArgs.fromBundle(getIntent().getExtras()).getAField();
    

    完美工作

    【讨论】:

      【解决方案4】:
      • 如官方文档HERE中所述:

      导航组件专为具有一个主要活动和多个片段目的地的应用而设计。主要活动与导航图相关联,并包含一个 NavHostFragment,负责根据需要交换目的地。在具有多个活动目的地的应用中,每个活动都有自己的导航图

      • 一个解决方案可能是:重新考虑是否可以将活动转换为片段,然后新创建的片段可以由相同的导航组件处理。因此允许您使用正常的 SafeArgs 语法来传递和检索数据。

      • 如果您在使用 SafeArgs 插件时仍有问题,我强烈推荐 Android 官方团队撰写的这篇中等文章,HERE

      【讨论】:

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