Как передать данные из Activity в уже созданный фрагмент? - PullRequest
0 голосов
/ 10 апреля 2020

В последнее время я застрял! У меня есть одно действие (не моя MainActivity, я имею в виду, это не то место, где я создал этот фрагмент), и мне нужно передать некоторые данные. Я уже пытался перейти с помощью Bundle, используя getter, но появляется та же проблема: «Попытка вызвать виртуальный метод {...} для нулевого объекта». на линии, где я называю Бандл во фрагменте. Я новичок в этом, так что извините, если это простой вопрос, и я не понял. Ниже приведены соответствующие части моего кода:

В действии (не в основной деятельности):

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

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

Во фрагменте (где я хочу поместить это 'goal')

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;
            }
};

Пожалуйста, я потерял много времени, пытаясь решить это самостоятельно, хахаха. Если кто-нибудь может мне помочь, я был бы признателен за это!

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Если действие (не основное действие) было создано из вашего фрагмента, вы можете использовать метод

startActivityForResult()

для получения данных после завершения действия, читайте об этом подробнее здесь

Если это не так, вам необходимо сохранить (в хранилище) данные, используя Preferences или Room Database

0 голосов
/ 10 апреля 2020

Создайте метод во Фрагменте, для которого вы хотите получать данные, затем вызовите метод в Деятельности.

Запишите этот код в Деятельности:

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

Запишите код во Фрагменте:

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