1

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);

  }

}

前述のように、何らかの状態が変化するまではすべて正常に機能し、戻るボタンが押されるまでは正しく表示されていても、ビューページャーに存在するフラグメントへの参照がアクティビティから失われたように見えます。

Fragment の onSaveInstanceState からバンドルを提供して接続を復元する必要があると思いますが、開始方法がわかりません。

どんな助けでも大歓迎です。

ありがとう、ジョシュ

4

1 に答える 1

0

これらのフラグメントが既に存在する場合でも、データ メンバー初期化子 (!) で 3 つのフラグメントのインスタンスをやみくもに作成しています。Android は、構成の変更時に既存のフラグメントをすべて再作成することに注意してください。したがって、設定を変更すると、ViewPagerAndroid が再作成したフラグメントが使用されるため、これらの新しく作成されたフラグメントは使用されません。instantiateItem()これはinの実装で確認できますFragmentPagerAdapter(ソース コードは SDK にあります)。

「戻るを押すと、ページャーの 3 番目のフラグメントで何か特別なことをしたい」という概念は、ViewPagerすべてをうまくサポートするものではありません。そのロジックで解決しようとしている問題が何であれ、他の解決策を見つけることをお勧めします。

于 2012-09-11T16:06:25.733 に答える