如何将数据从 Activity 传递到已创建的 Fragment?

Posted

技术标签:

【中文标题】如何将数据从 Activity 传递到已创建的 Fragment?【英文标题】:How to pass data from Activity to already created Fragment? 【发布时间】:2020-07-23 02:31:32 【问题描述】:

最近我被卡住了!我有一个 Activity(不是我的 MainActivity,我的意思是,它不是我创建这个 Fragment 的地方),我需要传递一些数据。我已经尝试使用 Bundle,使用 getter 传递,但出现了同样的问题:“尝试在空对象上调用虚拟方法 ...。”在我在 Fragment 中调用 Bundle 的那一行。我是新手,所以如果这是一个简单的问题并且我不明白,我很抱歉。在我的代码的相关部分下方:

关于 Activity(不是主要 Activity):

public void save()
    myGoal = spinnerGoals.getSelectedItem().toString();

    Bundle bundle = new Bundle();
    bundle.putString("goal", myGoal);
    GoalFragment goalFragment = new GoalFragment();
    goalFragment.setArguments(bundle);

在片段上(我想把这个“目标”放在哪里)

private TextView goal;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
    View view = inflater.inflate( R.layout.fragment_goal, container, false);
    goal = view.findViewById(R.id.myGoalText);

    Bundle bundle = getArguments();
    if (bundle != null) 
        final String myGoal = bundle.getString("goal");
        goal.setText(myGoal);
    
    return view;

在 MainActivity(我创建片段的地方):

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation);
    bottomNav.setOnNavigationItemSelectedListener(navListener);
    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new HomeFragment() )
            .commit();


private BottomNavigationView.OnNavigationItemSelectedListener navListener =
        new BottomNavigationView.OnNavigationItemSelectedListener() 
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) 
                Fragment selectedFragment = null;

                switch (item.getItemId()) 
                    case R.id.nav_home:
                        selectedFragment = new HomeFragment();
                        break;
                    case R.id.nav_goal:
                        selectedFragment = new GoalFragment();
                        break;
                    case R.id.nav_info:
                        selectedFragment = new InfoFragment();
                        break;
                

                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, selectedFragment)
                        .commit();

                return true;
            
;

拜托,我已经浪费了很多时间试图自己解决这个问题哈哈哈。如果有人可以帮助我,我将不胜感激!

【问题讨论】:

您的主要活动是否从您尝试从中发送数据的活动开始? 第二个活动是如何开始的?你的主要活动开始了吗? MainActivity 启动我要从中发送数据的 Activity。 【参考方案1】:

在Fragment中创建一个要接收数据的方法,然后在Activity中调用该方法。

在Activity中写下这段代码:

 Bundle bundle = new Bundle();
 bundle.putString("goal", myGoal);
 fragmentObj.sendData(bundle);

在 Fragment 中编写代码:

public void sendData(Bundle bundle)
      String myGoal = bundle.getString("goal");

【讨论】:

【参考方案2】:

如果活动(不是主要活动)是从您的片段创建的,您可以使用

startActivityForResult()

活动结束后接收数据的方法,阅读更多here

如果不是这样,您需要使用PreferencesRoom Database 将数据持久化(在存储中)

【讨论】:

以上是关于如何将数据从 Activity 传递到已创建的 Fragment?的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从列表视图传递到 detalis Activity

如何将位图从 Activity 传递给服务

如何将数据从一个 Activity 中的 ListView 传递到另一个 Activity 上的 TextView?

如何使用 TabLayout 将数据从 Activity 传递到 Fragment

Android如何成功截击请求,如何将数据从Activity传递到Fragment?

Kotlin 上的 Android:如何将数据从 Activity 传递到事件监听器?