最初我在MainActivity
课程中加载了一个片段。
的onCreate
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(new TimeTableFragment(), TIMETABLEFRAGMENT_TAG)
.commit();
}
并在
的onResume
if(*setting has changed*){
TimeTableFragment tf = (TimeTableFragment) getSupportFragmentManager()
.findFragmentByTag(TIMETABLEFRAGMENT_TAG);
if (null != tf) {
tf.onStudentIdChanged();
}
}
onStudentIdChanged()
方法会在首选项设置发生变化时刷新片段数据。
我现在已经重构了此活动以使用FragmentPagerAdapter
并在标签中加载两个不同的片段。两个片段都是相同TimetableFragment
类的实例,但在创建时传递了不同的参数。
FragmentPagerAdapter方法
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a Fragment
switch (position) {
case 1:
case 2:
return TimeTableFragment.newInstance(position);
case 0:
//todo add the single day here
return TimeTableFragment.newInstance(position);
}
return null;
}
TimetableFragment Method
public static TimeTableFragment newInstance(int sectionNumber) {
TimeTableFragment fragment = new TimeTableFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
现在这个工作正常,我onResume
的{{1}}我无法再使用MainActivity
访问片段,因为在{{1}期间不会以这种方式添加它们我无法再调用findFragmentByTag
方法。
如何为所有创建的时间表片段实例调用此方法并更新/刷新数据?
答案 0 :(得分:1)
在FragmentPagerAdapter
展示中,添加private SparseArray<Fragment> mFragments = new SparseArray<Fragment>();
修改你的getItem方法,如下所示:
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a Fragment
Fragment fragment = null;
switch (position) {
case 1:
case 2:
fragment = mFragments.get(position);
if (fragment == null) {
fragment = TimeTableFragment.newInstance(position);
mFragments.append(position, fragment)
}
break;
case 0:
//todo add the single day here
fragment = mFragments.get(position);
if (fragment == null) {
fragment = TimeTableFragment.newInstance(position);
mFragments.append(position, fragment)
}
break;
}
return fragment;
}
现在你可以按位置获取片段的实例。