Fragment是Android3.0后增加的新控件,有点类似于Activity组件,也是用来承载各种View元素。Google增加这个 玩意的目的是为了平板电脑里面可以复用部分显示的View,只要写好一个View,可以同时在手机和平板等不同尺寸的设备上使用。而且这个转换过程系统帮 你搞定了。下面我们分类说说Fragment的使用。1、为何使用Fragment   下面是Android官网为了说明Fragment作用的例子:一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕 右侧使用另一个fragment来展示一篇文章--2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己 的一套生命周期回调方法,并且处理它们自己的用户输入事件。 因此, 取代使用一个activity来选择一篇文章而另一个activity来阅读文章的方式,用户可以在同一个activity中选择一篇文章并且阅读, 如图所示:

  当运行在一个特别大的屏幕时(例如平板电脑),应用可以在Activity
A中嵌入2个fragment。但是如果在一个正常尺寸的屏幕(例如手机)上,没有足够的空间同时供2个fragment用, 因此, Activity
A会仅包含文章列表的fragment, 而当用户选择一篇文章时, 它会启动ActivityB,它包含阅读文章的fragment.因此,
应用可以同时支持上图中的2种设计模式。
  fragment是一个为了界面视图可以重用的组件,因为fragment定义了它自己
的布局, 以及通过使用它自己的生命周期回调方法定义了它自己的行为,你可以将fragment包含到多个activity中. 这点特别重要,
因为这允许你将你的用户体验适配到不同的屏幕尺寸.举个例子,你可能会仅当在屏幕尺寸足够大时,在一个activity中包含多个fragment,并
且,当不属于这种情况时,会启动另一个单独的,使用不同fragment的activity。

2、创建Fragment
  要创建一个Fragment, 必须创建一个 Fragment 的子类
(或者继承自一个已存在的它的子类)。Fragment类的代码看起来很像 Activity 。它包含了和activity类似的回调方法,
例如onCreate()、 onStart()、onPause()以及 onStop()。事实上,
如果你准备将一个现成的Android应用转换到使用fragment,可能只需简单的将代码从你的activity的回调方法分别移动到你的
fragment的回调方法即可。
  下面我们看看Fragment的子类有哪些:

  • DialogFragment 显示一
    个浮动的对话框。用这个类来创建一个对话框,是使用在Activity类的对话框工具方法之外的一个好的选择,
    因为你可以将一个fragment对话框合并到activity管理的fragment back
    stack中,允许用户返回到一个之前曾被摒弃的fragment。
  • ListFragment 显示一个由一个adapter(例如 SimpleCursorAdapter)管理的项目的列表, 类似于ListActivity。 它提供一些方法来管理一个list view, 例如onListItemClick()回调来处理点击事件。
  • PreferenceFragment 显示一个 Preference对象的层次结构的列表, 类似于PreferenceActivity。 这在为你的应用创建一个"设置"activity时有用处。

3、Fragment生命周期
下面是Fragment的生命周期图,摘自Android官网。

继承了Fragment相关类之后,我们需要重写几个回调函数,实现相关功能,下面面3个函数是我们一般都会重写的回调方法:

  1. //Edited by mythou
  2. //http://www.cnblogs.com/mythou/
  3. public class MainFragment extends Fragment
  4. {
  5. //创建Fragment
  6. public void onCreate()
  7. {}
  8. //返回View给Activity使用
  9. public View onCreateView()
  10. {}
  11. public void onPause()
  12. {}
  13. }

复制代码

  • onCreate() 当创建fragment时, 系统调用该方法. 在实现代码中,应当初始化想要在fragment中保持的必要组件, 当fragment被暂停或者停止后可以恢复。
  • onCreateView() fragment第一次绘制它的用户界面的时候, 系统会调用此方法. 为了绘制fragment的UI,此方法必须返回一个View, 这个view是你的fragment布局的根view. 如果fragment不提供UI, 可以返回null。
  • onPause() 用户将要离开fragment时,系统调用这个方法作为第一个指示(然而它不总是意味着fragment将被销毁)。 在当前用户会话结束之前,通常应当在这里提交任何应该持久化的变化(因为用户有可能不会返回)。

除了这些,对比上面的生命周期,还可以看到其他的回调方法。我们可以根据需要重写相关方法。

4、创建Fragment
  fragment通常用来作为一个activity的用户界面的一部分,并将它的
layout提供给activity。为了给一个fragment提供一 个layout,你必须实现 onCreateView()回调方法,
当到了fragment绘制它自己的layout的时候,Android系统调用它。你的此方法的实现代码必须返回一个你的fragment的
layout的根view。
     另外,如果你的fragment是ListFragment的子类,它的默认实现是返回从onCreateView()返回一个ListView,所以一般情况下不必实现它。
     从onCreateView()返回的View, 也可以从一个layout的xml资源文件中读取并生成。为了帮助你这么做, onCreateView() 提供了一个LayoutInflater 对象。

下面看个例子,从XML加载视图View,跟我们一般的View里面动态加载解析XML生成View一样。

  1. //Edited by mythou
  2. //http://www.cnblogs.com/mythou/
  3. public static class ExampleFragment extends Fragment {
  4. @Override
  5. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  6. Bundle savedInstanceState) {
  7. // Inflate the layout for this fragment
  8. return inflater.inflate(R.layout.example_fragment, container, false);
  9. }
  10. }

复制代码

 
 传入onCreateView()的container参数是你的fragmentlayout将被插入的父ViewGroup(来自activity
的layout)  savedInstanceState 参数是一个Bundle,
如果fragment是被恢复的,它提供关于fragment的之前的实例的数据,inflate() 方法有3个参数:

  • RSID:想要加载的layout的resource ID。
  • container:加载的layout的父ViewGroup. 传入container是很重要的, 目的是为了让系统接受所要加载的layout的根view的layout参数, 由它将挂靠的父view指定。

  • 尔量:指示在加载期间, 展开的layout是否应当附着到ViewGroup(第二个参数)  (在这个例子中, 指定了false,
    因为系统已经把展开的layout插入到container –传入true会在最后的layout中创建一个多余的view group)

5、把Fragment添加到Activity
  通常地, fragment为宿主activity提供UI的一部分, 被作为activity的整个viewhierarchy的一部分被嵌入, 有2种方法你可以添加一个fragment到activity layout:

在activity的layout文件中声明fragment:
在这种情况下,你可以像为View一样, 为fragment指定layout属性.例子是一个有2个fragment的activity的layout:

  1. //Edited by mythou
  2. //http://www.cnblogs.com/mythou/
  3. <linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:orientation="horizontal"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent">
  7. <fragment android:name="com.example.news.ArticleListFragment"
  8. android:id="@+id/list"
  9. android:layout_weight="1"
  10. android:layout_width="0dp"
  11. android:layout_height="match_parent" />
  12. <fragment android:name="com.example.news.ArticleReaderFragment"
  13. android:id="@+id/viewer"
  14. android:layout_weight="2"
  15. android:layout_width="0dp"
  16. android:layout_height="match_parent" />

复制代码

 
  中的 android:name属性指定了在layout中实例化的Fragment类。当系统创建这个activity
layout时,它实例化每一个在layout中指定的fragment,并调用每一个上的onCreateView()方法,来获取每一个
fragment的layout。系统将从fragment返回的 View直接插入到元素所在的地方。注意:每一个fragment都需要一个唯一的标识,如果activity重启,系统可以用来恢复fragment(并且你也可以用来捕获fragment来处理事务,例如移除它) 。

有3种方法来为一个fragment提供一个标识:
  • 为android:id 属性提供一个唯一ID。
  • 为android:tag 属性提供一个唯一字符串。
  • 如果以上2个你都没有提供, 系统使用容器view的ID。

撰写代码将fragment添加到一个已存在的ViewGroup. 
     当activity运行的任何时候, 都可以将fragment添加到activity
layout。只需简单的指定一个需要放置fragment的ViewGroup。为了在你的
activity中操作fragment事务(例如添加,移除,或代替一个fragment),必须使用来自FragmentTransaction
的API。可以按如下方法,从你的Activity取得一个 FragmentTransaction 的实例:

  1. FragmentManager fragmentManager =getFragmentManager();
  2. FragmentTransaction fragmentTransaction =fragmentManager.beginTransaction();

复制代码

然后你可以使用 add() 方法添加一个fragment, 指定要添加的fragment和要插入的view。

  1. //Edited by mythou//http://www.cnblogs.com/mythou/ExampleFragment fragment = newExampleFragment();
  2. fragmentTransaction.add(R.id.fragment_container,fragment);
  3. fragmentTransaction.commit();

复制代码

add()的第一个参数是fragment要放入的ViewGroup, 由resource ID指定,第二个参数是需要添加的fragment。一旦用FragmentTransaction做了改变,为了使改变生效,必须调用commit()。

使用Fragment适应不同屏幕和分辨率的更多相关文章

  1. Android基础——使用Fragment适应不同屏幕和分辨率

    最近事情很忙,一个新项目赶着出来,但是很多功能都要重新做,一直在编写代码.Debug.今天因为一个新程序要使用Fragment来做,虽然以前也使用过Fragment,不过没有仔细研究,今天顺道写篇文章 ...

  2. Screenfly – 各种设备的屏幕和分辨率下快速测试网站

    Screenfly 让你能够在各种设备的屏幕和分辨率下查看你的网站.输入网址,并点击GO开始浏览网页.Screenfly 可以使用代理服务器来模拟设备,当您查看您的网站,代理服务器模仿您所选择的设备的 ...

  3. iOS系统下 的手机屏幕尺寸 分辨率 及系统版本 总结

    今天  我对iOS系统下 的手机屏幕尺寸 分辨率 及系统版本做了一次系统总结 供大家参考. 首先 是系统:    随着iOS 系统不断升级,现在已经到iOS7.0了, 并且TA有了很多新变化,最震撼的 ...

  4. VirtualBox内刚刚安装完CentOS6.9和7系统,无法调整屏幕的分辨率,也无法设置共享文件夹。解决的方法就是安装VirtualBox客户端增强包。

    VirtualBox内刚刚安装完CentOS6.9和7系统,无法调整屏幕的分辨率,也无法设置共享文件夹.解决的方法就是安装VirtualBox客户端增强包. 1.若直接安装客户端增强包会得到如下提示: ...

  5. [Android] 使用Include布局+Fragment滑动切换屏幕

        前面的文章已经讲述了"随手拍"项目图像处理的技术部分,该篇文章主要是主界面的布局及屏幕滑动切换,并结合鸿洋大神的视频和郭神的第一行代码(强推两人Android博客),完毕了 ...

  6. JS获取电脑或手机屏幕的分辨率

    s = " 屏幕分辨率的高:"+ window.screen.height+"\n"; s += " 屏幕分辨率的宽:"+ window.s ...

  7. 为何iPhone6 Plus的逻辑分辨率是2208×1242,屏幕实际分辨率却是1920×1080

    因为除了iPhone 6+以外,其他所有iPhone的DPI是一致的,都是326,用@2x的素材.但是6+的实际DPI是401,理论上苹果应该用401/326 * @2x=@2.46x的素材,但是这个 ...

  8. android中viewPager+fragment实现的屏幕左右切换(进阶篇)

    Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等.可以看做是一个子Activity. 先看一下布局: 1 <LinearLayout xmlns:a ...

  9. 修改Ubuntu屏幕的分辨率

      最近重新装了一下环境,用vnc连接服务器,发现分辨率过低,于是查了一下如何修改分辨率,将其调高.   编辑/etc/default/grub 搜索"#GRUB_GFXMODE=640x4 ...

随机推荐

  1. 手把手教你,C#.Net如何用Log4net把错误日志写入到SQLite数据库中

    在项目中,我们往往会有把错误日志记录下来的习惯,这样有利于当网站发布后,能第一时间找到错误的所在地,以及错误的原因,以便于我们第一时间纠错.往往我们会把错误日志直接写到txt文本中,虽然操作简单,但是 ...

  2. CUDA显卡运算编程菜鸟入门指南1——Hello world - yfszzx的专栏 - 博客频道 - CSDN.NET

    第一次知道有显卡(GPU)编程这个东西,是去年比特币最热门的时候,看了几篇关于比特币的文章,说比特币挖矿要靠显卡,CPU的速度与GPU根本就没法比,于是就非常好奇,显卡是什么神奇的东西?为什么运算速度 ...

  3. ts实战项目启动中遇到的问题

    项目链接:https://github.com/Jiasm/typescript-example 储备知识须知: sequelize入门篇 : 依照README执行以下操作: npm i brew s ...

  4. mysql在windows下命令行启动与关闭服务

    一.命令行关闭与启动服务的命令: 二.运行cmd的命令行程序时,必须以管理员身份运行.否则会出现如下提示: 三.mysql5.7版本的服务名一般默认为mysql57,因此如果使用服务名mysql,那么 ...

  5. SV中的数据类型

    Verilog-1995中规定的数据类型有:变量(reg), 线网(wire), 32位有符号数(integer), 64位无符号数(time), 浮点数(real). SV扩展了reg类型为logi ...

  6. VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)

    鸡啄米在上一节教程中讲了工具栏资源及CToolBar类,本节继续讲解工具栏的相关知识,主要内容包括工具栏的创建.停靠与使用. 工具栏的使用 上一节中鸡啄米提到过,一般情况下工具栏中的按钮在菜单栏中都有 ...

  7. Trove系列(四)—Trove的快照功能介绍

    Trove 快照用于支持DbaaS 备份,复制等功能.在Trove API (guest_agent)上将支持本功能.本功能将能够支持快照,从而用来进行副本设置,主数据库克隆和备份,以及数据恢复.目前 ...

  8. Linux服务器配置---ftp限制带宽

    限制带宽 ftp服务器可以设置每个用户的带宽,这样根据实际需求来分配,更加充分的利用系统资源.带宽通过参数“anon_max_rate“和”local_max_rate“来设置,这两个参数在配置文件中 ...

  9. 谈话准备.xmind 思维导图模版

    谈话准备.xmind 思维导图模版,谈话准备.xmind.zip 谈话准备 目标 1…… 2…… 3…… 影响决定因素 进程 经费 策略 问题 客户 竞争对手 竞争对手 潜在 现存 问题 个性 团队 ...

  10. php mysqli query 查询数据库后读取内容的方法

    php mysqli query 查询数据库后读取内容的方法 <?php$mysqli = new mysqli("localhost", "my_user&quo ...