1

我在使用 FragmentNotification 接口向 ViewPager 中的片段触发命令的 Activity 时遇到问题。一切正常,直到应用程序长时间处于后台或方向发生变化。此时,Activity 似乎与 Fragment 失去了联系。

我的活动代码:

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 提供一个包来恢复连接,但不知道如何开始。

任何帮助将不胜感激。

谢谢,乔什

4

1 回答 1

0

您在数据成员初始化程序 (!) 中盲目地创建三个片段的实例,即使这些片段已经存在。请记住,Android 会在配置更改时重新创建所有现有片段。因此,在配置更改时,这些新创建的片段都不会被使用,因为它们ViewPager将使用 Android 为其重新创建的片段。您可以在 in 的实现中看到这一点instantiateItem()FragmentPagerAdapter源代码在您的 SDK 中)。

“当按下 BACK 时,我想用寻呼机中的第三个片段做一些特别的事情”的概念并不能ViewPager很好地支持所有这些。我会鼓励你找到一些其他的解决方案来解决你试图用这种逻辑解决的任何问题。

于 2012-09-11T16:06:25.733 回答