2013-10-31 3 views
0

전제 조건 : ViewPager를 사용하지 말고, 스위치 탭 이후에 조각 상태를 저장하십시오. 문제가 생기면 먼저 fragmentOne을 초기화하고, button2를 체크 한 다음, fragments2를 생성하고, button3을 확인한 다음 fragmentThree를 생성합니다. 나는 메모리에 세 조각을 만들고, 이제 button2 또는 button1을 누르기를 원하지만, 그 페이지는 아직 fragment3입니다. 이유를 찾을 수없는 이유는 무엇입니까? 여기 코드입니다, 감사합니다! 프래그먼트가 파괴되지 않은 경우FragmentPagerAdapter를 사용하여 조각 상태를 저장하는 방법?

package com.example.FragmentSaveStatus; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.app.FragmentTransaction; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.*; 

public class MyActivity extends FragmentActivity{ 
    private FragmentManager mFragmentManager; 
    private FragmentTransaction mCurTransaction; 
    private FrameLayout mContainer; 
    private Fragment mCurrentPrimaryItem; 
    private RadioButton mButtonOne, mButtonTwo, mButtonThree; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     initViews(); 
    } 

    private void initViews() { 
     mContainer = (FrameLayout) findViewById(R.id.container); 
     mButtonOne = (RadioButton) findViewById(R.id.radio_button0); 
     mButtonTwo = (RadioButton) findViewById(R.id.radio_button1); 
     mButtonThree = (RadioButton) findViewById(R.id.radio_button2); 
     mFragmentManager = getSupportFragmentManager(); 
     Fragment fragment = (Fragment) mPagerAdapter.instantiateItem(mContainer, mButtonOne.getId()); 
     mPagerAdapter.setPrimaryItem(mContainer, mButtonOne.getId(), fragment); 
     mPagerAdapter.finishUpdate(mContainer); 
     mButtonOne.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked) { 
        Fragment fragment = (Fragment) mPagerAdapter.instantiateItem(mContainer, buttonView.getId()); 
        Toast.makeText(MyActivity.this, "one:"+buttonView.getId() +" "+fragment.getClass().getName(), Toast.LENGTH_SHORT).show(); 
        mPagerAdapter.setPrimaryItem(mContainer, buttonView.getId(), fragment); 
        mPagerAdapter.finishUpdate(mContainer); 
       } 
      } 
     }); 

     mButtonTwo.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked) { 
        Fragment fragment = (Fragment) mPagerAdapter.instantiateItem(mContainer, buttonView.getId()); 
        Toast.makeText(MyActivity.this, "two:"+buttonView.getId() +" "+fragment.getClass().getName(), Toast.LENGTH_SHORT).show(); 
        mPagerAdapter.setPrimaryItem(mContainer, buttonView.getId(), fragment); 
        mPagerAdapter.finishUpdate(mContainer); 
       } 
      } 
     }); 

     mButtonThree.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked) { 
        Fragment fragment = (Fragment) mPagerAdapter.instantiateItem(mContainer, buttonView.getId()); 
        Toast.makeText(MyActivity.this, "three:"+buttonView.getId() +" "+fragment.getClass().getName(), Toast.LENGTH_SHORT).show(); 
        mPagerAdapter.setPrimaryItem(mContainer, buttonView.getId(), fragment); 
        mPagerAdapter.finishUpdate(mContainer); 
       } 
      } 
     }); 
    } 


    private FragmentPagerAdapter mPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) { 
     @Override 
     public Fragment getItem(int i) { 
      switch (i) { 
       case R.id.radio_button0: 
        return new FragmentOne(); 
       case R.id.radio_button1: 
        return new FragmentTwo(); 
       case R.id.radio_button2: 
        return new FragmentThree(); 
       default: 
        return new FragmentOne(); 
      } 
     } 

     @Override 
     public int getCount() { 
      return 3; 
     } 

     @Override 
     public Object instantiateItem(ViewGroup container, int position) { 
      if (mCurTransaction == null) { 
       mCurTransaction = mFragmentManager.beginTransaction(); 
      } 

      //Do we already have thei fragment 
      String name = makeFragmentName(container.getId(), position); 
      Fragment fragment = mFragmentManager.findFragmentByTag(name); 
      if (fragment != null) { 
       mCurTransaction.attach(fragment); 
      } else { 
       fragment = getItem(position); 
       mCurTransaction.add(container.getId(), fragment, 
         makeFragmentName(container.getId(), position)); 
      } 

      if (fragment != mCurrentPrimaryItem) { 
       fragment.setMenuVisibility(false); 
       fragment.setUserVisibleHint(false); 
      } 
      return fragment; 
     } 

     @Override 
     public void setPrimaryItem(ViewGroup container, int position, Object object) { 
      Fragment fragment = (Fragment)object; 
      if (fragment != mCurrentPrimaryItem) { 
       if (mCurrentPrimaryItem != null) { 
         mCurrentPrimaryItem.setMenuVisibility(false); 
         mCurrentPrimaryItem.setUserVisibleHint(false); 
       } 

       if (fragment != null) { 
        fragment.setMenuVisibility(true); 
        fragment.setUserVisibleHint(true); 
       } 

       mCurrentPrimaryItem = fragment; 
      } 
     } 

     @Override 
     public void destroyItem(ViewGroup container, int position, Object object) { 
      if (mCurTransaction == null) { 
       mCurTransaction = mFragmentManager.beginTransaction(); 
      } 
      Log.v("fragment", "detach item #"+getItemId(position)+ ": f="+object 
       + " v="+((Fragment)object).getView()); 
      mCurTransaction.detach((Fragment)object); 
     } 

     @Override 
     public void finishUpdate(ViewGroup container) { 
      if (mCurTransaction != null) { 
       mCurTransaction.commitAllowingStateLoss(); 
       mCurTransaction = null; 
       mFragmentManager.executePendingTransactions(); 
      } 
     } 
    }; 


    private static String makeFragmentName(int viewId, int index) { 
     return "android:switcher:" + viewId + ":" + index; 
    } 

} 

답변

0

이 예에서는 작동

private int pageID; 

@Override 
public void onPause() { 
super.onPause(); 
pageID = mViewPager.getCurrentItem(); // 1 save 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

mViewPager.setCurrentItem(pageID, false); // 2 load 

} 
관련 문제