《第一行代码》核心知识点:活动(Activity)的儿子叫碎片(Fragment)

news2024/11/24 1:17:47

《第一行代码》核心知识点:活动Activity的儿子叫碎片Fragment

  • 前言
  • 四、活动(Activity)的儿子叫碎片(Fragment)
    • 4.1 碎片是神马?
    • 4.2 碎片的基本使用
    • 4.3 向容器中动态添加碎片
    • 4.4 活动与碎片之间通信方法
    • 4.5 碎片的生命周期
    • 4.6 使用限定符动态加载布局
  • 参考书籍:第一行代码

前言

本文讲解Android中的碎片(Fragment),它与活动非常相似,通常可以称为迷你Activity。通过本文你可以了解什么是碎片,它的作用是什么,以及它的基本使用方法和生命周期。

四、活动(Activity)的儿子叫碎片(Fragment)

4.1 碎片是神马?

碎片可以理解为迷你型的活动,它可以作为一个UI片段嵌入到活动中,简单来说一个活动中可以嵌入多个碎片。通过活动可以有效的充分利用屏幕空间,如展示一个新闻界面,普通的手机屏幕,我们将标题和内容分为放在两个活动中,如下图所示。
在这里插入图片描述
但是,如果一个平板采用这样的设计方案,会导致标题页有很多的空余空间,如下图所示:
在这里插入图片描述
此时,就可以采用碎片解决这个问题,可以在一个活动中嵌入两个碎片,一个碎片用于展示标题,另一个碎片用于展示内容,如下图所示。
在这里插入图片描述

4.2 碎片的基本使用

碎片的具体使用方法非常简单,它与上面3.3讲解的创建自定义控件类似,其实也可以把碎片看做一种特殊的自定义控件,具体步骤如下:

  1. 创建碎片布局(xml)
  2. 创建碎片类继承自Fragment,重写onCreateView加载创建的布局
  3. 在活动布局中引用该碎片类即可(像用其它普通控件一样)

如将一个活动中嵌入两个碎片,一个碎片在左侧,一个碎片在右侧

  1. 创建两个碎片的布局
    a. 左侧碎片布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn_test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Button"/>

</LinearLayout>

b. 右侧碎片布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:background="#E41818"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="20sp"
        android:text="right fragment"/>

</LinearLayout>
  1. 创建两个碎片对应的继承自Fragment的类
    a. 左侧碎片类
public class LeftFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.left_fragment, container, false);
        return view;
    }
}

b. 右侧碎片类

public class RightFragment extends Fragment {
    //为碎片创建视图
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.right_fragment, container, false);
    }
}
  1. 在活动在引入这两个碎片
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!--name需要完整的包名-->
    <fragment
        android:id="@+id/left_fragment"
        android:name="com.xiaomi.fragmenttest.LeftFragment"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent" />

    <fragment
        android:id="@+id/right_fragment"
        android:name="com.xiaomi.fragmenttest.RightFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>
</LinearLayout>
  1. 运行效果
    在这里插入图片描述

4.3 向容器中动态添加碎片

核心代码如下

        //获取碎片管理器
        FragmentManager fragmentManager = getSupportFragmentManager();
        //获取碎片事务
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        //向容器中添加或者替换碎片,一般用replace方法
        transaction.replace(R.id.right_fragment,fragment);
        //transaction.add(R.id.right_layout,fragment);
        //将fragment添加到返回栈中
        transaction.addToBackStack(null);
        //提交事务
        transaction.commit();

4.4 活动与碎片之间通信方法

碎片虽然嵌入在活动中,但是碎片和活动分别是一个单独的类,因此如何实现在活动调用碎片的方法,或者在碎片调用活动的方法呢?

  1. 在活动调用碎片的方法
    FragmentManager类下提供了类似findViewById的方法findFragmentById方法来获取碎片的实例,获取碎片实例后,我们就可以对碎片的方法进行调用了。
RightFragment rightFragment = (RightFragment) getSupportFragmentManager().findFragmentById(R.id.right_fragment);
  1. 在碎片调用活动的方法
    碎片中提供了getActivity方法用来获取该碎片所在活动的实例,通过该实例可以调用活动中的方法。
 MainActivity mainActivity = (MainActivity) getActivity();

4.5 碎片的生命周期

  • 碎片的四种状态

因为碎片嵌入在活动中,所以碎片的状态与活动相关联,随着活动状态的变化,碎片也有相应的变化。活动的状态特征请参考上文2.3.2

  1. 运行状态:碎片可见,且活动处于运行状态
  2. 暂停状态:碎片可见,活动处于暂停状态
  3. 停止状态:碎片不可见,当活动处于停止状态,或者调用FragmentTransaction的remove,replace方法将碎片移除,并在事务提交之前调用addToBackStack方法将移除的碎片添加到了返回栈中,此时的碎片进入停止状态。
  4. 销毁状态:当活动被销毁,或者调用FragmentTransaction的remove,replace方法将碎片移除,但在事务提交之前没有调用addToBackStack方法将移除的碎片添加到了返回栈中,此时的碎片进入销毁状态。
  • 碎片的整个生命周期的回调函数

碎片的回调函数与活动类似,只是比活动多了几个回调方法:

  1. onAttach 碎片与活动建立关联时调用
  2. onCreateView 为碎片创建视图(加载碎片布局)时调用
  3. onActivityCreated 确保碎片与相关联的活动已经创建完成时调用
  4. onDestroyView 当与碎片关联的视图移除时调用
  5. onDetach 当碎片和活动解除关联时调用

我们可以将一个碎片类的所有回调函数打印log,通过log了解回调函数的调用时期,示例代码:

public class RightFragment extends Fragment {
    private static final String TAG = "RightFragment";

    //碎片与活动建立关联
    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        Log.d(TAG, "onAttach: 1. 碎片与活动建立关联");
    }

    //创建活动
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate: 2. 创建活动");
        MainActivity mainActivity = (MainActivity) getActivity();
    }

    //为碎片创建视图
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        Log.d(TAG, "onCreateView: 3. 为碎片创建视图");
        return inflater.inflate(R.layout.right_fragment, container, false);
    }

    //确保碎片与相关联的活动已经创建完成
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.d(TAG, "onActivityCreated: 4. 确保碎片与相关联的活动已经创建完成");
    }

    //活动启动
    @Override
    public void onStart() {
        super.onStart();
        Log.d(TAG, "onStart: 5. 活动启动");
    }

    //活动一切准备就绪
    @Override
    public void onResume() {
        super.onResume();
        Log.d(TAG, "onResume: 6. 活动一切准备就绪");
    }

    //活动进入暂停状态 ==>onResume
    @Override
    public void onPause() {
        super.onPause();
        Log.d(TAG, "onPause: 7. 活动进入暂停状态");
    }

    //活动停止 ==>onStart
    @Override
    public void onStop() {
        super.onStop();
        Log.d(TAG, "onStop: 8. 活动停止");
    }

    //与碎片关联的视图移除 ==>onCreateView
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d(TAG, "onDestroyView: 9. 与碎片关联的视图移除");
    }

    //销毁活动
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: 10. 销毁活动");
    }

    //碎片和活动解除关联==>OnAttach
    @Override
    public void onDetach() {
        super.onDetach();
        Log.d(TAG, "onDetach: 11. 碎片和活动解除关联");
    }
}

当活动启动时log如下:
在这里插入图片描述

4.6 使用限定符动态加载布局

如何让程序自动根据当前屏幕的大小动态加载合适的布局呢?
Android提供了一系列限定符,如下图所示:
在这里插入图片描述
比如我们在res目录下创建一个layout-large文件夹,然后在这个文件夹下创建针对大屏幕情况下的主页布局activity_main.xml文件;我们也可以在res目录下创建一个layout-xlarge文件夹,然后在这个文件夹下创建针对超大屏幕情况下的主页布局activity_main.xml文件;

上表的一系列限定符系统有默认的大小,比如多大的屏幕算大,系统有自己默认的值,如果我们想要自己设定多大的大小算大,可以采用宽度限定符。如我们在res目录下创建一个layout-sw600dp文件夹,那么当屏幕宽度大于600dp则加载这个文件夹下的布局,否则加载默认的layout文件夹下的布局。

参考书籍:第一行代码

链接:https://pan.baidu.com/s/1aXtOQCXL6qzxEFLBlqXs1Q?pwd=n5ag
提取码:n5ag

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重载单目运算符以及重载运算符的注意事项

一、单目运算符的重载 单目运算符可分为两种&#xff1a; 1&#xff09;可以放在前面&#xff0c;也可以放在后面的单目&#xff0c;如&#xff1a; -- 2&#xff09;只能放在前面的运算符&#xff1a;&#xff01; &#xff08;正号&#xff09; -&#xff08;负号&#x…

Python函数详解(四)——Python函数参数使用注意事项

今天继续给大家介绍Python相关知识&#xff0c;本文主要内容是Python函数参数使用注意事项。 在上文Python函数详解&#xff08;三&#xff09;——函数的参数传递进阶中&#xff0c;我们学习了函数参数的进阶内容。今天&#xff0c;我们来学习函数的参数使用注意事项。 一、P…

【微信小程序】使用 Cryptiojs 解密微信绑定手机号码

很抱歉断更了一段时间&#xff0c;因为最近在做一个项目比较忙&#xff0c;正好项目中小程序板块需要解密手机号码来提交给接口&#xff0c;小程序中虽然提供了获取手机号按钮点击事件&#xff1a;bindgetphonenumber&#xff0c;但是该事件的处理函数中只能获取到加密过的手机…

关于如何调节Mahony AHRS算法的参数

文章目录一、Mahony算法的控制系统特征多项式二、Kp, Ki参数调节方法三、其他自适应调参法我在之前的博客AHRS互补滤波&#xff08;Mahony&#xff09;算法及开源代码中曾提及Mahony算法的难点在于如何调节PI参数。 最近看到参考文献[1]&#xff0c;提出了基于无阻尼自由频率设…

C# 将一种类型的数组转换为另一种类型的数组

将一种类型的数组转换为另一种类型的数组 public static TOutput[] ConvertAll<TInput, TOutput>(TInput[] array, Converter<TInput, TOutput> converter); 参数: array: 要转换为目标类型的从零开始的一维 System.Array。 converter: …

【数据结构与算法】杨辉三角,相同字符的截取以及扑克牌

✨个人主页&#xff1a;bit me ✨当前专栏&#xff1a;数据结构 ✨每日一语&#xff1a;不要等到了你的人生垂暮&#xff0c;才想起俯拾朝花&#xff0c;且行且珍惜。 ArrayList题训&#x1f335; 一. 杨辉三角&#x1f334;二.相同字符的截取&#x1f332;三.扑克牌&#x1f…

【SpringCloud】02 搭建springcloud微服务项目,服务治理组件nacos,负载均衡ribbon,远程调用Openfeign

文章目录搭建springcloud微服务项目1. 微服务父工程2. 创建子模块-shop-common3. 创建子模块--shop-product4. 创建子模块--shop-order服务治理组件1. 如何使用nacos2. 微服务客户端连接到nacos注册中心3. 消费端如何通过nacos调用提供者负载均衡1. 自己控制负载均衡2. ribbon完…

Nginx配置SSL证书

目录 获得证书 步骤一&#xff1a;购买证书 步骤二&#xff1a;申请证书 ​编辑 下载证书及证书转换&#xff1a;​编辑 配置SSL证书 在Nginx目录下新建certificate目录&#xff0c;并将下载好的证书/私钥等文件上传至该目录&#xff08;与配置文件同级目录&#xff09;。…

LiDAR点云转换到大地坐标系——简单粗标定

目录一、LiDAR和IMU位姿标定1.1安装角度标定1.2安装位置标定1.3部分代码二、点云转换到当地水平坐标系2.1基本理论2.1.1坐标系2.1.1.1激光雷达2.1.1.2导航坐标系/当地水平坐标系/大地坐标系2.1.2惯性传感器原理2.2点云转换试验2.2.1试验场地2.2.2试验内容2.2.3点云变换效果Wind…

C语言日记 37 类的友元(1)(全局函数做友元)

根据36 类和对象-友元-全局函数做友元_哔哩哔哩_bilibili复现出如下代码&#xff1a; 一、&#xff08;只是&#xff09;访问&#xff08;公开&#xff09;内部成员&#xff1a; #include <iostream> using namespace std; class Building { private:int ws;//卧室 pub…

NewStarCTF 公开赛-web

week1 HTTP cookie 修改admin 源码发现key GET和POST传参即可 Head?Header! User-Agent: CTF Referer: ctf.com X-Forwarded-For: 127.0.0.1我真的会谢 信息泄露 robots.txt www.zip 源码 /.index.php.swp NotPHP 函数绕过 if(file_get_contents($_GET[data]) &qu…

数据备份一般有哪些方式,如何进行数据备份

在如今这个时代&#xff0c;数据于我们而言是特别重要的&#xff0c;一旦发生丢失&#xff0c;可能会带来严重后果&#xff0c;如果你也很苦恼如何保证这些重要数据的安全&#xff0c;小编建议一定要对重要数据进行备份&#xff0c;以防发生丢失的意外。数据备份一般有哪些方式…

设计一个缓存策略,动态缓存热点数据

&#x1f468;‍&#x1f4bb;个人主页&#xff1a; 才疏学浅的木子 &#x1f647;‍♂️ 本人也在学习阶段如若发现问题&#xff0c;请告知非常感谢 &#x1f647;‍♂️ &#x1f4d2; 本文来自专栏&#xff1a; 常见场景解决方案 &#x1f308; 每日一语&#xff1a;努力不一…

C语言 0 —— 信息在计算机中的表示

计算机的电路 由 逻辑门电路组成。一个逻辑门电路可以看成为一个开关&#xff0c;每个开关的状态是“开” 则 高电位 对应 1 或者 “关” 则 低电位 对应 0 &#xff0c; 那么1和0 刚刚好用二进制数来表示&#xff1a; 每个位只能取1和0 &#xff0c;称为 one 个 bit &#…

谈一谈关于Linux内核编译详解原理

前言&#xff1a;为什么要做这个启动盘&#xff0c;因为内核编译是很危险的&#xff0c;中间出了错系统则直接崩溃&#xff0c;然后就无法开机了&#xff0c;你将看到一个_在你的左上角闪烁。知道启动盘可以帮你从外置设备启动系统&#xff0c;能启动系统才能恢复系统。1.编译前…

Java 线程和反射---尚硅谷Java视频学习

1.Java程序在运行得时候默认就会产生一个进程2.这个进程会有一个主线程3.代码都在主线程中执行 线程的生命周期 线程的执行方式 public class Java02_Thread {public static void main(String[] args) throws Exception {// TODO 线程 - 执行方式&#xff08;串行&#xff0c…

ASP.NET Core 3.1系列(14)——分布式缓存Redis的使用

1、前言 前一篇博客介绍了ASP.NET Core中本地缓存MemoryCache的使用方法。相较于本地缓存&#xff0c;分布式缓存更加适合大多数项目应用场景&#xff0c;下面就来介绍一下如何在ASP.NET Core中对Redis缓存进行相关操作。 2、分布式缓存接口——IDistributedCache 对于分布式…

pytorch深度学习实战24

第二十四课 VGG网络 VGG是Oxford的Visual Geometry Group的组提出的&#xff08;大家应该能看出VGG名字的由来了&#xff09;。该网络是在ILSVRC 2014上的相关工作&#xff0c;主要工作是证明了增加网络的深度能够在一定程度上影响网络最终的性能。VGG有两种结构&#xff0c;分…

远程重启电脑

一、设置电脑允许自动启动 在远程计算机上编辑设置远程注册表 步骤1. 按“WindowsR”键调用运行对话框。输入“services.msc”并点击“确定”。 步骤2. 在“服务”窗口中&#xff0c;双击“RemoteRegistry”以检查其状态。 步骤3. 将启动类型更改为“自动”。 二、查找远程计…

SPARKSQL3.0-各阶段自定义扩展规则源码剖析

一、前言 这一节主要介绍如何自定义扩展各阶段规则 虽然spark内部提供了很多优化规则&#xff0c;但在实际工作中&#xff0c;经常因为业务需求需要自定义扩展优化器或解析器&#xff0c;故自己实现一个优化器才对sparksql有更深的理解 二、扩展范围 spark在扩展方便做的很…