解决RadioButton+FragmentPagerAdapter+Fragment切换页面数据加载的问题

我相信大家在网上已经看到很多介绍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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Python的tkinter中使用RadioButton切换页面,你可以使用Frame来创建不同的页面,并在RadioButton的回调函数中切换这些页面。面是一个简单的示例代码: ```python import tkinter as tk class App(tk.Tk): def __init__(self): super().__init__() self.title("RadioButton切换页面") # 创建两个页面的Frame self.page1 = tk.Frame(self) self.page2 = tk.Frame(self) # 创建RadioButton用于切换页面 self.radio_var = tk.StringVar() self.radio_var.set("page1") # 设置默认选中的页面 page1_radio = tk.Radiobutton(self, text="Page 1", variable=self.radio_var, value="page1", command=self.switch_page) page2_radio = tk.Radiobutton(self, text="Page 2", variable=self.radio_var, value="page2", command=self.switch_page) # 添RadioButton到界面 page1_radio.pack() page2_radio.pack() # 显示默认选中的页面 self.page1.pack() def switch_page(self): # 隐藏所有页面 self.page1.pack_forget() self.page2.pack_forget() # 根据选中的RadioButton值显示相应页面 if self.radio_var.get() == "page1": self.page1.pack() elif self.radio_var.get() == "page2": self.page2.pack() app = App() app.mainloop() ``` 在这个示例中,我们创建了一个继承自`tkinter.Tk`的`App`类。在`App`类的构造函数中,我们首先创建了两个页面的Frame,然后创建了两个RadioButton用于切换页面。每个RadioButton都绑定了一个回调函数`switch_page`,用于在选中时切换页面。 在`switch_page`函数中,我们使用`pack_forget`方法隐藏所有页面,然后根据选中的RadioButton值,使用`pack`方法显示相应的页面。 你可以根据自己的需求修改页面的内容和布局。希望这能帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值