Android学习小Demo(20)关于Fragment的应用

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,内容很简单,就是放置一个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类似,中间只放置一个按钮。

这三个布局呢,当我们点击Main的按钮时,会跳到第二个Fragment,当我们点击第二个Fragment中的按钮时,就会跳到第三个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的布局,并为不同的控件设置不同的响应函数等之类。在这个例子中,我们只是简单设置了一个按钮。

3.5)在按钮的响应函数中,由于只有一个按钮有这个响应函数,所以在这里并不判断控件的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的应用,布布扣,bubuko.com

时间: 2024-08-05 15:07:41

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

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

之前写过一篇文章<Android学习小Demo(13)Android中关于ContentObserver的使用>,在里面利用ContentOberver去监测短信URI内容的变化.我们先来回顾一下,是如何利用ContentOberver来监测短信内容的变化的. 1)要自定义一个类,比如SmsContentObserver,继承ContentObserver,并且实现其onChange方法. 2)在onChange方法中去查询对应Uri,比如短信收件箱的内容,并将对应的记录利用Handler发送

Android学习小Demo(23)Aidl实现进程间通信

我们知道,Android是靠Binder机制来实现进程间的通信,而上一篇文章中,我们利用AIDL,简单地从代码方面的角度讲解了在服务端中的Binder的存在形式,是以服务的实现存在的,而在客户端,则是以代理的形式,实现存在的只是一个关于服务端的Binder实现的引用. 理论上的东西我们要去学习掌握,但是也不能忽略了实际的动手能力,对吧. 今天,我们就一步一步地利用我们所了解地关于AIDL的知识来实现一个跨进程通信的例子. 在Android的上层应用中,每一个App都是一个单独的进程,所以,要实现

Android学习小Demo(22)带删除按钮的TextView

很多时候,会有一些很简单的需求,比如你利用一个Button弹出某个页面,选择了某个对象之后,你会将对象的某些属性,比如名称之类,显示在按钮上. 而紧跟着,又会想着,能不能把刚选择的对象给清掉,比如把按钮上的文字给去掉,这个时候,你就会希望,要是按钮后面还能够有多一个图标,一点击,就把当前控件的文字等清除掉就好了,并且还会对应的回调函数,让我们多处理一些事情,那多好. 很可惜,Android并没有提供现成的控件供我们这样使用,但换个角度想想,这又根本不可惜,因为我们可以自己来实现这样的效果呀,这是

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

在日常的App开发中,尤其是在开发生活服务的应用上,非常多时候,我们会须要联动地展现省市区的数据等,需求大概例如以下: 1)展现全部省份 2)当点击某省份的时候,在二级菜单上展现此省份以下所属的城市列表 3)选中返回,显示我们选中的城市 4)当又一次进入选择页面的时候,标识出我们上一次选中(或者说当前已经选择)的值 下图是一个类似的ListView联动选择控件. 1)首先定义一个Layout,左右各放置一个ListView,大概界面例如以下: 2)自己定义一个控件(ValuePicker),在控

Android学习笔记(四) Fragment

1.从网上看了许多篇关于Fragment的简要介绍,发现都是相类似的理解,而且都是草草地说与Activity大致相同就了事,都没有说清楚Activity与Fragment的具体的关联与区别,一大堆的rubbish. 在此我也记录下本人的rubbish理解: 关于Fragment的生命周期问题,确实应该是如大多数人所说,与Activity相类似,用法也相类似,但是这并不足以教会我们怎样去使用Fragment. Fragment应该是作为Activity的一部分,更像动态的panel(也许实际上真的

Android实战--小DEMO(JAVA关键字学习之语音合成TTS的实现)一

接着上一节讨论的问题,本DEMO中会用到TTS语音合成,我们下面介绍一个同样原理的小例子 看一下布局文件很简单: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" androi

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

1.activity_main.xml: 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_p

Android学习笔记十三.深入理解fragment(一)

深入理解fragment(一) Fragment是Android3.0引入的新API,可以把Fragment想成Activity中的模块,这个模块有自己的布局,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块. 可以把Fragment设计成可以在多个Activity中复用的模块,当开发的应用程序同时适用于平板电脑和手机时,可以利用Fragment实现灵活的布局,改善用户体验. 一.Fragment的特征 1.Fragment总是作为Activ

Android学习笔记—第十一章 Fragment

第十一章 Fragment android-supportV4: Android在新版本新增功能的兼容包,最低兼容1.6 路径:adt-bundle-windows-x86-20131030\sdk\extras\android\support\v4 功能:Fragment.ViewPager.视频播放 查看supportV4源代码: (1)在项目lib文件夹上new→file,文件名为android-support-v4.jar.properties (2)编辑文件内容: src=xxx:\\