安卓学习笔记20:Fragment入门
文章目录
- 零、学习目标
- 一、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、启动应用,查看效果
- 四、课后作业
零、学习目标
- 了解Fragment与Activity的关系
- 掌握Fragment的生命周期
- 学会编写多Fragment安卓程序
一、Fragment概述
- Fragment是android3.0引入的心的API,它代表Activity的子模板,所以可以把fragment理解为Activity片段。
- Fragment必须被“嵌入”Avtivity中使用,因此Fragment也拥有自己的生命周期,不过Fragment的生命周期受Activity所控制,也就是说Activity停止的时候,Activity中所有的Fragment都会被停止。其他状态也是一样。
二、Fragment生命周期
三、教学案例——切换碎片
(一)运行效果
(二)涉及知识点
- Activity (活动窗口)
- Fragment(碎片、片段) - 碎片化学习(Fragmental Learning)
- TextView(标签)
- Button(按钮)
- GestureDetector(手势侦测器)
- 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入门相关推荐
- 2020年安卓学习笔记目录
文章目录 一.讲课笔记 二.安卓案例 三.安卓实训项目 四.学生安卓学习博客 五.安卓课后作业 (一)界面设计练习 1.制作登录界面 2.制作部队管理界面 3.制作灭火救援界面 4.制作交付界面 5. ...
- Hadoop学习笔记(1) ——菜鸟入门
Hadoop学习笔记(1) --菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户能够在不了解分布式底层细节的情况下.开发分布式 ...
- 逐梦旅程学习笔记 DirectX开发入门02:旋转的彩色立方体
本文是 系列笔记DirectX部分的第2篇,上一篇参见 逐梦旅程学习笔记 DirectX开发入门01:应用程序基本框架 这个示例增加了一些实际的内容,首先是绘制一个颜色随机变幻的彩色立方体,其二是显示 ...
- oracle rman ora19602,学习笔记:OracleRMAN备份入门 将RMAN备份数据放到nfs远程文件系统中...
天萃荷净 rman通过nfs备份,记录一篇关于使用RMAN备份软件,将RMAN的备份结果集存放到远程的NFS文件系统中 1.RMAN挂载至nfs文件系统 [root@oracleplus tmp]# ...
- Uniapp零基础开发学习笔记(5) -组件入门及容器组件使用
Uniapp零基础开发学习笔记(5) -组件入门及容器组件使用 按照官网教程学习使用组件,并且重点把容器组件的应用进行了练习. 1.官网关于组件的介绍 组件是视图层的基本组成单元,是一个单独且可复用的 ...
- Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍
Hadoop学习笔记-20.网站日志分析项目案例(一)项目介绍 网站日志分析项目案例(一)项目介绍:当前页面 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edis ...
- 安卓学习笔记07:事件处理、窗口跳转与传递数据
文章目录 零.学习目标 一.三个基本控件 1.标签控件(TextView) 2.编辑框控件(EditText) 3.按钮控件(Button) 二.安卓事件处理机制 (一)安卓事件处理概述 (二)安卓事 ...
- iOS学习笔记-地图MapKit入门
代码地址如下: http://www.demodashi.com/demo/11682.html 这篇文章还是翻译自raywenderlich,用Objective-C改写了代码.没有逐字翻译,如有错 ...
- Ext.Net学习笔记20:Ext.Net FormPanel 复杂用法
Ext.Net学习笔记20:Ext.Net FormPanel 复杂用法 在上一篇笔记中我们介绍了Ext.Net的简单用法,并创建了一个简单的登录表单.今天我们将看一下如何更好是使用FormPanel ...
最新文章
- 一周飞越50万平方米,无人机检测1.5吨海滩垃圾!自动分类47种,准确率超95%
- element.onclick = fun与element onclick=fun()的区别
- 修改date格式 java_如何用Java更改日期格式?
- 一次面试引发的思考(中小型网站优化思考) (转)
- PAT 1074. Reversing Linked List (25)
- 【Makefile由浅入深完全学习记录6】Makefile中变量的高级主题上
- python可以体现数学中映射概念的是_【课时27+集合+在我的世界里+你就是唯一】 - #1...
- Flink 1.9 : Wordcount报错:ClassNotFoundException: yarn.exceptions.YarnException
- (八)mybatis之映射器
- web安全day30:人人都要懂的LAMP--apache服务安装和配置
- C语言程序设计(第三版)何钦铭著 习题3-2
- 解决ThinkServer TS250中网卡在centos6.5中没有安装驱动(驱动安装)
- h3c无线控制器ac配置
- 电商正当时 盘点八款开源网店系统
- MATLAB小波图像融合处理
- 【4G模块】-有方科技Neoway-N720
- 阿里根据截图查到泄露者,这样的技术是如何做到的?
- Word中插入分隔线
- 关于国际象棋皇后的递归问题——经典为8皇后
- 如何快速找到自己手机号码或邮箱注册过哪些网站
热门文章
- 【华为云技术分享】当我们在谈论卡片时,我们到底在谈论什么?
- 关于redis,学会这8点就够了
- java ftp 断点,java实现ftp断点续传
- kohana php,[php框架]kohana中文译本.pdf
- 【李宏毅机器学习】Why Deep Learning(p15) 学习笔记
- 计算机图形学E2——OpenGL Bresenham算法画直线
- WORD如何一键转PPT
- vue滚动条禁止_vue弹窗后如何禁止滚动条滚动?
- jQuery基础 - 改变CSS样式
- 用python计算准确率_Python 学习 scikit-learn 预测准确率计算