使用 SectionStatPageAdapter 和 bundle 将数据从 activity 发送到多个片段

Sending data from activity to multiple fragments with SectionStatPageAdapter and bundle

我有一个 activity 从那里我想将相同的数据发送到多个片段。用户导航到 activity 后,当他单击按钮打开下一个片段时,他将访问 3 个片段。

这就是我想要的:

用户打开 activity,它有一些数据 --> 用户到达第一个片段,它应该从 activity 获取数据 --> 用户到达第二个片段,它也应该有来自 activity 等

的数据

我尝试使用 Bundle 方法,但在尝试检索数据时出现 NullPointerException。

这是我的 activity:

public class GameActivity extends AppCompatActivity {


    private SectionsStatePagerAdapter mSectionsStatePagerAdapter;
    LockableViewPager viewPager;

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

        Intent intent = getIntent();
        String usernamePlayer2 = intent.getStringExtra("username player 2");
        String uidPlayer2 = intent.getStringExtra("uid player 2");

        Bundle bundle = new Bundle();
        bundle.putString("username player 2", usernamePlayer2);
        bundle.putString("uid player 2", uidPlayer2);

        FragmentCategory fragobj = new FragmentCategory();
        fragobj.setArguments(bundle);

        mSectionsStatePagerAdapter = new SectionsStatePagerAdapter(getSupportFragmentManager());

        viewPager = findViewById(R.id.container);
    }

    // ViewPager for the fragments
    private void setupViewPager(ViewPager viewPager){
        SectionsStatePagerAdapter adapter = new SectionsStatePagerAdapter(getSupportFragmentManager());

        adapter.addFragment(new FragmentCategory(), "FragmentCategory1");             // 0
        adapter.addFragment(new FragmentQuestion1(), "FragmentQuestion1");            // 1
        adapter.addFragment(new FragmentAnswer1(), "FragmentAnswer1");                // 2

        viewPager.setAdapter(adapter);
    }

    public void setViewPager(int fragmentNumber){
        viewPager.setCurrentItem(fragmentNumber);
    }

这是我的第一个带有 NullpointerException 的片段:

public class FragmentCategory extends Fragment {

    private View btnNavFragCat1, btnNavFragCat2, btnNavFragCat3;
    private TextView tvCategory1, tvCategory2, tvCategory3;
    private ImageView imageCategory1, imageCategory2, imageCategory3;

    private FirebaseFirestore firebaseFirestoreCategory = FirebaseFirestore.getInstance();
    private CollectionReference categoryCollectionRef = firebaseFirestoreCategory.collection("Categories");

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        String usernamePlayer2 = this.getArguments().getString("username player 2");

        View view = inflater.inflate(R.layout.activity_category_selection, container, false);


...
        return view;
    }
}

我知道使用 Bundle 只能将数据从 activity 发送到一个 Fragment,但为什么会出现错误?是否有更好的方法将数据发送到多个片段。现在我会把它发送到第一个片段,然后从那里发送到下一个等等。

非常感谢您的帮助!

由于您使用的是相同的数据,播放器,我将执行以下操作:

  1. 创建一个存储播放器数据的存储库。
  2. 然后我将为每个片段创建一个 ViewModel,lifeCyclerOwner 就是片段。
  3. 在那个 ViewModel 中,我会为播放器添加一个 LiveData,在 ViewModel 的 init 函数中,我会向存储库询问数据。

  4. 然后片段应该观察那个 LiveData 并在 UI.

  5. 中用它做一些事情

关于您的 NullpointerException,我认为问题在于新片段不包含您尝试提取的参数。

首先删除意图键之间的空格

"username player" => "username_player"

其次您可以通过调用

访问片段中的意图
getActivity().getIntent().getExtras().getString("username_player")

最后 确保在启动 activity

时传递预期的意图值