Android在3.0之后引入了Fragment的概念,我推測其想法可能仅仅是想更好地兼容大屏幕或者平板的开发,由于大屏幕能够展示很多其它的内容,而内容一多,逻辑有可能就乱,而利用Fragment,则能够将不同的逻辑封装进不同的Fragment中,可是展现呢,还是在同一个Activity中,在同一个屏幕上显示。而对于屏幕并不大的手机来说,假设一个页面展示的东西并不多,那么事实上将逻辑直接写在Activity,利用多个Activity实现多个页面的展示,我认为也是能够接受的,毕竟用Activity还是用Fragment仅仅是一种手段的选择,能够帮助我们解决这个问题就好,没有什么是一定的。

可是既然Google那么推荐我们用Fragment,连ADT中默认的创建Activity都会帮我们把实现放到Fragment中,那说明在后面,某些我们不清楚的地方,fragment肯定是有着activity没有的优势的,即使Fragment在Fragment之间的跳转和传值是比較麻烦的,我们都要学习一下怎么使用Fragment。

今天这篇博文我们就来学习一下怎样使用Fragment,而且直接在Fragment中触发跳到还有一个Fragment中。

1)定义一个Activity:activity_main.xml,内容非常easy,就是放置一个FrameLayout作为Container,例如以下:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.lms.fmdemo.MainActivity"
tools:ignore="MergeRootFrame" />

2)定义三个Fragment的布局,例如以下:

2.1)fragment_main.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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.lms.fmdemo.MainActivity$PlaceholderFragment" > <Button
android:id="@+id/btnMain"
android:layout_width="200dp"
android:layout_height="50dp"
android:layout_centerInParent="true"
android:text="@string/main_fragment" /> </RelativeLayout>

2.2)fragment_sec.xml 和 fragment_third.xml都跟fragment_main.xml类似,中间仅仅放置一个button。

这三个布局呢,当我们点击Main的button时,会跳到第二个Fragment,当我们点击第二个Fragment中的button时,就会跳到第三个Fragment,简单实在。

3)创建三个Fragment实例,分别相应上面的三个布局,我们就拿第一个MainFragment来解说一下。

public class MainFragment extends Fragment implements OnClickListener{

	public interface MainFragmentClickListener{
public void onMainButtonClicked();
} private MainFragmentClickListener mActionTaker; public MainFragment() {
} public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mActionTaker = (MainFragmentClickListener) activity;
} catch (Exception e) {
throw new RuntimeException(activity.toString() + " must implements MainFragmentClickListener Inerface");
}
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false); Button btnMain = (Button) rootView.findViewById(R.id.btnMain);
btnMain.setOnClickListener(this); return rootView;
} @Override
public void onClick(View arg0) {
mActionTaker.onMainButtonClicked();
}
}

3.1)创建的MainFragment要继承于Fragment(注意,为了兼容2.x的系统,这里要使用support.v4包里面的fragment类)。

3.2)定义一个回调接口,且这个接口必需要被包括此Fragment的Activity实现。Fragment之间是没有办法互相跳转的,它们之间所谓的跳转操作事实上是由FragmentManager在主Activity中的加入替换删除等操作组成的,也就是说,事实上它们是被操作的,所以假设想在Fragment中触发跳转的操作的话,就必须将这个跳转事件让Activity知道,由Activity来操作。

3.3)在onAttach方法中,将Activity给强制转换成第二步实现的接口,假设有异常,说明Activity没有实现此接口,则会报错。这一步,仅仅是为了确保主Activity有实现这个接口,当然,也能够在这里获取一个Activity对象,供后面利用。

3.4)定义onCreateView方法,在onCreateView方法中,实始化当前Fragment的布局,并为不同的控件设置不同的响应函数等之类。在这个样例中,我们仅仅是简单设置了一个button。

3.5)在button的响应函数中,因为仅仅有一个button有这个响应函数,所以在这里并不推断控件的id,直接调用第二步定义接口的回调函数,即Activity会处理这个响应函数。

一个Fragment基本的实现框架基本上就是这样,在本页面上的逻辑,基本上就跟普通的Activity一样,能够直接处理。仅仅有当涉及到其它的页面(Fragment)的时候,我们才须要利用回调接口,来实现过渡。有可能是本个Fragment会被替换成另外一个Fragment,而这仅仅能由Activity做,没办法自杀的。

4)在Activity中载入我们定义的Fragment,而且处理相应Fragment的接口函数,例如以下:

public class MainActivity extends ActionBarActivity implements MainFragmentClickListener, SecondFragmentClickListener{

	private FragmentManager fragmentManager;

	@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentManager = getSupportFragmentManager();
if (savedInstanceState == null) {
fragmentManager.beginTransaction().add(R.id.container, new MainFragment()).commit();
}
} ... @Override
public void onMainButtonClicked() {
fragmentManager.beginTransaction().replace(R.id.container, new SecondFragment()).addToBackStack(null).commit();
} @Override
public void onSecondButtonClicked() {
fragmentManager.beginTransaction().replace(R.id.container, new ThirdFragment()).addToBackStack(null).commit();
}

在上面的Activity中,实现了MainFragmentClickListener和SecondFragmentClickListener,各自是两个Fragment中定义的接口,而在其相应的实现方法,我们仅仅是简单地将一个新的Fragment放到Container中去,

如 onMainButtonClicked,在此方法,我们利用FragmentManager.beginTransaction方法获得Transaction对象,然后调用其replace方法,将SecondFragment替换掉原来在onCreate时载入的MainFragment对象,最后 commit。

综合来看,Activity的逻辑是最简单的,能够说,它没有什么业务相关的逻辑,全部业务相关的逻辑应该都在相应的Fragment中实现,而Activity仅仅是负责不同的Fragment之间的切换。

到这里,在Activity中利用Fragment来实现App页面之间跳转就基本实现了。而这跟普通的app,利用Activity来实现页面跳转,事实上架构基本上是一样的,以下就是其执行效果:

结束。源码下载!

Android学习小Demo(20)关于Fragment的应用的更多相关文章

  1. Android学习小Demo(19)利用Loader来实时接收短信

    之前写过一篇文章<Android学习小Demo(13)Android中关于ContentObserver的使用>,在里面利用ContentOberver去监測短信URI内容的变化.我们先来 ...

  2. Android学习小Demo一个显示行线的自定义EditText

    今天在处理一个EditText的时候,想着把EditText做成像一本作业本上的纸一样,每一行都可以由线条隔开,具体效果如下: 1)最开始的思路 一开始的想法是很简单的,找出每一行的高度,然后一行一行 ...

  3. Android学习小Demo(21)ListView的联动选择

    在日常的App开发中,尤其是在开发生活服务的应用上,非常多时候,我们会须要联动地展现省市区的数据等,需求大概例如以下: 1)展现全部省份 2)当点击某省份的时候,在二级菜单上展现此省份以下所属的城市列 ...

  4. RPC框架学习+小Demo实例

    一.什么是RPC协议? 全称:远程过程调度协议 效果:使消费者向调用本地方法一样调用远程服务方法,对使用者透明 目前常用:Dubbo.Thirft.Sofa.... 功能: 建立远程通信(socket ...

  5. 高强度学习训练第二天总结:Opencv+Android+CameraView小demo

    前言:网上已经有很多人将Opencv集成进Android项目中了.因此我只给大家看Gradle文件和项目目录. 1.gradle 三个gradle script // Top-level build ...

  6. QT学习小demo之LightMD(MarkDown编辑器)

    很早之前就有了写一个类似Windows记事本的想法,加上最近也刚好在学编译原理,所以就想把两者结合起来,于是就打算结合MarkDown,开发一款MarkDown编辑器. 不过由于我之前一直使用的是Ja ...

  7. Android学习笔记(五)Fragment简介

    Fragment是在Android 3.0 (API level 11)中引入的Activity的子模块.初衷是为了适应大屏幕的平板电脑,我们只需要使用Fragment对UI组件进行分组.模块化管理, ...

  8. android学习小例子——验证码倒计时按钮

    1.activity_main.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/andro ...

  9. Android学习笔记(六)Fragment的生命周期

    在上一篇博文中对Fragment做了简单的介绍,现在再来探讨一下Fragment的生命周期. 一.Fragment的几种状态: 与Activity类似,Fragment也有一下几种状态: · 活动状态 ...

随机推荐

  1. CentOS 6.5安全加固及性能优化

    (文章来自:http://www.cnblogs.com/seasonzone/p/3526296.html) 我们可以通过调整系统参数来提高系统内存.CPU.内核资源的占用,通过禁用不必要的服务.端 ...

  2. POJ 3181 Dollar Dayz 简单DP

    这DP虽然简单 但是思考一下还是挺好的 题意是 1,2,3,4....k 用加法凑成N 每个数可取不限个数 令dp[i][j] 表示前i种数凑成j的方案数 然后dp[i][j] = dp[i - 1] ...

  3. 经常使用的正則表達式归纳—JavaScript正則表達式

    来源:http://www.ido321.com/856.html 1.正则优先级 首先看一下正則表達式的优先级,下表从最高优先级到最低优先级列出各种正則表達式操作符的优先权顺序: 2.经常使用的正則 ...

  4. poj2761(treap入门)

    给n个数,然后m个询问,询问任意区间的第k小的数,特别的,任意两个区间不存在包含关系, 也就是说,将所有的询问按L排序之后, 对于i<j ,   Li < Lj 且 Ri < Rj ...

  5. hdu2544(自己实现优先队列)

    hdu2544  dij水题,用来测试自己实现优先队列对不对 #include <stdio.h> #include <string.h> #include <stdli ...

  6. windows phone (22) 隐藏元素

    原文:windows phone (22) 隐藏元素 在wp中我们也会用到隐藏某个元素,已达到某种效果,刚刚从文章看到了,分享一下[作者:神舟龙] Visibility 此属性能非常方便的实现隐藏某个 ...

  7. Gitblit配置

    Gitblit的安装配置及访问-windows (2013-09-11 11:52:31) 转载▼   分类: android基础 Git 是现在很流行的分布式版本控制工具,github更是人人皆知. ...

  8. Windows 8 应用开发 - 异步调用

    原文:Windows 8 应用开发 - 异步调用     不论是桌面客户端还是Web应用通常会出现处理时间较长的操作,为了在这段时间内不影响用户与应用之间的交互体验,开发人员通常会使用异步调用技术,使 ...

  9. IOS_多线程_ASI_AFN_UIWebView

    H:/0730/00_多线程4票种_ViewController.h // // ViewController.h // 卖票 // // Created by apple on 13-7-29. / ...

  10. sql分隔字符串数组

    declare @relation_code nvarchar(1024) set @relation_code = '#10000#10002' set @relation_code=substri ...