使用单独的FragmentPagerAdapter时,在特定片段上重新启动活动

问题描述 投票:0回答:1

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

main activity.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);

}

sections pager adapter.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上发起的更改可见。我试图分离/ attach片段#3本身一旦可见,就像这样:

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

不幸的是,a)这在性能上有所下降,因为导航过程中存在“口吃”; b)它不能可靠地工作。有些东西(某些按钮的文本)没有刷新,由于某种原因我无法弄清楚。

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

我的问题 考虑到我正在使用单独的FragmentPagerAdapter,我怎样才能重新启动这个特定片段(#3)的活动?

我研究了其他几个问题/答案,例如:https://stackoverflow.com/a/36064344 但是当FragmentPagerAdapter在一个单独的类上时,我怎么能实现这样的东西(在intent调用上添加额外的东西)?或者,我还能做些什么来刷新片段视图?

如果您需要额外的信息或代码,请告诉我,我很乐意添加说明。 编辑:我设法找到另一个解决方案,到目前为止似乎按预期工作。我在片段#2上的Save按钮的onClickListener上添加了以下代码

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

但是,我仍然对我最初的问题感兴趣(如何在使用单独的FragmentPagerAdapter时启动特定片段的活动),所以如果您对此有任何想法,我会全力以赴。

java android android-fragments android-activity android-fragmentactivity
1个回答
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();
© www.soinside.com 2019 - 2024. All rights reserved.