您的位置:首页 > 移动开发 > Android开发

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

2014-07-06 01:34 645 查看
一组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状态还是不能保存的请留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐