我遇到一个Activity,它使用FragmentNotification接口触发ViewPager中片段的命令。一切都运作良好,直到应用程序在后台长时间或方向更改。此时,活动似乎失去了与片段的连接。
我的活动代码:
public class MyActivity extends FragmentActivity implements MyFragment3.FragmentNotification {
SectionsPagerAdapter mSectionsPagerAdapter;
ViewPager mViewPager;
MyFragment1 fragOne = new MyFragment1();
MyFragment2 fragTwo = new MyFragment2();
MyFragment3 fragThree = new MyFragment3();
boolean toggle = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
setContentView(R.layout.activity_main);
// Create the adapter that will return a fragment for each of the three primary sections
// of the app.
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager.setClickable(true);
mViewPager.setCurrentItem(0);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK)) {
if (fragThree != null) {
fragThree.doSomething();
toggle = false;
return false;
} else {
}
}
return super.onKeyDown(keyCode, event);
}
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
Fragment fragment;
if(i==0){
fragment = fragOne;
}else if(i==1){
fragment = fragTwo;
}else{
fragment = fragThree;
}
return fragment;
}
@Override
public int getCount() {
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0: return getString(R.string.title_section1).toUpperCase();
case 1: return getString(R.string.title_section2).toUpperCase();
case 2: return getString(R.string.title_section3).toUpperCase();
}
return null;
}
}
//Receive an event notification from a fragment
// @Override
public void fragmentAction(int actionType) {
if (actionType == MyFragment3.TOGGLE_ACT) {
toggle = true;
}
}
}
我的片段代码:
public class MyFragment3 extends Fragment {
View mView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
...
mView = ....
return rootView;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (FragmentNotification) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
}
}
public void doSomething(){
mView.setVisibility(View.GONE);
...
}
public interface FragmentNotification {
public void fragmentAction(int actionType);
}
}
如前所述,一切都运行良好,直到某些状态发生变化,然后看起来活动失去了对viewpager中存在的片段的引用,即使它正在正确显示,直到按下后退按钮。
我相信我需要通过从Fragment的onSaveInstanceState提供一个包来恢复连接,但不知道如何开始。
非常感谢任何帮助。
谢谢, 约什
答案 0 :(得分:0)
您正在盲目地在数据成员初始值设定项(!)中创建三个片段的实例,即使这些片段已经存在。请记住,Android会在配置更改时重新创建所有现有片段。因此,在配置更改时,将不会使用这些新创建的片段,因为ViewPager
将使用为其重新创建的Android。您可以在instantiateItem()
FragmentPagerAdapter
的实现中看到这一点(源代码在您的SDK中)。
“当我按下BACK时,我希望在寻呼机中使用我的第三个片段做一些特别的事情”这个概念并不是ViewPager
能够很好地支持的。我鼓励你找到一些其他解决方案来解决你试图用这种逻辑解决的任何问题。