Отправка данных на вкладки в TabLayout Android

У меня есть фрагмент с TabLayout, который выглядит так:

Код, где он создан:

public class CalendarActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_calendar);

    SimpleDateFormat sdf = new SimpleDateFormat("EEE dd-MM", new Locale("en", "GB"));

    TabLayout tabLayout = findViewById(R.id.tabs);
    final ViewPager viewPager = findViewById(R.id.viewPager);
    tabLayout.addTab(tabLayout.newTab().setText("today"));
    tabLayout.addTab(tabLayout.newTab().setText("tomorrow"));
    tabLayout.addTab(tabLayout.newTab().setText(sdf.format(new Date(((new Date()).getTime() + 2*86400000)))));
    tabLayout.addTab(tabLayout.newTab().setText(sdf.format(new Date(((new Date()).getTime() + 3*86400000)))));
    tabLayout.addTab(tabLayout.newTab().setText(sdf.format(new Date(((new Date()).getTime() + 4*86400000)))));
    tabLayout.addTab(tabLayout.newTab().setText(sdf.format(new Date(((new Date()).getTime() + 5*86400000)))));
    tabLayout.addTab(tabLayout.newTab().setText(sdf.format(new Date(((new Date()).getTime() + 6*86400000)))));
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

    PageAdapterCalendar adapter = new PageAdapterCalendar (getSupportFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
}

Код адаптера:

public class PageAdapterCalendar extends FragmentStatePagerAdapter {
int mNumOfTabs;

public PageAdapterCalendar (FragmentManager fm, int NumOfTabs) {
    super(fm);
    this.mNumOfTabs = NumOfTabs;
}

@Override
public Fragment getItem(int position) {
    Fragment fragment = null;
    switch(position){
        case 0:
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
        case 6:
            fragment = CalendarFragment.newInstance();
            break;
    }
    return fragment;
}

@Override
public int getCount() {
    return mNumOfTabs;
}

}

newinstance () во фрагменте календаря:

    public static Fragment newInstance() {
    CalendarFragment fragment = new CalendarFragment();
    return fragment;
}

Мне нужно, чтобы каждая из моих вкладок вела себя одинаково и использовала одинаковый макет, но мне нужно только отправить им информацию о дате (так же, как в их заголовке), чтобы они могли получать разные данные из базы данных. Я пробовал связки и теги, но это не сработало так, как я ожидал - связки были добавлены все на каждую вкладку, а теги не загружены в часть onCreate() (я думаю?), Поэтому они были пустыми.

1 ответ

В вашем методе newInstance попытайтесь передать соответствующую информацию для каждого фрагмента, который вы создаете, в качестве параметров. Вам просто нужно передать, какая небольшая информация необходима, чтобы фрагмент знал, откуда взять свои данные в вашей базе данных. Затем оттуда создайте пакет (например, mBundle) и поместите все эти значения в этот пакет и вызовите фрагмент.setArguments(mBundle). Затем в вашем фрагменте метод onCreate анализирует этот пакет, чтобы получить ваши данные и перейти оттуда.

Это кажется большим количеством шагов, но этот метод гарантирует, что данные сохраняются во всех событиях жизненного цикла

Пример см. В разделе "Рекомендации по созданию нового фрагмента Android".

Другие вопросы по тегам