Android进阶——Fragment初尝(一)

1.什么是Fragment?

Fragment(碎片)是一种可以嵌入在Activity中的UI片段,它能够:1.让合理和充分地利用大屏幕的空间,兼顾手机和平板(试想一下,对于同一份源代码,编译出的app同时能够在手机和平板上面运行,而不会出现控件或者图片过度拉伸的问题,这样岂不是很酷?对程序员来说也是福利啊);2.Fragment更轻量级,用Activity托管它,在视图的切换过程中,不用销毁Activity,只需要切换掉Activity托管的Fragment即可,这样可以提升软件运行的效率。

2.托管Fragment

 (1)添加Fragment到activity布局中去。

 (2)在Activity代码中添加Fragment。

 第一种方法就是在Activity的XML布局文件中添加Fragment布局代码,这样就相当于将Fragment和Activity绑定,且在Activity的生命周期中不能切换Fragment试图。

 第二种方法较第一种方法就更加灵活,可以在Activity活动生命周期内添加或者移除Fragment来完成某种具体的任务,但是在实现方面就比较复杂。

 下面来介绍一下第二种托管方式:

 (1)新建一个Fragment的布局文件(fragment_crime.xml)

 (2)新建Fragment逻辑类()

 (3)新建托管Activity类()

 (4)新建托管Activity的布局文件()

3.Fragment之间通信

 Fragment是由activity托管的,activity托管的fragment之间的通信只能通过activity来完成。

 (1)从Fragment中启动另一个Activity

  和Activity中启动Activity一样,用显示Intent

  

 Intent intent = new Intent(getActivity(), SecondActivity.class);
         intent.putExtra("data_id", "data_value");
        startActivity(intent);
//这个startActivity()是FragmentActivity类中的函数,而不是Activity类中的startActivity(),getActivity()是获得托管该fragment的actvity

 (2)从Fragment中启动Activity时附加信息(这个信息会用在另一个fragment中)

  a.和Activity中启动Activity一样,用显示Intent附加消息.

  首先,在FirstFragment.java中,传入参数:

Intent intent = new Intent(getActivity(), NewActivity.class);
intent.putString("date_id", "data_value");//键是"data_id", 传递的值是"data_value"
startActivity(intent);

  然后,在SecondFragment.java中,取出参数:

  一般是在onCreate()函数中

1 @Override
2 public void onCreate(){
3         ...
5         String str = (String) getActivity().getSerializable("data_id");
6 }//data_id是获得相应值的键(键值对形式存储)

  b.使用Fragment argument.

    使用Fragment argument的时候,有个公共静态自定义函数是必不可少的,他实现了Fragment的创建和参数(Bundle args)的绑定

  例子如下:

1     public static SecondFragment newInstance(int crimeId){
2         Bundle args = new Bundle();
3         args.putSerializable("data_id", crimeId);
4         CrimeFragment fragment = new CrimeFragment();
5         fragment.setArguments(args);
6         return fragment;
7     }

  下面来说一下详细的实现过程(我要从FirstActivity托管的FirstFragment中启动SecondActivity托管的SecondFragment,并且在SecondFragment中使用FirstFragment中传过去的参数)

  首先在SecondFragment中(SecondFragment.java)

  实现一个公共静态自定义函数:

1     public static SecondFragment newInstance(int crimeId){
2         Bundle args = new Bundle();
3         args.putSerializable("data_id", crimeId);
4         CrimeFragment fragment = new CrimeFragment();
5         fragment.setArguments(args);
6         return fragment;
7     }

  然后在SecondActivityt中(SecondActivity.java):

  createFragment()函数中,在返回这个Fragment之前,我们就将附带的参数从Intent中取出,添加到Fragment中,用SecondFragment.newInstance(crimeId)取代new CrimeFragment();

1     @Override
2     protected Fragment createFragment() {
3         // TODO Auto-generated method stub
4         //return new CrimeFragment();
5         int crimeId = (int) getIntent().getSerializableExtra("data_id");
6         return SecondFragment.newInstance(crimeId);
7     }

  最后在SecondFragment中(SecondFragment.java)

  一般是在onCreate()函数中获得附带的参数值,因为这个fragment一产生我们就要从该fragment中获得传过来的值,来进行接下来的操作。

  在onCreate()函数中,获得fragment附带的值

1 @Override
2 public void onCreate(){
3         ...
5         String str = (String) getArguments().getSerializable("data_id");
6 }//EXTRA_CRIME_ID是获得相应值的键(键值对形式存储)

 c.Fragment返回结果到Fragment(进一步实现Fragment返回结果到另一个Fragment)

  前面a或者b都实现了从FirstFragment启动SecondFragment,并且传递参数过去,在这里要实现的就是当SecondFragment销毁的时候,能够返回参数到FirstFragment中

  步骤如下:

  (1)在FirstFragment中启动SecondFragment的事物提交前时设置目标fragment:

    public void setTargetFragment(Fragment fragment, int requestCode)

  该方法给该Fragment对象设置一个可选的目标。例如,如果该Fragment对象使用由另一个Fragment对象启动的,并且在想要把一个给定的结果返回给第一个Fragment对象时,就可以使用这个方法。

参数

fragment 该参数给Fragment对象指定一个接受结果的目标Fragment对象。

requestCode 可选的请求编码,为返回到onActivityResult(int, int, Intent)方法提供便利。

  (2)在SecondFragment中实现一个回调目标函数(这是一个自定义函数,在有事件触发时调用它,如点击事件)

  private void setResult(int resultCode)

 1     private void sendResut(int resultCode){
 2         if (getTargetFragment() == null) {//判断是否有设置目标fragment
 3             return;
 4         }
 5         Intent i = new Intent();
 6         i.putExtra("return_data_id", mDate);//用Intent传递返回值
 7
 8         getTargetFragment()
 9         .onActivityResult(getTargetRequestCode(), resultCode, i);
10 //回调目标(FirstFragment)的onActivityResult函数
11 }

  (3)在FirstFragment中重写onActivityResult(int requestCode, int resultCode, Intent data)函数

 1     @Override
 2     public void onActivityResult(int requestCode, int resultCode, Intent data) {
 3
 4         super.onActivityResult(requestCode, resultCode, data);
 5         if (resultCode != Activity.RESULT_OK) {
 6             return;
 7         }
 8         if (requestCode == REQUEST_DATE) {
 9             //获取Intent中的值。
10         }
11     }        

  通过这三步,就能将SecondFragment中的值传递到FirstFragment。

时间: 2024-11-10 00:41:13

Android进阶——Fragment初尝(一)的相关文章

Android进阶——Fragment详解之操作原理(三)

引言 前一篇文章总结了Fragment 的基本概念和基本的用法,相信大家也能够掌握一些知识了,但是对于一些操作可能还是不知其所以然,说实话曾经很长一段时间为也是晕乎乎的,后来才慢慢重视去学习了解,才略知一二,遂分享之. 一.管理Fragement所涉及到的关键类 应用Fragment的过程中涉及到的关键类主要有:FragmentManager和.FragmentManagerImpl.FragmentTransaction和BackStackRecord等. 二.Fragment操作原理详述 1

《Android进阶》之第六篇 Fragment 的使用2

最近通过学习,对fragment的使用有了新的认识. 一开始接触android的时候,很是受不了这个fragment,总感觉它把一个简单的事情搞复杂啦,所以每次新建工程的时候总是固执的选择empty Activity 但是后来发现这样写出来的代码移植的时候总是要该来该去,现在开始偏爱带fragment的工程向导 向导默认生成一个JAVA文件,和两个布局文件 MainActivity.JAVA package com.example.tesf; import android.app.Activit

【Android进阶篇】Fragment的两种加载方式

一.概述 Fragment(碎片,片段)是在Android 3.0后才引入的,主要的目的是为了实现在大屏幕设备上的更加动态更加灵活的UI设计.这是因为平板电脑的屏幕比手机大得多,所以屏幕上可以放更多的组件,而不是简单地只是把手机上的组件放大.所以Fragment在应用中的是一个可重用的模块化组件,它有自己的布局.自己的生命周期,在一个Activity中可以包含多个Fragment. 二.在Activity中加载Fragment Fragment的加载方式包含两种:静态加载和动态加载.静态加载很简

Android之Fragment用法

本文翻译自Android developer网站上面,原文参考:Building a Dynamic UI with Fragments 当我们需要动态的多界面切换的时候,就需要将UI元素和Activity融合成一个模块.在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单个界面动态改变.在4.0或以上系统中就可以使用新的特性来方便的达到这个效果--Fragment类.Fragment类似一个嵌套Activity,可以定义自己的layout和自己的生命周期. 多个Fragm

Android开发面试经——4.常见Android进阶笔试题(更新中...)

Android开发(29)  版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44301359 上一篇文章我们已经了解了Android笔试的一些基础题目, [<Android开发面试经——2.常见Android基础笔试题> ] (http://blog.csdn.net/finddreams/a

我的Android进阶之旅------&gt;经典的大牛博客推荐(排名不分先后)!!

本文来自:http://blog.csdn.net/ouyang_peng/article/details/11358405 今天看到一篇文章,收藏了很多大牛的博客,在这里分享一下 谦虚的天下 柳志超博客 Android中文Wiki AndroidStudio-NDK开发-移动开发团队谦虚的天下 - 博客园gundumw100博客 - android进阶分类文章列表 - ITeye技术网站CSDN博文精选:Android系列开发博客资源汇总 - CSDN.NET - CSDN资讯Android笔

Android进阶——Preference详解之Preference系的基本应用和管理(二)

引言 前面一篇文章Android进阶--Preference详解之初识Preference及Preference系(一)简单描述下了Preference的家族构成和基本知识,相信对于Preference早已不会陌生,肯定也跃跃欲试了吧,这篇文章就给大家总结下Preference.PreferenceActivity.PreferenceGroup.RingtonePreference的普通应用和管理,还有通过一些测试来验证一些机制和原理. 一.PreferenceActivity 1.Prefe

Android开发面试经——3.常见Android进阶笔试题

关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44301359 上一篇文章我们已经了解了Android笔试的一些基础题目,<Android开发面试经--2.常见Android基础笔试题> 但是做为一个有经验的开发者,仅仅知道基础题还是不够的,你的简历上说有两年以上工作经验的话,那面试官肯定会问一些深入性的问题,看你能否回答的出.所以为了找一个更好的工作,我们还需要去了解一下Android进阶的笔试题目: 1.什么是

Android进阶:自定义视频播放器开发(下)

上一篇文章我们主要讲了视频播放器开发之前需要准备的一个知识,TextureView,用于对图像流的处理.这篇文章开始构建一个基础的视频播放器. 一.准备工作 在之前的文章已经说过了,播放器也是一个view,我们要在这个view上播放视频流.所以我们要自定义一个简单的viewgroup,比如继承FrameLayout.还出就是布局简单,其他控件可以往上面添加.大家见过的视频播放器的控制器都是放在视频的上方的.这样就是用FrameLayout布局是最好的. class SmallVideoPlaye