Android学习笔记(五)Fragment简介

  Fragment是在Android 3.0 (API level 11)中引入的Activity的子模块。初衷是为了适应大屏幕的平板电脑,我们只需要使用Fragment对UI组件进行分组、模块化管理,就能很方便在运行过程中动态更新Activity的界面。Fragment必须被嵌入Activity中使用个,虽然也拥有自己的生命周期,但其生命周期手它所在的Activity的生命周期的控制。只有当该Activity处于活动状态时,我们才可以通过方法独立的操作Fragment。

一、Fragment的几个特性

  · Fragment总是作为Activity界面的组成部分。Fragment可通过getActivity()方法获取所在的Activity,Activity可以调用FragmentManager的findFragmentById()或findFragmentByTag()方法获取Fragment。

  · 在Activity运行时,可调用FragmentManager的add()、remove()、replace()方法动态的操作Fragment。

  · 一个Activity可同时组合多个Fragment;一个Fragment也可被多个Activity复用。

  · Fragment可以响应输入事件并有自己的生命周期,但其生命周期被所在的Activity的生命周期控制。

二、创建Fragment

  创建Fragment需要继承Fragment基类或者Fragment的子类,Fragment子类有:DialogFragment、ListFragment、PreferenceFragment或者WebViewFragment。与Activity类似,创建Fragment都需要实现一些回调方法,如:onCreate()、onCreateView()、onStart()、onResume()、onPause()、onStop()等。

  通常,我们在开发中会重写以下三个回调方法:

  · onCreate():系统创建Fragment对象后回调该方法,初始化必要组件。

  · onCreateView():当Fragment绘制界面组件时回调该方法。该方法必须返回一个View,该View就是Fragment所显示的View。

  · onPause():离开Fragment时回调该方法。

1    //重写改方法,返回值View将作为Fragment显示的组件
2     @Override
3     public View onCreateView(LayoutInflater inflater, ViewGroup container,
4             Bundle savedInstanceState) {
5         //加载fragment_main.xml布局文件
6         View rootView = inflater.inflate(R.layout.fragment_main, container, false);
7         return rootView;
8     }

 三、Fragment添加到Activity

  创建好了Fragment只有加入到Activity才可以展示出来,将Fragment添加到Activity中有两种方法:

  · 在布局文件中:使用<fragment.../>元素添加Fragment,android:name属性指定Fragment的实现类。

 1 <LinearLayout 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_parent"
 5     android:orientation="horizontal" >
 6     <fragment 
 7         android:name="com.codingblock.myfragment.MyFragment"
 8         android:id="@+id/myfragment"
 9         android:layout_width="wrap_content"
10         android:layout_height="match_parent"/>
11 </LinearLayout>

  · 在Java:通过FragmentTransaction对象的add()方法来添加Fragment。

1 @SuppressLint("NewApi")
2 @Override
3 protected void onCreate(Bundle savedInstanceState) {
4   super.onCreate(savedInstanceState);
5     //加载容器
6     setContentView(R.layout.activity_main);
7     //添加Fragment
8     getFragmentManager().beginTransaction().add(R.id.container, new MyFragment()).commit();
9 }

其中activity_main.xml布局文件如下:

1 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
2     xmlns:tools="http://schemas.android.com/tools"
3     android:id="@+id/container"
4     android:layout_width="match_parent"
5     android:layout_height="match_parent"
6     tools:context="com.codingblock.myfragment.MainActivity"
7     tools:ignore="MergeRootFrame" />

  提示:Activity的getFragmentManager()方法可以返回FragmentManager,FragmentManager对象的beginTransaction()方法即可开启并返回FragmentTransaction对象。

 四、Fragment与Activity通信

  1、将Fragment添加到activity之后,Fragment和Activity必须还有交互信息,这就需要Fragment能获取它所在的Activity,Activity也能获取它所包含的任意的Fragment。

  · Fragment获取它所在的Activity:调用Fragment的getActivity()方法即可返回它所在的Activity。

  · Activity 获取它包含的Fragment:调用Activity关联的FragmentManager的findFragmentById(int id)或findFragmentByTag(String tag)方法即可获取指定的Fragment。

  提示:在布局文件中用<fragment../>元素添加Fragment时,可以指定andorid:id或android:tag属性,用于标识该Fragment。

  2、另外,Fragment与Activity还需要相互传递数据:

  · Activity向Fragment传递数据:在Activity中创建Bundle数据包,并调用Fragment的setArguments(Bundle bundle)方法可将Bundle数据包传给Fragment。

  · Fragment想Activity传递数据或Activity需要在fragment运行中进行实时通信:在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口。

五、Fragment管理与Fragment事务

  Activity管理Fragment主要依靠FragmentManager,通过FragmentManager可以完成以下几个功能:

  · 使用findFragmentById()或findFragmentByTag()获取指定的Fragment。

  · 调用popBackStack()将Fragment从后台栈中弹出(模拟BACK键)。

  · 调用addOnBackStackChangeListener()注册一个监听器,用于监听后台栈的变化。

  另外,可以借助FragmentTransaction对象进行添加、删除、替换Fragment,FragmentTransaction代表Activity对Fragment的执行的多个改变。

  可以分以下几步实现管理fragment:

 1 // 1、打开事务 获得FragmentTransaction
 2 FragmentManager fragmentManager = getFragmentManager();
 3 FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
 4 // 2、创建一个新的Fragment
 5 Fragment fragment = new MyFragment();
 6 // 3、替换container容器内的fragment
 7 fragmentTransaction.replace(R.id.container, fragment);
 8 // 4、将事务添加到back栈,允许用户按下back键后返回到上一个状态
 9 fragmentTransaction.addToBackStack(null);
10 // 5、提交事务
11 fragmentTransaction.commit();

本篇博文仅介绍了Fragment的简单用法,在后续博文中将接着更深入的探讨Fragment。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏吴小龙同學

Activity生命周期和启动模式

Activity生命周期 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 2...

3497
来自专栏androidBlog

Android Hook Activity 的几种姿势

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

921
来自专栏腾讯Bugly的专栏

《Android基础:Fragment,看这篇就够了》

| 导语 Fragment作为Android最基本,最重要的基础概念之一,在开发中经常会和他打交道。本文从为什么出现Fragment开始,介绍了Fragment...

1K4
来自专栏移动开发的那些事儿

startActivity的Hook之路

由上可知,最终是通过ActivityThread里面的mInstrumentation对象来执行execStartActivity,而ActivityThrea...

942
来自专栏Android干货园

你真的会用Fragment了么?-Fragment解析

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/51...

941
来自专栏pangguoming

jwplayer 隐藏属性方法记载

jwplayer().getPosition(); //播放了多少秒 jwplayer('playerdiv').play(); ||   jwplayer(0...

3727
来自专栏空帆船w

Android Handler 消息处理机制

日常开发中,一般不会在子线程中直接进行 UI 操作,大部分采取的办法是创建 Message 对象,然后借助 Handler 发送出去,再在 Handler 的 ...

1223
来自专栏7号代码

Android应用界面开发——Fragment(实现图书详情界面)

Fragment代表了Activity的子模块,因此可以把Fragment理解成Activity片段。

1122
来自专栏everhad

札记:Fragment基础

Fragment概述 在Fragment出现之前,Activity是app中界面的基本组成单位,值得一提的是,作为四大组件之一,它是需要“注册”的。组件的特性使...

1856
来自专栏分享达人秀

Activity状态和生命周期方法

前面两期我们学习了Activity的创建和注册、以及启动和关闭,也学会了重写onCraete方法,这些知识在实际开发中远远不够,还需要学习了解更多。 ...

2006

扫码关注云+社区