在做项目的时候,遇到fragment切换时,每次都重新在网络上加载数据。在网上查了很多相关资料,现总结一下解决办法。
布局文件和QQ主界面类似,布局对应的java类命名为:HomeActivity。
布局代码如下:
<LinearLayout 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:orientation="vertical"
tools:context=".HomeActivity" >
<FrameLayout
android:id="@+id/home_fl"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" >
</FrameLayout>
<ImageView
android:layout_width="match_parent"
android:layout_height="2px"
android:background="#C8C8C8" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="66dp"
android:background="#F7F7F7" >
<RadioGroup
android:id="@+id/home_rg"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_alignParentBottom="true"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/home_rb_one"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:button="@null"
android:checked="true"
android:drawableTop="@drawable/left_selector"
android:gravity="center"
android:scaleX="0.9"
android:scaleY="0.9"
android:text="首页"
android:textColor="@drawable/text_color_selector"
android:textSize="16sp" />
<RadioButton
android:id="@+id/home_rb_two"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:button="@null"
android:drawableTop="@drawable/find_selector"
android:gravity="center"
android:scaleX="0.9"
android:scaleY="0.9"
android:text="发现"
android:textColor="@drawable/text_color_selector"
android:textSize="16sp" />
<RadioButton
android:id="@+id/home_rb_three"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:button="@null"
android:drawableTop="@drawable/choose_selector"
android:gravity="center"
android:scaleX="0.9"
android:scaleY="0.9"
android:text="原创"
android:textColor="@drawable/text_color_selector"
android:textSize="16sp" />
<RadioButton
android:id="@+id/home_rb_four"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:button="@null"
android:drawableTop="@drawable/mine_selector"
android:gravity="center"
android:scaleX="0.9"
android:scaleY="0.9"
android:text="我的"
android:textColor="@drawable/text_color_selector"
android:textSize="16sp" />
</RadioGroup>
</RelativeLayout>
</LinearLayout>
当然framelayout部分要加载4个布局,在这儿就不贴代码了。我将4个布局对应的java类依次命名为:Fragment_Home、Fragment_Two、Fragment_Mine、Fragment_Three。
在HomeActivity中:
// 声明fragment
private Fragment_Home home = new Fragment_Home();
private Fragment_Mine mine = new Fragment_Mine();
private Fragment_Two two = new Fragment_Two();
private Fragment_Three three = new Fragment_Three();
private FragmentManager manager;
private FragmentTransaction transaction;
private Fragment start, end;
//start存放初始界面,end存放点击底部Radiobutton后加载的界面。
// 设置默认显示
manager = getFragmentManager();
transaction = manager.beginTransaction();
home = new Fragment_Home();
transaction.replace(R.id.home_fl, home);
transaction.commit();
start = home;
end = null;
然后对主界面中的radiogroup设置监听,使得点击时加载不同的界面到framelayout,代码如下:
// 对radiogroup设置监听
home_rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// TODO Auto-generated method stub
manager = getFragmentManager();
transaction = manager.beginTransaction();
switch (checkedId) {
case R.id.home_rb_one:
end = home;
if (start != end) {
if (!end.isAdded()) {
transaction.hide(start).add(R.id.home_fl, end);
} else {
transaction.hide(start).show(end);
}
start = end;
}
break;
case R.id.home_rb_two:
end = two;
if (start != end) {
if (!end.isAdded()) {
transaction.hide(start).add(R.id.home_fl, end);
} else {
transaction.hide(start).show(end);
}
start = end;
}
break;
case R.id.home_rb_three:
end = three;
if (start != end) {
if (!end.isAdded()) {
transaction.hide(start).add(R.id.home_fl, end);
} else {
transaction.hide(start).show(end);
}
start = end;
}
break;
case R.id.home_rb_four:
end = mine;
if (start != end) {
if (!end.isAdded()) {
transaction.hide(start).add(R.id.home_fl, end);
} else {
transaction.hide(start).show(end);
}
start = end;
}
break;
}
transaction.commit();
}
});
这样,当fragment中要从网络中获取数据时,点击切换fragment,数据将不会重新加载。代码有重复部分,可以封装成一个方法进行调用。