【问题标题】:Sending data to tabs in TabLayout Android将数据发送到 TabLayout Android 中的选项卡
【发布时间】:2018-11-27 21:36:31
【问题描述】:

我有一个带有 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() 部分(我认为?),所以它们是空的。

【问题讨论】:

    标签: android android-fragments bundle android-adapter android-tablayout


    【解决方案1】:

    在您的 newInstance 方法中,尝试将您正在创建的每个片段的相关信息作为参数传递。您只需要传递必要的少量信息,以便片段知道从数据库中的何处获取数据。然后从那里创建一个包(例如mBundle)并将所有这些值放入该包并调用fragment.setArguments(mBundle)。然后在您的片段 onCreate 方法中解析该捆绑包以获取您的数据并从那里开始。

    看起来有很多步骤,但这种方法确保数据在所有生命周期事件中持续存在

    例子见Best practice for instantiating a new Android Fragment

    【讨论】:

    • 谢谢,但问题是,即使是以某种方式标记这些数据,基于选项卡,我仍然不知道如何在片段中获取正确的值,例如。如果我的包是 ("1", "12/12") - 1 表示它属于第一个选项卡,那么在选项卡内我无法检查当前正在运行的选项卡。
    • @gariaable 如果您想查看当前可见的片段,您可能需要查看覆盖 setuservisiblehint:developer.android.com/reference/android/support/v4/app/…
    • 我认为它仍然不是我所需要的,因为我正在创建同一个片段的 7 个实例,所以如果我要添加一个代码来检查给定片段是否对用户可见,它将总是返回真..?我唯一需要做的就是以某种方式阅读当前显示的选项卡标题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    相关资源
    最近更新 更多