我在从父活动传递数据到底部导航的子片段时遇到问题。

huangapple 未分类评论55阅读模式
英文:

I have issues passing data from my parent activity to a child fragment on a BottomViewNavigation

问题

  1. // RhemaHiveMessagingClientActivity.java
  2. // Inside my onCreate()
  3. try {
  4. messageBundle = new Bundle();
  5. rhemFrag = new RhemaHiveMessageFragment();
  6. messageBundle.putString("user_church", churchName);
  7. rhemFrag.setArguments(messageBundle);
  8. getAuto().getToast(c, "Church Passed is " + churchName, RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
  9. } catch (NullPointerException np) {
  10. getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + np.getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
  11. }
  12. // RhemaHiveMessageFragment.java
  13. // In my onCreateView()
  14. churchBund = getArguments();
  15. if (churchBund.containsKey("user_church")) {
  16. churchName = churchBund.getString("user_church");
  17. getAuto().getToast(getContext(), "Church Received : " + churchName, RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
  18. } else {
  19. getAuto().getToast(getContext(), RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + " unable to retrieve Church", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
  20. }
  21. // Parent activity code to populate BottomNavigationView
  22. aBar = getSupportActionBar();
  23. aBar.setTitle("Rhema Social");
  24. loadFragment(new RhemaHiveMessageFragment());
  25. bottomNavigationView = findViewById(R.id.bottom_nav);
  26. layoutParams = (CoordinatorLayout.LayoutParams) bottomNavigationView.getLayoutParams();
  27. layoutParams.setBehavior(new RhemaHiveBottomNavBehaviorClass());
  28. bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
  29. @Override
  30. public boolean onNavigationItemSelected(@NonNull MenuItem item) {
  31. try {
  32. switch (item.getItemId()) {
  33. case R.id.rhem_user_messaging:
  34. aBar.setTitle(getString(R.string.message));
  35. loadFragment(new RhemaHiveMessageFragment());
  36. return true;
  37. case R.id.rhem_user_forum:
  38. aBar.setTitle(getString(R.string.forums_lab));
  39. loadFragment(new RhemaHiveGroupMessageFragment());
  40. return true;
  41. case R.id.rhem_user_starred:
  42. aBar.setTitle(getString(R.string.starred_chats));
  43. loadFragment(new RhemaHiveStarredChatsFragment());
  44. return true;
  45. case R.id.rhem_user_add_friend:
  46. aBar.setTitle(getString(R.string.find_hivers));
  47. loadFragment(new RhemaHiveFindHiverFragment());
  48. return true;
  49. }
  50. } catch (NullPointerException np) {
  51. getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + np.getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
  52. }
  53. return false;
  54. }
  55. });
  56. // Function to load a fragment
  57. private void loadFragment(Fragment fragment) {
  58. FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
  59. transaction.replace(R.id.rhema_mess_cont, fragment);
  60. transaction.addToBackStack(null);
  61. transaction.commit();
  62. }
英文:

guys please I'm working on an android project and I need to pass data from a parent activity that is hosting a BottomNavigationView to its child fragment. I've tried to follow some solutions online but seems my issues is peculiar because it involves a BottomNavigationView

> RhemaHiveMessagingClientActivity.java

Inside my onCreate()

  1. try{
  2. messageBundle = new Bundle();
  3. rhemFrag = new RhemaHiveMessageFragment();
  4. messageBundle.putString("user_church", churchName);
  5. rhemFrag.setArguments(messageBundle);
  6. getAuto().getToast(c, "Church Passed is " + churchName, RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
  7. }catch(NullPointerException np){
  8. getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + np.getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
  9. }

> RhemaHiveMessageFragment.java

in my onCreateView()

  1. churchBund = getArguments();
  2. if(churchBund.containsKey("user_church")){
  3. churchName = churchBund.getString("user_church");
  4. getAuto().getToast(getContext(),"Church Recieved : " + churchName, RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
  5. }
  6. else{
  7. getAuto().getToast(getContext(),RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + " unable to retrieve Church",RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
  8. }

This doesn't return any data in my fragment

Also one more thing, this is the code that I use to populate the BottomNavigationView in my parent activity

  1. aBar = getSupportActionBar();
  2. aBar.setTitle("Rhema Social");
  3. loadFragment(new RhemaHiveMessageFragment());
  4. bottomNavigationView = findViewById(R.id.bottom_nav);
  5. layoutParams = (CoordinatorLayout.LayoutParams) bottomNavigationView.getLayoutParams();
  6. layoutParams.setBehavior(new RhemaHiveBottomNavBehaviorClass());
  7. bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
  8. @Override
  9. public boolean onNavigationItemSelected(@NonNull MenuItem item) {
  10. try {
  11. switch (item.getItemId()) {
  12. case R.id.rhem_user_messaging:
  13. aBar.setTitle(getString(R.string.message));
  14. loadFragment(new RhemaHiveMessageFragment());
  15. return true;
  16. case R.id.rhem_user_forum:
  17. aBar.setTitle(getString(R.string.forums_lab));
  18. loadFragment(new RhemaHiveGroupMessageFragment());
  19. return true;
  20. case R.id.rhem_user_starred:
  21. aBar.setTitle(getString(R.string.starred_chats));
  22. loadFragment(new RhemaHiveStarredChatsFragment());
  23. return true;
  24. case R.id.rhem_user_add_friend:
  25. aBar.setTitle(getString(R.string.find_hivers));
  26. loadFragment(new RhemaHiveFindHiverFragment());
  27. return true;
  28. }
  29. }
  30. catch(NullPointerException np){
  31. getAuto().getToast(c,RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + np.getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
  32. }
  33. return false;
  34. }
  35. });
  36. }catch(NullPointerException np){
  37. getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + np.getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
  38. }
  39. }
  40. private void loadFragment(Fragment fragment){
  41. FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
  42. transaction.replace(R.id.rhema_mess_cont,fragment);
  43. transaction.addToBackStack(null);
  44. transaction.commit();
  45. }

答案1

得分: 0

你总是在onNavigationItemSelected方法中创建新的Fragment,并且没有向Fragment中添加任何数据。请将您的代码更改为以下方式:

  1. switch (item.getItemId()) {
  2. case R.id.rhem_user_messaging:
  3. aBar.setTitle(getString(R.string.message));
  4. messageBundle = new Bundle();
  5. rhemFrag = new RhemaHiveMessageFragment();
  6. messageBundle.putString("user_church", churchName);
  7. rhemFrag.setArguments(messageBundle);
  8. loadFragment(rhemFrag);
  9. return true;
  10. case R.id.rhem_user_forum:
  11. aBar.setTitle(getString(R.string.forums_lab));
  12. loadFragment(new RhemaHiveGroupMessageFragment());
  13. return true;
  14. case R.id.rhem_user_starred:
  15. aBar.setTitle(getString(R.string.starred_chats));
  16. loadFragment(new RhemaHiveStarredChatsFragment());
  17. return true;
  18. case R.id.rhem_user_add_friend:
  19. aBar.setTitle(getString(R.string.find_hivers));
  20. loadFragment(new RhemaHiveFindHiverFragment());
  21. return true;
  22. }

或者,如果您已经在Activity的onCreate方法中创建了RhemaHiveMessageFragment,只需像这样使用该片段,而不是重新创建:

  1. switch (item.getItemId()) {
  2. case R.id.rhem_user_messaging:
  3. aBar.setTitle(getString(R.string.message));
  4. loadFragment(rhemFrag);
  5. return true;
  6. case R.id.rhem_user_forum:
  7. // ...其余部分的代码
英文:

You always create new Fragment inside onNavigationItemSelected and don't put any data to Fragment. Change your code like this.

  1. switch (item.getItemId()) {
  2. case R.id.rhem_user_messaging:
  3. aBar.setTitle(getString(R.string.message));
  4. messageBundle = new Bundle();
  5. rhemFrag = new RhemaHiveMessageFragment();
  6. messageBundle.putString("user_church", churchName);
  7. rhemFrag.setArguments(messageBundle);
  8. loadFragment(rhemFrag);
  9. return true;
  10. case R.id.rhem_user_forum:
  11. aBar.setTitle(getString(R.string.forums_lab));
  12. loadFragment(new RhemaHiveGroupMessageFragment());
  13. return true;
  14. case R.id.rhem_user_starred:
  15. aBar.setTitle(getString(R.string.starred_chats));
  16. loadFragment(new RhemaHiveStarredChatsFragment());
  17. return true;
  18. case R.id.rhem_user_add_friend:
  19. aBar.setTitle(getString(R.string.find_hivers));
  20. loadFragment(new RhemaHiveFindHiverFragment());
  21. return true;

Or if you already created RhemaHiveMessageFragment in onCreate method of your Activity, just use this fragment instead of re-create it like this.

  1. switch (item.getItemId()) {
  2. case R.id.rhem_user_messaging:
  3. aBar.setTitle(getString(R.string.message));
  4. loadFragment(rhemFrag);
  5. return true;
  6. case R.id.rhem_user_forum:
  7. // ...rest of the code

答案2

得分: 0

  1. // 当你为底部导航设置片段时,你会为该片段创建一个新对象。因此,在其中没有添加参数。因此,请使用你在onCreateView中创建的RhemaHiveMessageFragment片段变量fragment。
  2. bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
  3. @Override
  4. public boolean onNavigationItemSelected(@NonNull MenuItem item) {
  5. try {
  6. switch (item.getItemId()) {
  7. case R.id.rhem_user_messaging:
  8. aBar.setTitle(getString(R.string.message));
  9. loadFragment(rhemFrag);
  10. return true;
  11. // 其他代码相同
  12. }
  13. }
  14. catch(NullPointerException np){
  15. getAuto().getToast(c,RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + np.getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
  16. }
  17. return false;
  18. }
  19. });
英文:

> When you are setting fragment for bottomnavigation you creating new object for that fragment. So, it's not adding argumaents in that. So, please use RhemaHiveMessageFragment fragment variable which you create in onCreateView

  1. bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
  2. @Override
  3. public boolean onNavigationItemSelected(@NonNull MenuItem item) {
  4. try {
  5. switch (item.getItemId()) {
  6. case R.id.rhem_user_messaging:
  7. aBar.setTitle(getString(R.string.message));
  8. loadFragment(rhemFrag);
  9. return true;
  10. // other code will same
  11. }
  12. }
  13. catch(NullPointerException np){
  14. getAuto().getToast(c,RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + np.getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
  15. }
  16. return false;
  17. }
  18. });
  19. }

答案3

得分: 0

你应该在onCreate中传递你创建的RhemaHiveMessageFragment的新实例。

  1. switch (item.getItemId()) {
  2. case R.id.rhem_user_messaging:
  3. aBar.setTitle(getString(R.string.message));
  4. loadFragment(rhemFrag);
  5. ...
  6. }
英文:

You should pass new instance of RhemaHiveMessageFragment that you have created in onCreate.

  1. switch (item.getItemId()) {
  2. case R.id.rhem_user_messaging:
  3. aBar.setTitle(getString(R.string.message));
  4. loadFragment(rhemFrag);
  5. ...
  6. }

huangapple
  • 本文由 发表于 2020年4月8日 18:38:49
  • 转载请务必保留本文链接:https://java.coder-hub.com/61098738.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定