通过fragment之间的导航传递数据android studio

问题描述 投票:0回答:2

我是 android studio 的新手,还没有完全理解它的工作原理,但我一直在尝试将数据从 android studio 中的一个片段发送到另一个片段。我一直无法找到这个问题的明确答案。我想做的是制作一个基本的停车应用程序,其中扫描二维码,并且二维码中的数据(停车名称和每小时价格)将发送到下一个片段,因为二维码扫描仪片段将打开一个 addParkingSession 片段,我需要其中的停车数据。我一直在尝试使用“导航”来执行此操作,但我无法找到通过此方法发送数据的方法。是否有更适合这个的不同方法(虽然它必须从一个片段到另一个片段)我一直在尝试使用意图,但导航似乎没有选项来发送意图。

这是我的一些代码作为示例。感谢您的帮助和理解

codeScanner.setDecodeCallback(new DecodeCallback() {
        @Override
        public void onDecoded(@NonNull Result result) {
            getActivity().runOnUiThread(new Runnable(){
                @Override
                public void run(){
                    if(result.getText() != null) {
                        String[] parkingdata = resultData.toString().split(",");
                        Intent intent = new Intent(getActivity().getBaseContext(), AddSession.class);
                        intent.putExtra("parkingName", parkingdata[0]);
                        intent.putExtra("parkingPrice", parkingdata[1]);
                        Navigation.findNavController(view).navigate(R.id.action_qrSession_to_addSession);
                    }
                }
            });
        }
    });
java android android-studio android-fragments
2个回答
4
投票

您可以将捆绑对象作为

.navigate()
中的第二个参数传递,并使用
getArguments()
在片段中访问它。

final Bundle bundle = new Bundle();
bundle.putString("test", "Hello World!");
Navigation.findNavController(view).navigate(R.id.action_qrSession_to_addSession, bundle);
public class MyFragment extends Fragment {
  
  @Override
  public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    // the string you passed in .navigate()
    final String text = getArguments().getString("test");
  }
}

0
投票

除非您要处理复杂的应用程序,否则请按照 Android.com 此处的建议使用 ViewModelProvider https://developer.android.com/guide/fragments/communicate

getActivity() 而不是“this”将在 MainActivity 级别而不是对象级别存储应用程序的值,因此您将能够与其他活动或片段保留/交换任何片段变量。当您使用片段模板时,IDE 会在每个片段的源中生成视图模型及其代码。您可以直接从 ViewModelProvider 访问变量,并根据您的商店需要使用获取和设置:

// Fragment A set
// getActivity() rather than 'this' for global scope
NotificationsViewModel notificationsViewModel = new ViewModelProvider(getActivity()).get(NotificationsViewModel.class);
notificationsViewModel.mUri = audioList.uris.get(position);

// Fragment B get
NotificationsViewModel notificationsViewModel = new ViewModelProvider(getActivity()).get(NotificationsViewModel.class);
homeViewModel.mMediaPlayer.setDataSource(notificationsViewModel.mUri);

因此,如果您在应用程序中看到了视图模型生成的源代码,但不确定它现在是什么,您就知道了!

© www.soinside.com 2019 - 2024. All rights reserved.