使用单独的FragmentPagerAdapter

时间:2018-09-01 17:19:41

标签: java android android-fragments android-activity android-fragmentactivity

背景
我有一个使用片段的Android应用程序。我正在使用单独的FragmentPagerAdapter(即在MainActivity之外作为单独的类)。

MainActivity.java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.MainActivity);

    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);
    tabLayout.setupWithViewPager(mViewPager);

}

SectionsPagerAdapter.java

public SectionsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            return new frag1();
        case 1:
            return new frag2();
        case 2:
            return new frag3();
        case 3:
            return new frag4();
        case 4:
            return new frag5();
        default:
            return null;
    }
}

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

@Override
public CharSequence getPageTitle(int position) {
    switch (position) {
        case 0:
            return "Name1";
        case 1:
            return "Name2";
        case 2:
            return "Name3";
        case 3:
            return "Name4";
        case 4:
            return "Name5";
    }
    return null;
}

问题
我需要从片段2中刷新片段3的视图(最终目标是,用户进入片段3后,用户在片段2上发起的更改就可以看到。试图在片段#3可见时立即分离/附加片段本身,例如:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        getFragmentManager().beginTransaction().detach(this).attach(this).commit();
    }

不幸的是,a)这会影响性能,因为在导航过程中会出现“停顿”现象; b)它不能可靠地工作。某些内容(某些按钮的文本)没有刷新,由于某些原因我无法弄清楚。

无论如何,我发现强制刷新/重新绘制的唯一100%可靠的方法是重新启动活动(例如,通过用户需要在上一个片段#2上按下的“保存”按钮上的onClickListener) )。但这会重新启动片段#1上的活动

我的问题
考虑到我正在使用单独的FragmentPagerAdapter的事实,如何在该特定片段(#3)上重新启动活动?

我研究了其他几个问题/答案,例如:https://stackoverflow.com/a/36064344
但是当FragmentPagerAdapter位于单独的类上时,如何实现类似的内容(在意向调用中添加其他内容)?另外,还有其他方法可以刷新片段视图吗?

如果您需要其他信息或代码,请告诉我,我们很高兴提供澄清。

编辑: 我设法找到了到目前为止似乎可以按预期工作的另一种解决方案。我在片段2的“保存”按钮的onClickListener上添加了以下代码

    frag3 f3 = new frag3();
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragmentContainer, f3);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.commit();

但是,我仍然对我的原始问题(在使用单独的FragmentPagerAdapter时如何在特定片段上启动活动)感兴趣,所以,如果您对此有任何想法,所有的耳朵。

1 个答案:

答案 0 :(得分:0)

不是那么简单...
this.recreate();不仅重新启动了活动,而且还记住了片段位置。

以防万一有人需要它,当您处理片段时,您需要以这种方式使用它:

  • 首先声明包含所讨论片段的活动。例如

    public class frag1 extends Fragment {
    ...
    Activity mactivity;
    
    @Override
    public void onAttach(Activity MainActivity) {
        super.onAttach(MainActivity);
        mactivity = MainActivity; 
    }
    
  • 然后使用getActivity().recreate();代替mactivity.recreate();