Fragment的产生:

为了适应各种尺寸的屏幕,谷歌推出Fragment,可以把Fragment成Activity的一个组成部分,它拥有自己的生命周期、可以接收并处理用户的各种事件,还可以动态的增删改某个Fragment

Fragment的使用

可以把Fragment当成普通的控件使用,直接写在布局文件中,然后新建一个继承自Fragment的类加载这个布局,然后在Activity的布局文件中直接引用这个Fragment,就是这么简单:

MainActivity.java

package com.example.fragmentdemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window; public class MainActivity extends Activity { @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main); }
}

activity_main.xml

<LinearLayout 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:orientation="horizontal"
tools:context="com.example.fragmentdemo.MainActivity" > <fragment
android:id="@+id/fragment1"
android:name="com.example.fragmentdemo.fragment.Fragment1"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1" /> <fragment
android:id="@+id/fragment2"
android:name="com.example.fragmentdemo.fragment.Fragment2"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1" /> </LinearLayout>

Fragment1.java

package com.example.fragmentdemo.fragment;

import com.example.fragmentdemo.R;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; public class Fragment1 extends Fragment { @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment1, container, false); return view;
} }

fragment1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#DDA0DD"
android:text="这是Fragment1" /> </LinearLayout>

Fragment2.java

package com.example.fragmentdemo.fragment;

import com.example.fragmentdemo.R;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; public class Fragment2 extends Fragment { @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment2, container, false);
} }

fragment2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#7B68EE"
android:orientation="vertical" > <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="这是Fragment2" /> </LinearLayout>

运行结果:

      动态使用Fragment

动态使用Fragment需要以下几个步骤:

1.获取到FragmentManager,在Activity中可以直接通过getFragmentManager得到。

2.开启一个事务,通过调用beginTransaction方法开启。

3.使用add(),replace(),remove(),hide(),show(),detach(),attach()等方法编辑Fragment

add()——往Activity中添加一个Fragment

replace()——使用另外一个Fragment替换当前的Fragment

remove()——移除一个Fragment

hide()——隐藏一个Fragment

show()——将隐藏的Fragment显示

detach()——会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。

attach()——重建View视图,附加到UI上并显示

4.提交事务,调用commit方法提交。

实现微信地步菜单:

MainActivity.java

package cn.lixyz.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import cn.lixyz.test.fragment.DiscoverFragment;
import cn.lixyz.test.fragment.MeFragment;
import cn.lixyz.test.fragment.TXLFragment;
import cn.lixyz.test.fragment.WeChatFragment; public class MainActivity extends Activity implements OnCheckedChangeListener { private RadioGroup rg_tab_buttons; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main); getFragmentManager().beginTransaction().add(R.id.layout, new WeChatFragment(), "wechat").commit();
rg_tab_buttons = (RadioGroup) findViewById(R.id.rg_tab_buttons);
rg_tab_buttons.setOnCheckedChangeListener(this); } @Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.rb_wechat:
getFragmentManager().beginTransaction().replace(R.id.layout, new WeChatFragment(), "wechat").commit();
break;
case R.id.rb_txl:
getFragmentManager().beginTransaction().replace(R.id.layout, new TXLFragment(), "txl").commit();
break;
case R.id.rb_discover:
getFragmentManager().beginTransaction().replace(R.id.layout, new DiscoverFragment(), "discover").commit();
break;
case R.id.rb_me:
getFragmentManager().beginTransaction().replace(R.id.layout, new MeFragment(), "me").commit();
break;
}
} }

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f9f9f9"
android:orientation="vertical" > <LinearLayout
android:id="@+id/layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical" >
</LinearLayout> <RadioGroup
android:id="@+id/rg_tab_buttons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" /> <RadioButton
android:id="@+id/rb_wechat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/wechat_icon"
android:button="@null" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" /> <RadioButton
android:id="@+id/rb_txl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/txl_icon"
android:button="@null" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" /> <RadioButton
android:id="@+id/rb_discover"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/discover_icon"
android:button="@null" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" /> <RadioButton
android:id="@+id/rb_me"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/me_icon"
android:button="@null" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
</RadioGroup> </LinearLayout>

DiscoverFragment.java

package cn.lixyz.test.fragment;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import cn.lixyz.test.R; public class DiscoverFragment extends Fragment { @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.discover_fragment, container, false);
} }

discover_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这是发现页面" /> </LinearLayout>

MeFragment.java

package cn.lixyz.test.fragment;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import cn.lixyz.test.R; public class MeFragment extends Fragment { @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.me_fragment, container, false);
} }

me_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这是我页面" /> </LinearLayout>

TXLFragment.java

package cn.lixyz.test.fragment;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import cn.lixyz.test.R; public class TXLFragment extends Fragment { @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.txl_fragment, container, false);
} }

txl_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这是通讯录页面" /> </LinearLayout>

WeChatFragment.java

package cn.lixyz.test.fragment;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import cn.lixyz.test.R; public class WeChatFragment extends Fragment { @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.wechat_fragment, container, false);
} }

wechat_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这是微信页面" /> </LinearLayout>

  运行结果:

Fragment的生命周期

和Activity一样,Fragment同样也拥有自己的生命周期

package com.example.fragmentdemo.fragment;

import com.example.fragmentdemo.R;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; public class Fragment1 extends Fragment { @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d("TTTT", "onCreateView方法运行了...");
return inflater.inflate(R.layout.fragment1, container, false);
} @Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.d("TTTT", "onAttach方法运行了...");
} @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("TTTT", "onCreate方法运行了...");
} @Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d("TTTT", "onActivityCreated方法运行了...");
} @Override
public void onStart() {
super.onStart();
Log.d("TTTT", "onStart方法运行了...");
} @Override
public void onResume() {
super.onResume();
Log.d("TTTT", "onResume方法运行了...");
} @Override
public void onPause() {
super.onPause();
Log.d("TTTT", "onPause方法运行了...");
} @Override
public void onStop() {
super.onStop();
Log.d("TTTT", "onStop方法运行了...");
} @Override
public void onDestroyView() {
super.onDestroyView();
Log.d("TTTT", "onDestroyView方法运行了...");
} @Override
public void onDestroy() {
super.onDestroy();
Log.d("TTTT", "onDestroy方法运行了...");
} @Override
public void onDetach() {
super.onDetach();
Log.d("TTTT", "onDetach方法运行了...");
} }

      运行程序

12-29 12:12:29.490: D/TTTT(8133): onAttach方法运行了...
12-29 12:12:29.490: D/TTTT(8133): onCreate方法运行了...
12-29 12:12:29.490: D/TTTT(8133): onCreateView方法运行了...
12-29 12:12:29.490: D/TTTT(8133): onActivityCreated方法运行了...
12-29 12:12:29.491: D/TTTT(8133): onStart方法运行了...
12-29 12:12:29.491: D/TTTT(8133): onResume方法运行了...

  按HOME键回到桌面

12-29 12:13:17.164: D/TTTT(8133): onPause方法运行了...
12-29 12:13:17.793: D/TTTT(8133): onStop方法运行了...

  再次进入程序

12-29 12:13:38.604: D/TTTT(8133): onStart方法运行了...
12-29 12:13:38.604: D/TTTT(8133): onResume方法运行了...

  退出程序

12-29 12:13:55.785: D/TTTT(8133): onPause方法运行了...
12-29 12:13:56.464: D/TTTT(8133): onStop方法运行了...
12-29 12:13:56.464: D/TTTT(8133): onDestroyView方法运行了...
12-29 12:13:56.464: D/TTTT(8133): onDestroy方法运行了...
12-29 12:13:56.464: D/TTTT(8133): onDetach方法运行了...

看到这里,我相信大多数朋友已经非常明白了,因为这和Activity的生命周期太相似了。只是有几个Activity中没有的新方法,这里需要重点介绍一下:

onAttach方法:Fragment和Activity建立关联的时候调用。

onCreateView方法:为Fragment加载布局时调用。

onActivityCreated方法:当Activity中的onCreate方法执行完后调用。

onDestroyView方法:Fragment中的布局被移除时调用。

onDetach方法:Fragment和Activity解除关联的时候调用。

Android笔记(六十八) Fragment总结的更多相关文章

  1. Android笔记(六十九) 仿微信界面(一)

          综合之前的Fragment和自定义组件的知识,实现微信界面 MainActivity.java package cn.lixyz.test; import android.app.Acti ...

  2. Android笔记(六十六) android中的动画——XML文件定义属性动画

    除了直接在java代码中定义动画之外,还可以使用xml文件定义动画,以便重用. 如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在 ...

  3. Android笔记(六十五) android中的动画——属性动画(propertyanimation)

    补间动画只能定义起始和结束两个帧在“透明度”.“旋转”.“倾斜”.“位移”4个方面的变化,逐帧动画也只能是播放多个图片,无法满足我们日常复杂的动画需求,所以谷歌在3.0开始,推出了属性动画(prope ...

  4. Android笔记(六十四) android中的动画——补间动画(tweened animation)

    补间动画就是只需要定义动画开始和结束的位置,动画中间的变化由系统去补齐. 补间动画由一下四种方式: 1.AplhaAnimation——透明度动画效果 2.ScaleAnimation ——缩放动画效 ...

  5. Android笔记(六十二)网络框架volley

    什么是Volley 很多时候,我们的APP都需要用到网络技术,使用HTTP协议来发送接收数据,谷歌推出了一个网络框架——volley,该框架适合进行数据量不大,但通信频繁的网络操作. 它的优点: (1 ...

  6. Android笔记(十八) 下拉列表(Spinner)

    App中常用的控件——下拉列表(Spinner),提供特定选择供用户选择 Spinner每次只能选择一个部件,它的选项来自于与之相关联的适配器(apater)中. MainActivity.java ...

  7. Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)

    在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...

  8. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)

    前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...

  9. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(下)

    LinearGradient 线性渐变渲染器 LinearGradient中文翻译过来就是线性渐变的意思.线性渐变通俗来讲就是给起点设置一个颜色值如#faf84d,终点设置一个颜色值如#CC423C, ...

随机推荐

  1. LinkedBlockingQueue与ArrayBlockingQueue

    阻塞队列与普通的队列(LinkedList/ArrayList)相比,支持在向队列中添加元素时,队列的长度已满阻塞当前添加线程,直到队列未满或者等待超时:从队列中获取元素时,队列中元素为空 ,会将获取 ...

  2. tp3.2升级tp5需要注意的变化

    I方法用input代替:D和M方法没了,需要的话自己封装.C方法没了,需要自己封装,配置文件说明官方文档写的不对,无法使用 Session的使用发生很大变化 模板渲染,控制器传空值会报错 模板内置标签 ...

  3. UE4的内存模型

    转自:https://blog.csdn.net/noahzuo/article/details/73565259 UObject和FUObjectItem UE4运行的基本单位是UObjet,然而U ...

  4. 【视频开发】非常优秀的CxImage各种格式图像开源工具

    下面介绍应用它进行图像类型转换的方式: 1.从一种图像文件类型转换为另一种文件类型(convert from a format to another)  CxImage   image;    //  ...

  5. centos php7.1 redis4.0.9 安装扩展phpredis

    1.扩展列表 https://github.com/phpredis/phpredis/releases [root@VM_27_0_centos server]# ls data lib.pl my ...

  6. 第16届(2019)全国大学生信息安全与对抗技术竞赛全国线下总决赛 Writeup

    笔者<Qftm>原文发布<BitHack>:https://bithack.io/forum/469/answer/333 0x00 Begin 关于 ISCC 2019 北理 ...

  7. JAVAWEB实现增删查改(图书信息管理)之添加功能实现

    addBooks.jsp页面代码:↓ <%-- Created by IntelliJ IDEA. User: NFS Date: 2019-7-12 Time: 14:30 To change ...

  8. python基础 — 异常处理

    什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常. 异常是Python对象,表示一个错误. 当Pyth ...

  9. JSVC安装

    执行./start-all.sh启动hadoop时报错 Starting datanodes node1: ERROR: Cannot set priority of datanode process ...

  10. Luogu4548 CTSC2006 歌唱王国 概率生成函数、哈希

    传送门 orz ymd 考虑构造生成函数:设\(F(x) = \sum\limits_{i=0}^\infty f_ix^i\),其中\(f_i\)表示答案为\(i\)的概率:又设\(G(x) = \ ...