@dendead

Как отправить данные из Activity в Fragment с подключенным ViewPager2?

Всем привет!
Я пытаюсь отправить данные из MainActivity в один из фрагментов, созданных с помощью ViewPager2.

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
 
    ViewPager2 viewPager = findViewById(R.id.viewPager);
    MainPagerAdapter pagerAdapter = new MainPagerAdapter(this);
    viewPager.setAdapter(pagerAdapter);
}


MainPagerAdapter:

public class MainPagerAdapter extends FragmentStateAdapter
{
    public MainPagerAdapter(@NonNull FragmentActivity fragmentActivity)
    {
        super(fragmentActivity);
    }
 
    @NonNull
    @Override
    public Fragment createFragment(int position)
    {
        switch (position)
        {
            case 0:
                return new Fragment1();
            case 1:
                return new Fragment2();
            default:
                return new Fragment3();
        }
    }
 
    @Override
    public int getItemCount()
    {
        return 3;
    }
}


Отправляю данные из MainActivity так:

Fragment1 fragment1 = new Fragment1();
 
Bundle bundle = new Bundle();
bundle.putInt("1", 1);
fragment1.setArguments(bundle);


И пытаюсь получить их в Fragment:

Bundle bundle = this.getArguments();
if (bundle != null)
{
    int i = bundle.getInt("1", 0);
    Log.d(Constants.LOG_TAG, "" + i);
}


Но всегда приходит пустой bundle, потому что фрагмент создаётся только тогда, когда Viewpager перелистывает его.
Как мне отправить данные в Fragment во время создания MainActivity?
  • Вопрос задан
  • 64 просмотра
Решения вопроса 2
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Во время создания активити фрагмент ещё не существует. Ты его, судя по коду, создал, наполнил данными, и потом просто выкинул. Пейджер создал себе новый фрагмент.
Один из путей тут, сделать некий репозиторий с данными, куда активити сложит их, а фрагмент заберёт оттуда, когда ему данные понадобятся. Репозиторий хранить в активити или в графе DI.
Другой путь проще - использовать adapter по назначению. Он, по задумке, адаптирует(превращает) данные во фрагменты. Передай свои данные из активити в адаптер, и при создании фрагмента в адаптере наполняй его этими данными.
Ответ написан
@dendead Автор вопроса
Вроде так и получилось)

В MainActivity:
pagerAdapter = new MainPagerAdapter(this);
pagerAdapter.setData(fragment1Container);

В MainPagerAdapter:
public class MainPagerAdapter extends FragmentStateAdapter
{
    private Fragment1Container fragment1Container;
    private Fragment2Container fragment2Container;

    public void setData(Fragment1Container container)
    {
    f   ragment1Container = container;
    }

    public void setData(Fragment2Container container)
    {
        fragment2Container = container;
    }

    @NonNull
    @Override
    public Fragment createFragment(int position)
    {
        switch (position)
        {
            case 0:
                Fragment1 fragment1 = new Fragment1();
        
                Bundle bundle = new Bundle();
                Gson gson = new Gson();
        
                bundle.putString("fragment1Container", gson.toJson(fragment1Container));
                fragment1.setArguments(bundle);
        
                return fragment1;
            case 1:...

В Fragment1:
private Fragment1Container fragment1Container;

if (bundle != null)
{
    Gson gson = new Gson();
    String jsonString = bundle.getString("fragment1Container");
    Type entityType = new TypeToken<Fragment1Container>(){}.getType();
    fragment1Container = gson.fromJson(jsonString , entityType );
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы