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