使用 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,但为什么会出现错误?是否有更好的方法将数据发送到多个片段。现在我会把它发送到第一个片段,然后从那里发送到下一个等等。
非常感谢您的帮助!
由于您使用的是相同的数据,播放器,我将执行以下操作:
- 创建一个存储播放器数据的存储库。
- 然后我将为每个片段创建一个 ViewModel,lifeCyclerOwner 就是片段。
在那个 ViewModel 中,我会为播放器添加一个 LiveData,在 ViewModel 的 init 函数中,我会向存储库询问数据。
然后片段应该观察那个 LiveData 并在 UI.
中用它做一些事情
关于您的 NullpointerException,我认为问题在于新片段不包含您尝试提取的参数。
首先删除意图键之间的空格
"username player" => "username_player"
其次您可以通过调用
访问片段中的意图
getActivity().getIntent().getExtras().getString("username_player")
最后 确保在启动 activity
时传递预期的意图值
我有一个 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,但为什么会出现错误?是否有更好的方法将数据发送到多个片段。现在我会把它发送到第一个片段,然后从那里发送到下一个等等。
非常感谢您的帮助!
由于您使用的是相同的数据,播放器,我将执行以下操作:
- 创建一个存储播放器数据的存储库。
- 然后我将为每个片段创建一个 ViewModel,lifeCyclerOwner 就是片段。
在那个 ViewModel 中,我会为播放器添加一个 LiveData,在 ViewModel 的 init 函数中,我会向存储库询问数据。
然后片段应该观察那个 LiveData 并在 UI.
中用它做一些事情
关于您的 NullpointerException,我认为问题在于新片段不包含您尝试提取的参数。
首先删除意图键之间的空格
"username player" => "username_player"
其次您可以通过调用
访问片段中的意图getActivity().getIntent().getExtras().getString("username_player")
最后 确保在启动 activity
时传递预期的意图值