您的位置:首页 > 其它

使ViewPager中的Fragment的状态不销毁

2014-11-02 12:03 211 查看
//有如下5个类似的Fragment: TabAFm,TabBFm,TabCFm,TabDFm,TabEFm,

//TabBFm

tab_a
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#C4E1FF"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="hello FragmentA!!!"
android:textSize="40sp"
android:textColor="#000000"
/>
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>


TabAFm.java

public class TabAFm extends Fragment{

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

return inflater.inflate(R.layout.tab_a, container, false);
}

}


//TabBFm

public class TabBFm extends Fragment{

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.tab_b, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);

this.getView().findViewById(R.id.clickme).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 获得绑定的FragmentActivity
MainActivity activity = ((MainActivity)getActivity());
// 获得TabAFm的控件
EditText editText = (EditText) activity.fragments.get(0).getView().findViewById(R.id.edit);

Toast.makeText(activity, activity.hello + editText.getText(), Toast.LENGTH_SHORT).show();
}
});
}
}


//FragmentViewPagerAdapter.java

public class FragmentViewPagerAdapter extends PagerAdapter implements ViewPager.OnPageChangeListener{

private List<Fragment> fragments; // 每个Fragment对应一个Page
private FragmentManager fragmentManager;
private ViewPager viewPager; // viewPager对象
private int currentPageIndex = 0; // 当前page索引(切换之前)

private OnExtraPageChangeListener onExtraPageChangeListener; // ViewPager切换页面时的额外功能添加接口

public FragmentViewPagerAdapter(FragmentManager fragmentManager, ViewPager viewPager , List<Fragment> fragments) {
this.fragments = fragments;
this.fragmentManager = fragmentManager;
this.viewPager = viewPager;
this.viewPager.setAdapter(this);
this.viewPager.setOnPageChangeListener(this);
}

@Override
public int getCount() {
return fragments.size();
}

@Override
public boolean isViewFromObject(View view, Object o) {
return view == o;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(fragments.get(position).getView()); // 移出viewpager两边之外的page布局
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = fragments.get(position);
if(!fragment.isAdded()){ // 如果fragment还没有added
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.add(fragment, fragment.getClass().getSimpleName());
ft.commit();
/**
* 在用FragmentTransaction.commit()方法提交FragmentTransaction对象后
* 会在进程的主线程中,用异步的方式来执行。
* 如果想要立即执行这个等待中的操作,就要调用这个方法(只能在主线程中调用)。
* 要注意的是,所有的回调和相关的行为都会在这个调用中被执行完成,因此要仔细确认这个方法的调用位置。
*/
fragmentManager.executePendingTransactions();
}

if(fragment.getView().getParent() == null){
container.addView(fragment.getView()); // 为viewpager增加布局
}

return fragment.getView();
}

/**
* 当前page索引(切换之前)
* @return
*/
public int getCurrentPageIndex() {
return currentPageIndex;
}

public OnExtraPageChangeListener getOnExtraPageChangeListener() {
return onExtraPageChangeListener;
}

/**
* 设置页面切换额外功能监听器
* @param onExtraPageChangeListener
*/
public void setOnExtraPageChangeListener(OnExtraPageChangeListener onExtraPageChangeListener) {
this.onExtraPageChangeListener = onExtraPageChangeListener;
}

@Override
public void onPageScrolled(int i, float v, int i2) {
if(null != onExtraPageChangeListener){ // 如果设置了额外功能接口
onExtraPageChangeListener.onExtraPageScrolled(i, v, i2);
}
}

@Override
public void onPageSelected(int i) {
fragments.get(currentPageIndex).onPause(); // 调用切换前Fargment的onPause()
if(fragments.get(i).isAdded()){
fragments.get(i).onResume(); // 调用切换后Fargment的onResume()
}
currentPageIndex = i;

if(null != onExtraPageChangeListener){ // 如果设置了额外功能接口
onExtraPageChangeListener.onExtraPageSelected(i);
}

}

@Override
public void onPageScrollStateChanged(int i) {
if(null != onExtraPageChangeListener){ // 如果设置了额外功能接口
onExtraPageChangeListener.onExtraPageScrollStateChanged(i);
}
}

/**
* page切换额外功能接口
*/
static class OnExtraPageChangeListener{
public void onExtraPageScrolled(int i, float v, int i2){}
public void onExtraPageSelected(int i){}
public void onExtraPageScrollStateChanged(int i){}
}

}
//MainActivity.java

public class MainActivity extends FragmentActivity {
private ViewPager viewPager;
public List<Fragment> fragments = new ArrayList<Fragment>();
public String hello = "hello ";

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

fragments.add(new TabAFm());
fragments.add(new TabBFm());
fragments.add(new TabCFm());
fragments.add(new TabDFm());
fragments.add(new TabEFm());

viewPager = (ViewPager) findViewById(R.id.viewPager);
FragmentViewPagerAdapter adapter = new FragmentViewPagerAdapter(this.getSupportFragmentManager(), viewPager,fragments);

adapter.setOnExtraPageChangeListener(new FragmentViewPagerAdapter.OnExtraPageChangeListener(){
@Override
public void onExtraPageSelected(int i) {
System.out.println("Extra...i: " + i);
}
});

}
//Android FragmentManage FragmentTransaction介绍

/article/1361199.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: