文章目录

  • 零、学习目标
  • 一、Fragment概述
  • 二、Fragment生命周期
  • 三、教学案例——切换碎片
    • (一)运行效果
    • (二)涉及知识点
    • (三)实现步骤
      • 1、创建安卓应用【SwitchFragment】
      • 2、将三张背景图片拷贝到drawable目录
      • 3、主布局资源文件activity_main.xml
      • 4、创建第一个碎片 - FirstFragment
      • 5、创建第二碎片 - SecondFragment
      • 6、创建第三个碎片 - ThirdFragment
      • 7、字符串资源文件strings.xml
      • 8、主界面类MainActivity
      • 9、启动应用,查看效果
      • 10、第一个碎片界面类 - FirstFragment
      • 11、第二个碎片界面类 - SecondFragment
      • 12、第三个碎片界面类 - ThirdFragment
      • 13、启动应用,查看效果
      • 14、优化代码存在的不足
      • 15、修改主界面类,实现手势切换碎片
      • 16、启动应用,查看效果
  • 四、课后作业

零、学习目标

  1. 了解Fragment与Activity的关系
  2. 掌握Fragment的生命周期
  3. 学会编写多Fragment安卓程序

一、Fragment概述

  1. Fragment是android3.0引入的心的API,它代表Activity的子模板,所以可以把fragment理解为Activity片段。
  2. Fragment必须被“嵌入”Avtivity中使用,因此Fragment也拥有自己的生命周期,不过Fragment的生命周期受Activity所控制,也就是说Activity停止的时候,Activity中所有的Fragment都会被停止。其他状态也是一样。

二、Fragment生命周期

三、教学案例——切换碎片

(一)运行效果

(二)涉及知识点

  1. Activity (活动窗口)
  2. Fragment(碎片、片段) - 碎片化学习(Fragmental Learning)
  3. TextView(标签)
  4. Button(按钮)
  5. GestureDetector(手势侦测器)
  6. GestureListener(手势监听器)

(三)实现步骤

1、创建安卓应用【SwitchFragment】


2、将三张背景图片拷贝到drawable目录

3、主布局资源文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/container"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"></FrameLayout>

4、创建第一个碎片 - FirstFragment

  • 基于模板创建
  • 设置碎片名称 - FirstFragment

  • 修改第一个碎片的布局文件fragment_first.xml
<?xml version="1.0" encoding="utf-8"?>
<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:background="@drawable/img01"android:gravity="center"android:orientation="vertical"tools:context=".FirstFragment"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="20dp"android:text="@string/first_fragment"android:textColor="#ff0000"android:textSize="25sp" /><Buttonandroid:id="@+id/btnNextFragment"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="doNextFragment"android:text="@string/next_fragment"/>
</LinearLayout>

5、创建第二碎片 - SecondFragment

  • 基于模板创建

  • 修改第二个碎片的布局文件fragment_second.xml
<?xml version="1.0" encoding="utf-8"?>
<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:background="@drawable/img02"android:gravity="center"android:orientation="vertical"tools:context=".FirstFragment"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="20dp"android:text="@string/second_fragment"android:textColor="#00ff00"android:textSize="25sp" /><Buttonandroid:id="@+id/btnNextFragment"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="doNextFragment"android:text="@string/next_fragment"/>
</LinearLayout>

6、创建第三个碎片 - ThirdFragment

  • 基于模板创建

  • 修改第三个碎片的布局文件fragment_third.xml
<?xml version="1.0" encoding="utf-8"?>
<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:background="@drawable/img03"android:gravity="center"android:orientation="vertical"tools:context=".FirstFragment"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="20dp"android:text="@string/third_fragment"android:textColor="#0000ff"android:textSize="25sp" /><Buttonandroid:id="@+id/btnNextFragment"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="doNextFragment"android:text="@string/next_fragment"/>
</LinearLayout>

7、字符串资源文件strings.xml

<resources><string name="app_name">切换碎片</string><string name="first_fragment">第一个碎片</string><string name="second_fragment">第二个碎片</string><string name="third_fragment">第三个碎片</string><string name="next_fragment">下一个碎片</string>
</resources>

8、主界面类MainActivity

package net.hw.switch_fragment;import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 利用布局资源文件设置用户界面setContentView(R.layout.activity_main);// 获取碎片管理器FragmentManager fm = getSupportFragmentManager();// 在主容器里添加第一个碎片fm.beginTransaction().add(R.id.container, new FirstFragment()).commit();}
}

9、启动应用,查看效果

  • 此时,单击【下一个碎片】按钮,程序会报错

10、第一个碎片界面类 - FirstFragment

package net.hw.switch_fragment;import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;import androidx.fragment.app.Fragment;public class FirstFragment extends Fragment {private Button btnNextFragment;public FirstFragment() {}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// 获取碎片视图View view = inflater.inflate(R.layout.fragment_first, container, false);// 通过资源标识获得控件实例btnNextFragment = view.findViewById(R.id.btnNextFragment);// 给按钮注册监听器btnNextFragment.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {getFragmentManager().beginTransaction().addToBackStack("next").replace(R.id.container, new SecondFragment()).commit();}});        // 返回视图return view;       }
}

11、第二个碎片界面类 - SecondFragment

package net.hw.switch_fragment;import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;import androidx.fragment.app.Fragment;public class SecondFragment extends Fragment {private Button btnNextFragment;public SecondFragment() {}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// 获取碎片视图View view = inflater.inflate(R.layout.fragment_second, container, false);// 通过资源标识获得控件实例btnNextFragment = view.findViewById(R.id.btnNextFragment);// 给按钮注册监听器btnNextFragment.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {getFragmentManager().beginTransaction().addToBackStack("next").replace(R.id.container, new ThirdFragment()).commit();}});// 返回视图return view;}
}

12、第三个碎片界面类 - ThirdFragment

package net.hw.switch_fragment;import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;import androidx.fragment.app.Fragment;public class ThirdFragment extends Fragment {private Button btnNextFragment;public ThirdFragment() {}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// 获取碎片视图View view = inflater.inflate(R.layout.fragment_third, container, false);// 通过资源标识获得控件实例btnNextFragment = view.findViewById(R.id.btnNextFragment);// 给按钮注册监听器btnNextFragment.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {getFragmentManager().beginTransaction().addToBackStack("next").replace(R.id.container, new FirstFragment()).commit();}});// 返回视图return view;}
}

13、启动应用,查看效果

14、优化代码存在的不足

  • 每次切换碎片时,都是利用new来创建新的碎片,这样在不断切换碎片的过程中,就导致资源的浪费
  • 创建碎片列表类 - FragmentList - 用于保存程序要用到的碎片对象
package net.hw.switch_fragment;import androidx.fragment.app.Fragment;import java.util.ArrayList;
import java.util.List;public class FragmentList {public static List<Fragment> fragments = new ArrayList<>();
}
  • 修改主界面类MainActivity,在碎片列表类里保存程序所需要的碎片对象
package net.hw.switch_fragment;import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 利用布局资源文件设置用户界面setContentView(R.layout.activity_main);// 获取碎片管理器FragmentManager fm = getSupportFragmentManager();// 创建三个碎片,添加到碎片列表FragmentList.fragments.add(new FirstFragment());FragmentList.fragments.add(new SecondFragment());FragmentList.fragments.add(new ThirdFragment());// 在主容器里添加第一个碎片fm.beginTransaction().add(R.id.container, FragmentList.fragments.get(0)).commit();}
}
  • 修改第一个碎片界面类 - FirstFragment
  • 修改第二个碎片界面类 - SecondFragment
  • 修改第三个碎片界面类 - ThirdFragment
  • 启动应用,查看效果

15、修改主界面类,实现手势切换碎片

package net.hw.switch_fragment;import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;public class MainActivity extends AppCompatActivity {private GestureDetector detector;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 利用布局资源文件设置用户界面setContentView(R.layout.activity_main);// 获取碎片管理器FragmentManager fm = getSupportFragmentManager();// 创建三个碎片,添加到碎片列表FragmentList.fragments.add(new FirstFragment());FragmentList.fragments.add(new SecondFragment());FragmentList.fragments.add(new ThirdFragment());// 在主容器里添加第一个碎片fm.beginTransaction().add(R.id.container, FragmentList.fragments.get(0)).commit();// 实例化手势侦测器detector = new GestureDetector(new GestureDetector.OnGestureListener() {@Overridepublic boolean onDown(MotionEvent motionEvent) {return false;}@Overridepublic void onShowPress(MotionEvent motionEvent) {}@Overridepublic boolean onSingleTapUp(MotionEvent motionEvent) {return false;}@Overridepublic boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {return false;}@Overridepublic void onLongPress(MotionEvent motionEvent) {}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float v, float v1) {// 手势往左滑动10个像素,切换到下一个碎片if (e1.getX() - e2.getX() > 10) {// 获取返回栈条目个数int count = getSupportFragmentManager().getBackStackEntryCount();// 获取碎片索引int index = ++count % 3;// 切换碎片getSupportFragmentManager().beginTransaction().addToBackStack("" + index).replace(R.id.container, FragmentList.fragments.get(index)).commit();}return true;}});}/*** 将窗口的触摸事件交给收拾侦测器来处理* * @param event* @return*/@Overridepublic boolean onTouchEvent(MotionEvent event) {return detector.onTouchEvent(event);}
}

16、启动应用,查看效果

四、课后作业

给三个碎片都添加一个按钮,按钮标题依次为“冠军”、“亚军”和“季军”。

  • 单击第一个碎片的【冠军】按钮,弹出吐司,内容:我是冠军
  • 单击第二个碎片的【亚军】按钮,弹出吐司,内容:我是亚军
  • 单击第三个碎片的【季军】按钮,弹出吐司,内容:我是季军

安卓学习笔记20:Fragment入门相关推荐

  1. 2020年安卓学习笔记目录

    文章目录 一.讲课笔记 二.安卓案例 三.安卓实训项目 四.学生安卓学习博客 五.安卓课后作业 (一)界面设计练习 1.制作登录界面 2.制作部队管理界面 3.制作灭火救援界面 4.制作交付界面 5. ...

  2. Hadoop学习笔记(1) ——菜鸟入门

     Hadoop学习笔记(1) --菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户能够在不了解分布式底层细节的情况下.开发分布式 ...

  3. 逐梦旅程学习笔记 DirectX开发入门02:旋转的彩色立方体

    本文是 系列笔记DirectX部分的第2篇,上一篇参见 逐梦旅程学习笔记 DirectX开发入门01:应用程序基本框架 这个示例增加了一些实际的内容,首先是绘制一个颜色随机变幻的彩色立方体,其二是显示 ...

  4. oracle rman ora19602,学习笔记:OracleRMAN备份入门 将RMAN备份数据放到nfs远程文件系统中...

    天萃荷净 rman通过nfs备份,记录一篇关于使用RMAN备份软件,将RMAN的备份结果集存放到远程的NFS文件系统中 1.RMAN挂载至nfs文件系统 [root@oracleplus tmp]# ...

  5. Uniapp零基础开发学习笔记(5) -组件入门及容器组件使用

    Uniapp零基础开发学习笔记(5) -组件入门及容器组件使用 按照官网教程学习使用组件,并且重点把容器组件的应用进行了练习. 1.官网关于组件的介绍 组件是视图层的基本组成单元,是一个单独且可复用的 ...

  6. Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍

    Hadoop学习笔记-20.网站日志分析项目案例(一)项目介绍 网站日志分析项目案例(一)项目介绍:当前页面 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edis ...

  7. 安卓学习笔记07:事件处理、窗口跳转与传递数据

    文章目录 零.学习目标 一.三个基本控件 1.标签控件(TextView) 2.编辑框控件(EditText) 3.按钮控件(Button) 二.安卓事件处理机制 (一)安卓事件处理概述 (二)安卓事 ...

  8. iOS学习笔记-地图MapKit入门

    代码地址如下: http://www.demodashi.com/demo/11682.html 这篇文章还是翻译自raywenderlich,用Objective-C改写了代码.没有逐字翻译,如有错 ...

  9. Ext.Net学习笔记20:Ext.Net FormPanel 复杂用法

    Ext.Net学习笔记20:Ext.Net FormPanel 复杂用法 在上一篇笔记中我们介绍了Ext.Net的简单用法,并创建了一个简单的登录表单.今天我们将看一下如何更好是使用FormPanel ...

最新文章

  1. 一周飞越50万平方米,无人机检测1.5吨海滩垃圾!自动分类47种,准确率超95%
  2. element.onclick = fun与element onclick=fun()的区别
  3. 修改date格式 java_如何用Java更改日期格式?
  4. 一次面试引发的思考(中小型网站优化思考) (转)
  5. PAT 1074. Reversing Linked List (25)
  6. 【Makefile由浅入深完全学习记录6】Makefile中变量的高级主题上
  7. python可以体现数学中映射概念的是_【课时27+集合+在我的世界里+你就是唯一】 - #1...
  8. Flink 1.9 : Wordcount报错:ClassNotFoundException: yarn.exceptions.YarnException
  9. (八)mybatis之映射器
  10. web安全day30:人人都要懂的LAMP--apache服务安装和配置
  11. C语言程序设计(第三版)何钦铭著 习题3-2
  12. 解决ThinkServer TS250中网卡在centos6.5中没有安装驱动(驱动安装)
  13. h3c无线控制器ac配置
  14. 电商正当时 盘点八款开源网店系统
  15. MATLAB小波图像融合处理
  16. 【4G模块】-有方科技Neoway-N720
  17. 阿里根据截图查到泄露者,这样的技术是如何做到的?
  18. Word中插入分隔线
  19. 关于国际象棋皇后的递归问题——经典为8皇后
  20. 如何快速找到自己手机号码或邮箱注册过哪些网站

热门文章

  1. 【华为云技术分享】当我们在谈论卡片时,我们到底在谈论什么?
  2. 关于redis,学会这8点就够了
  3. java ftp 断点,java实现ftp断点续传
  4. kohana php,[php框架]kohana中文译本.pdf
  5. 【李宏毅机器学习】Why Deep Learning(p15) 学习笔记
  6. 计算机图形学E2——OpenGL Bresenham算法画直线
  7. WORD如何一键转PPT
  8. vue滚动条禁止_vue弹窗后如何禁止滚动条滚动?
  9. jQuery基础 - 改变CSS样式
  10. 用python计算准确率_Python 学习 scikit-learn 预测准确率计算