使用单独的 FragmentPagerAdapter 时在特定片段上重新启动 Activity
Restarting Activity on Specific Fragment, when Using a Separate FragmentPagerAdapter
背景
我有一个使用片段的 android 应用程序。我正在使用一个单独的 FragmentPagerAdapter(即作为一个单独的 class,在 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 的视图(最终目标是让用户在片段 #2 上启动的更改在用户继续到片段 #3 时立即可见。我已经尝试 detach/attach 在 #3 可见时立即对其进行分段,如下所示:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
}
不幸的是,a) 这会降低性能,因为在导航过程中会出现 "stutter"; b)它不能可靠地工作。有些东西(一些按钮的文字)没有刷新,不知道为什么。
无论如何,我发现强制执行 refresh/redraw 的唯一 100% 可靠的方法是重新启动 activity(例如,用户需要通过保存按钮上的 onClickListener按上一个片段,#2)。但这会重新启动片段 #1
上的 Activity
我的问题
考虑到我使用的是单独的 FragmentPagerAdapter,如何在这个特定片段 (#3) 上重新启动 activity?
我研究了其他几个 questions/answers,例如这个:
但是当 FragmentPagerAdapter 位于单独的 class 上时,我如何实现类似的东西(在 intent 调用中添加额外内容)?或者,我还能做些什么来刷新片段视图?
如果您需要额外的信息或代码,请告诉我,我很乐意补充说明。
编辑:
我设法找到了另一种解决方案,到目前为止它似乎按预期工作。我在片段 #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 时如何在特定片段上启动 activity)感兴趣,所以如果你对此有什么想法,我洗耳恭听。
嗯,不是那么简单...
this.recreate();
不仅会重新启动 activity,还会 记住 片段位置。
以防万一其他人需要它,当您使用片段工作时,您需要以这种方式使用它:
首先声明包含相关片段的activity。例如
public class frag1 extends Fragment {
...
Activity mactivity;
@Override
public void onAttach(Activity MainActivity) {
super.onAttach(MainActivity);
mactivity = MainActivity;
}
- 然后用
mactivity.recreate();
代替 getActivity().recreate();
背景
我有一个使用片段的 android 应用程序。我正在使用一个单独的 FragmentPagerAdapter(即作为一个单独的 class,在 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 的视图(最终目标是让用户在片段 #2 上启动的更改在用户继续到片段 #3 时立即可见。我已经尝试 detach/attach 在 #3 可见时立即对其进行分段,如下所示:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
}
不幸的是,a) 这会降低性能,因为在导航过程中会出现 "stutter"; b)它不能可靠地工作。有些东西(一些按钮的文字)没有刷新,不知道为什么。
无论如何,我发现强制执行 refresh/redraw 的唯一 100% 可靠的方法是重新启动 activity(例如,用户需要通过保存按钮上的 onClickListener按上一个片段,#2)。但这会重新启动片段 #1
上的 Activity我的问题
考虑到我使用的是单独的 FragmentPagerAdapter,如何在这个特定片段 (#3) 上重新启动 activity?
我研究了其他几个 questions/answers,例如这个:
但是当 FragmentPagerAdapter 位于单独的 class 上时,我如何实现类似的东西(在 intent 调用中添加额外内容)?或者,我还能做些什么来刷新片段视图?
如果您需要额外的信息或代码,请告诉我,我很乐意补充说明。
编辑:
我设法找到了另一种解决方案,到目前为止它似乎按预期工作。我在片段 #2
frag3 f3 = new frag3();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.fragmentContainer, f3);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
但是,我仍然对我原来的问题(使用单独的 FragmentPagerAdapter 时如何在特定片段上启动 activity)感兴趣,所以如果你对此有什么想法,我洗耳恭听。
嗯,不是那么简单...
this.recreate();
不仅会重新启动 activity,还会 记住 片段位置。
以防万一其他人需要它,当您使用片段工作时,您需要以这种方式使用它:
首先声明包含相关片段的activity。例如
public class frag1 extends Fragment { ... Activity mactivity; @Override public void onAttach(Activity MainActivity) { super.onAttach(MainActivity); mactivity = MainActivity; }
- 然后用
mactivity.recreate();
代替
getActivity().recreate();