使用FragmentPagerAdapter从活动调用Fragment方法

时间:2016-08-11 16:47:04

标签: android android-fragments

最初我在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方法。

如何为所有创建的时间表片段实例调用此方法并更新/刷新数据?

1 个答案:

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

现在你可以按位置获取片段的实例。