【Android开发日记】Fragment切换如何保存状态?Viewpager简单搞定

一组Fragment切换,最简单的就是一组按钮,绑定点击监听事件:

	private FragmentManager mFM = null;
		
		mBt1 = (ImageView) findViewById(R.id.tab_bt_1);
		mBt2 = (ImageView) findViewById(R.id.tab_bt_2);
		mBt3 = (ImageView) findViewById(R.id.tab_bt_3);
		mBt4 = (ImageView) findViewById(R.id.tab_bt_4);

		mBt1.setOnClickListener(this);
		mBt2.setOnClickListener(this);
		mBt3.setOnClickListener(this);
		mBt4.setOnClickListener(this);
		
		public void onClick(View v) {
			switch (v.getId()) {
				case R.id.tab_bt_1:
					if (null == mFM)
						mFM = getSupportFragmentManager();
					FragmentTransaction ft = mFM.beginTransaction();
					FragmentA f0 = new FragmentA();
					ft.replace(R.id.content_container, f0);
					ft.commit();
					beak;
				...
			}
		}

但是replace方法 会重新布局一个fragment,之前在这个fragment上的操作就丢失了。

今天在网上试探各种方法总结一下:

1.用add,然后用hide()和show()控制哪个fragment呈现出来.......我实验没成功....

2.http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0313/1591.html

3.http://www.cnblogs.com/over140/p/3362047.html

4.http://www.cnblogs.com/manuosex/p/3587577.html


最后我还是使用了viewpager,自定义viewpager禁止滑屏

代码1:mainactivity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#F5F5F5" >
    
    <com.ttdevs.lcb.CustomViewPager     <!-- 自定义的ViewPager-->
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
	
	<RelativeLayout
		.../>
		<ImageView...                   <!-- 一组按钮-->
		<ImageView...
		<ImageView...
		<ImageView...
	</RelativeLayout>	
</RelativeLayout>

其中CustomViewPager为自己定义的viewpager,com.ttdevs.lcb是包名

代码2:CustomViewPager.java

package com.ttdevs.lcb;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

public class CustomViewPager extends ViewPager {
    private boolean enabled;
    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.enabled = false;
    }

//触摸没有反应就可以了
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (this.enabled) {
            return super.onTouchEvent(event);
        }
  
        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (this.enabled) {
            return super.onInterceptTouchEvent(event);
        }
 
        return false;
    }
 
    public void setPagingEnabled(boolean enabled) {
        this.enabled = enabled;
    }
}

代码3:MainActivity.java

public class MainActivity extends FragmentActivity implements OnClickListener {

	public static final int TAB_Mainpage = 0;
	public static final int TAB_Msg = 1;
	public static final int TAB_Search = 2;
	public static final int TAB_Me = 3;
	
	private ViewPager viewPager;
	private ImageView mBt1, mBt2, mBt3, mBt4;
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.mainactivity);
		
        initView();
	}

	private void initView() {
		viewPager = (ViewPager) findViewById(R.id.viewpager);
		
		mBt1 = (ImageView) findViewById(R.id.tab_bt_1);
		mBt2 = (ImageView) findViewById(R.id.tab_bt_2);
		mBt3 = (ImageView) findViewById(R.id.tab_bt_3);
		mBt4 = (ImageView) findViewById(R.id.tab_bt_4);

		mBt1.setOnClickListener(this);
		mBt2.setOnClickListener(this);
		mBt3.setOnClickListener(this);
		mBt4.setOnClickListener(this);

		FragmentAdapter adapter = new FragmentAdapter(
				getSupportFragmentManager());
		viewPager.setAdapter(adapter);
		viewPager.setOffscreenPageLimit(4);  
		//注意,几个Fragment参数就写几个,否则还是不能保存状态
	}
	

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.tab_bt_1:
			
			viewPager.setCurrentItem(TAB_Mainpage);
			
			break;
		case R.id.tab_bt_2:
			
			
			viewPager.setCurrentItem(TAB_Msg);
			break;
		case R.id.tab_bt_3:
			
			viewPager.setCurrentItem(TAB_Search);

			break;
		case R.id.tab_bt_4:
			
			
			viewPager.setCurrentItem(TAB_Me);
			break;

		default:
			break;
		}		
	}
	
}
其中这句

viewPager.setOffscreenPageLimit(4);  

你一定不会忘了,我就忘了。然后结果是1,2切换没问题,1,3  1,4  2,3  2,4 切换就发现1的状态又丢失了。这个方法是设置缓冲区fragment页面个数的。。

代码4:FragmentAdapter.java

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class FragmentAdapter extends FragmentPagerAdapter{
	public final static int TAB_COUNT = 4;
	public FragmentAdapter(FragmentManager fm) {
		super(fm);
	}

	@Override
	public Fragment getItem(int id) {
		switch (id) {
		case MainActivity.TAB_Mainpage:
			MainpageFra f0 = new MainpageFra();
			return f0;
		case MainActivity.TAB_Msg:
			Home2Fra f1 = new Home2Fra();
			return f1;
		case MainActivity.TAB_Search:
			Home3Fra f2 = new Home3Fra();
			return f2;
		case MainActivity.TAB_Me:
			SettingFra f3 = new SettingFra();
			return f3;
		}
		return null;
	}

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

MainpageFra.java 、Home2Fra.java、Home3Fra.java、SettingFra.java就是一般的Fragment,这里不再列出了。

如果照上面的代码fragment状态还是不能保存的请留言。



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值