我相信大家在网上已经看到很多介绍Activity与Fragment数据交互的问题。但大家都看到都是在Activity.onCreate方法中加载数据,这是初始时加载数据,我相信大家对这个一定很熟悉。我今天讲的这种是Fragment已经加载完后,然后再重新向Fragment内的控件加载数据。
1、先说说适用场合:
比如我想制作一个销售订单的图表,但通常客户要求的不只一个图表,可能会要求LineChart,BarChart,PieChart等等显示出来。如果我们每个图表都用一个Activity,系统显得很复杂,因此,大家会选择用类似TabActivity的方式。但发现TabHost通常情况是放在布局文件的根目录,让其与LinearLayout放在同一级的条件下,我试了N次,就是不行。不知道我是哪里出错,还是怎么的,放在同级条件下怎么都显示不出来。没办法,只能用RadioButton+FragmentPagerAdapter+Fragment的方式解决。
2、FragmentPagerAdapter加载Fragment问题
通常情况下,如果多个Fragment同时放在一个Activity,我们可以通过findViewById(id)的方法找到对应的控件,然后赋值就可以更新Fragment内控件的内容。但如果是通过Adapter加载的多个Fragment,这种方法根本不灵。
经过多次试验,FragmentPagerAdapter加载的Pager,通常只有两个有效,下面以三个Fragment为例:
A:有三个Fragment1,Fragment2,Fragment3。Activity.onCreate启动时加载FragmentPagerAdapter进这三个Fragment,如果当前Page是Fragment1,那么只有Fragment1,Fragment2上的控件存在内存中,如果你取出第三个Fragment(Fragment3),然后读取其上的控件,那么出来的结果都是空,一定抛出异常。
B:当前的Page是Fragment2时,那么只有Fragment2,Fragment3有效,Fragment1内的控件读出来也是空。
C:当前的Page是Fragment3时,只有Fragment2,Fragment3有效,Fragment1内的控件读出来也是空。
结论:
1)当前的页(按Fragment加入ArrayList的顺序)有效时,只有当前页和其后一页内的控件在内存中,其他的Fragment内的控件都会着销毁。
2)当前的页(Fragment)为最后一页时,只有最后一页和倒数第二页内的控件存在内在中。
3、代码实现
三个Fragment,一个Adapter,三个RadioButton构建整个程序,然后更新里面TextView的内容,原代码实现如下:
1)fragment1.xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tvN1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="t1" />
</LinearLayout>
2)fragment2.xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tvN2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="t2" />
</LinearLayout>
3)fragment3.xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tvNM3"
android:layout_width