【android开发-14】android中fragment用法详细介绍

news2024/11/17 23:42:28

1,fragment是什么?
Fragment是Android中的一种组件,它在Android 3.0(API级别11)及以后的版本中引入。Fragment可以用来在Activity中添加一个或多个具有自己的用户界面的片段。它们可以与Activity进行交互,并且可以在运行时动态添加或删除。

Fragment具有自己的生命周期,可以接收属于它自己的输入事件,并且可以在Activity运行期间独立地操作每一个Fragment。例如,可以在一个Activity中重用多个Fragment,也可以在一个Fragment中使用多个Fragment。

Fragment必须被嵌入到一个Activity中,并且它们的生命周期直接受其宿主Activity的生命周期的影响。当一个Activity正在运行时,可以独立地操作每一个Fragment,例如添加或删除它们。

总的来说,Fragment提供了一种在Activity中添加具有自己用户界面的片段的机制,使得应用程序可以更好地适应不同的屏幕尺寸和设备类型,并且提供了更灵活的用户界面设计选项。

2,fragment的状态和生命周期
在Android中,Fragment具有自己的状态和生命周期,与Activity的状态和生命周期类似,但也有一些区别。

Fragment的状态主要包括以下几种:

1,活动状态(Active):当Fragment被宿主Activity所需要并且被添加到Activity中时,处于活动状态。此时,Fragment会获得焦点,并可以与用户进行交互。

2,非活动状态(Inactive):当Fragment被添加到Activity中,但宿主Activity处于暂停状态时,Fragment会处于非活动状态。此时,Fragment不会获得焦点,并且不会与用户进行交互。

3,已暂停状态(Paused):当宿主Activity处于暂停状态时,所有处于活动状态的Fragment都会进入已暂停状态。此时,Fragment不会获得焦点,但仍然可以执行某些后台任务。

4,已销毁状态(Destroyed):当Fragment从Activity中移除并且被销毁时,会进入已销毁状态。此时,Fragment的所有实例变量都将变为null,并且不能再被使用。

Fragment的生命周期主要包括以下几种:

1,onAttach():当Fragment被附加到Activity时调用。
2,onCreate():在Fragment创建后立即调用。在此方法中可以进行一些初始化操作。
3,onCreateView():在Fragment创建其布局后调用。在此方法中需要返回Fragment的布局视图。
4,onViewCreated():在Fragment创建其布局后立即调用。在此方法中可以对视图进行进一步的初始化操作。
5,onActivityCreated():在Activity的onCreate()方法完成后立即调用。在此方法中可以进行一些依赖于Activity的操作。
6,onStart():在Fragment将要出现在屏幕上时调用。
7,onResume():在Fragment准备好与用户交互时调用。
8,onPause():在Fragment将要离开前台并暂停时调用。
9,onStop():在Fragment将要从屏幕上消失时调用。
10,onDestroyView():在销毁Fragment的视图和相关资源时调用。
11,onDestroy():在销毁Fragment实例时调用。在此方法中可以进行一些清理操作。
在这里插入图片描述
3,fragment的简单参考用例
在Android中,Fragment的使用可以帮助我们实现更加丰富和动态的用户界面设计。以下是一个简单的例子,展示了如何在代码中使用Fragment。

首先,我们需要创建一个新的Fragment类。在这个例子中,我们将创建一个简单的Fragment,它包含一个TextView,用于显示一段文本。

import android.os.Bundle;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
import android.widget.TextView;  
  
import androidx.annotation.NonNull;  
import androidx.annotation.Nullable;  
import androidx.fragment.app.Fragment;  
  
public class MyFragment extends Fragment {  
    private static final String ARG_TEXT = "text";  
  
    public MyFragment() {  
        // Required empty public constructor  
    }  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
    }  
  
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  
                             Bundle savedInstanceState) {  
        // Inflate the layout for this fragment  
        return inflater.inflate(R.layout.fragment_my, container, false);  
    }  
}

然后,我们需要在布局文件(例如fragment_my.xml)中定义这个Fragment的视图。在这个例子中,我们定义了一个TextView,用于显示一段文本。

<TextView xmlns:android="http://schemas.android.com/apk/res/android"  
    android:id="@+id/textView"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:text="Hello, I'm Fragment!" />

现在,我们可以在Activity的代码中使用这个Fragment。在这个例子中,我们将在一个按钮的点击事件中创建一个新的Fragment实例,并将其添加到Activity中。

import android.os.Bundle;  
import android.view.View;  
import android.widget.Button;  
import androidx.appcompat.app.AppCompatActivity;  
import androidx.fragment.app.FragmentActivity;  
import androidx.fragment.app.FragmentTransaction;  
  
public class MainActivity extends AppCompatActivity {  
    private Button mButton;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        mButton = findViewById(R.id.button);  
        mButton.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                FragmentTransaction ft = getSupportFragmentManager().beginTransaction();  
                MyFragment myFragment = new MyFragment(); // 创建新的Fragment实例。  
                ft.add(myFragment, null); // 将Fragment添加到Activity中。注意,第一个参数是容器的id(在这个例子中,我们没有定义一个特定的容器),第二个参数是Fragment的名字(在这个例子中,我们没有指定一个名字)。如果你想在之后引用这个Fragment,你可能需要指定一个名字。  
                ft.commit(); // 提交事务。这是必须的,否则Fragment不会被添加到Activity中。你可以使用ft.commitAllowingStateLoss()来提交事务,即使在Activity被杀死后也允许状态丢失。这在一些情况下是有用的,例如在Activity被系统杀死后仍然显示通知。但是请注意,这可能会导致数据丢失。因此,在你提交事务之前,确保你已经保存了所有必要的数据。

注意:
1,创建待添加的fragment实例
2,获取fragmentManager,在活动中直接调用getSupportFragmentManager方法得到。
3,开启一个事务,通过调用beginTransaction方法开启。
4,提交事务,通过commit方法来完成。

4,fragment和activity通讯的方式
在Android中,Activity和Fragment之间的通信可以通过以下几种方式实现:

1,使用回调(Callback):你可以在Activity中创建一个接口,然后将该接口的实现传递给Fragment。这样,Fragment就可以调用该接口的方法来与Activity进行通信。
这是一个使用回调的简单例子:

首先,定义一个回调接口:

public interface MyCallback {  
    void onButtonClicked();  
}

然后,在Activity中实现这个接口:

public class MyActivity extends AppCompatActivity implements MyCallback {  
    // ...  
  
    @Override  
    public void onButtonClicked() {  
        // 这里处理按钮点击事件  
    }  
}

在Fragment中,你可以通过onAttach方法获取Activity的实例,然后调用该实例的方法:

public class MyFragment extends Fragment {  
    private MyCallback mCallback;  
  
    @Override  
    public void onAttach(Context context) {  
        super.onAttach(context);  
        try {  
            mCallback = (MyCallback) context;  
        } catch (ClassCastException e) {  
            throw new ClassCastException(getActivity().toString() + " must implement MyCallback");  
        }  
    }  
  
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
        View view = inflater.inflate(R.layout.fragment_my, container, false);  
        Button button = view.findViewById(R.id.button);  
        button.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                mCallback.onButtonClicked(); // 调用回调方法通知Activity按钮被点击了  
            }  
        });  
        return view;  
    }  
}

2,使用setArguments和getArgument:你可以在创建Fragment时,通过setArguments方法传递参数,然后在Fragment加载时,通过getArguments方法获取这些参数。但是这种方式主要用于传递数据,而不是用于通信。
3,使用findFragmentById和findFragmentByTag:你可以在Activity中使用findFragmentById和findFragmentByTag方法获取Fragment的实例,然后直接调用该实例的方法。但是这种方式需要在Activity的布局文件中为Fragment定义一个id或者tag。这种方式主要用于已经存在的Fragment之间的通信。

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

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

相关文章

查找一维向量中大于或小于某一值的所有连续片段

文章目录 经常会遇到一种场景&#xff0c;那就是有一个一维向量&#xff0c;我们要找到其中所有大于设定阈值的片段。就好比电路中有高代电平&#xff0c;我们要找连续的高电平段或低电平&#xff1a; 如上图&#xff0c;我们只要标红的高电平&#xff0c;对应代码&#xff1…

【原神游戏开发日志1】缘起

【原神游戏开发日志1】缘起 版权声明 本文为“优梦创客”原创文章&#xff0c;您可以自由转载&#xff0c;但必须加入完整的版权声明 文章内容不得删减、修改、演绎 相关学习资源见文末 大家好&#xff0c;最近看到原神在TGA上频频获奖&#xff0c;作为一个14年经验的游戏开…

智能优化算法应用:基于社会群体算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于社会群体算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于社会群体算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.社会群体算法4.实验参数设定5.算法结果6.参考…

医院信息化专业人员必备医院业务运作及管理流程知识(详细)

业务流程是一家医院运作的基础,医院所有业务都需要流程加以驱动。熟知医院各项业务,了解医院管理流程,有利于医院工作人员更好地投入自身岗位,提高工作效率。本文整理了常见医院业务运作及管理流程,仅供参考! 【门诊业务】 一、门诊业务的特点: 1.接诊病人多,就诊时…

Sui生态DeFi将参加Builder DAO举办的活动,为期三天畅谈如何Build on Sui

LeadUp the Night是一个定期举办的MeetUp活动&#xff0c;由Builder DAO邀请区块链各方项目开发者、VC担任本活动的讲师。这个活动旨在促进区块链技术的发展和应用&#xff0c;让参与者有机会开发创新的区块链应用&#xff0c;探索区块链技术的潜力。 ​​​12月4日-6日受Buil…

使用Serv-U FTP服务器共享文件,实现无公网IP环境下远程访问

文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 科技日益发展的今天&#xff0c;移动电子设备似乎成了我们生活的主角&#xff0c;智能…

网盘系统设计:万亿 GB 网盘如何实现秒传与限速?

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 网盘&#xff0c;又称云盘&#xff0c;是提供文件托管和文件上传、下载服务的网站&#xff08;File hostingservice&#xff09;。人们通过网盘保管自己拍摄的照片、视频&#xff0c;通过网盘和他人共享文件&#xff…

Kubeadm构建K8S集群指南:从环境准备到Dashboard部署的详细步骤与常见问题解决方案

文章目录 一、环境准备1、准备1主2从2、设置主机名与时区3、添加hosts网络主机配置4、关闭防火墙5、验证是否配置正确 二、安装Kubeadm1、在每个Centos上安装Docker2、确保从cgroups均在同一个从groupfs3、安装kubeadm集群部署工具4、关闭交换区5、配置网桥6、通过镜像安装k8s7…

【PCB知识】

PCB知识 1. PCB知识1.1 扩展名1.21.31.4 2.3.4.5. 1. PCB知识 1.1 扩展名 扩展名为 *.opj 的文件可以使用 Origin Project 应用程序打开。 扩展名为*.DSN文件&#xff0c;一般为isis或OrCAD电路图文件&#xff0c; OrCAD为Cadence软件组件&#xff1b; isis为Proteus软件的sc…

整数和浮点数在内存中的存储

文章目录 每日一言整数在内存中的存储方式浮点数在内存中的存储结语 每日一言 You just can’t beat the person who never gives up. 你无法打败那位永不放弃的人。 整数在内存中的存储方式 整数在内存中的存储方式通常采用二进制形式&#xff0c;即将整数的数值转化为二进制…

根据源码梳理Redisson的可重入、锁重试以及看门狗机制原理

Redisson可重入的原理 在上篇文章中我们已经知道了除了需要存储线程标识外&#xff0c;会额外存储一个锁重入次数。那么接下来我们查看使用Redisson时&#xff0c;Redisson的加锁与释放锁流程图。 当开始获取锁时&#xff0c;会先判断锁是否存在&#xff0c;如果存在再进行判断…

拒绝废话,直接开画!Python零基础教程之画图

引文 很多教程&#xff0c;开始教python&#xff0c;就是语法呀&#xff0c;字符类型这些基础的&#xff0c;虽说是基础&#xff0c;你也不能说没用。 但是&#xff0c;对于前期要快速成长的我们来说&#xff0c;属实不够看。 我们是新手&#xff0c;我们是菜鸟&#xff0c;但…

设计简单高效的短链系统

目录 引言 1. 短链系统的原理 1.1 长链接生成短码 1.2 短码映射到长链接 1.3 短码重定向 1.4 过期短 URL 清理 2. 设计与实现 2.1 数据存储 2.2 短码生成 2.3 接口设计 2.4 安全性考虑 2.5 访问性能优化 引言 在当今数字化时代&#xff0c;人们对信息的分享需求不断…

你敢挑战吗?网易面试题,用不规则的3升和5升杯子如何在无限水中得到4升水?

嗨&#xff0c;亲爱的小米粉丝们&#xff01;今天小米要和大家一起挑战一道网易产品面试题&#xff1a;3升的杯子一个&#xff0c;5升的杯子一个&#xff0c;杯子形状不规则&#xff0c;水却是无限的&#xff0c;我们要怎么得到4升的水呢&#xff1f;别急&#xff0c;小米来给你…

大文件分片上传、分片进度以及整体进度、断点续传【前端原生、后端 Koa、Node 原生】(一)

分片&#xff08;500MB&#xff09;进度效果展示 效果展示&#xff0c;一个分片是 500MB 的 分片&#xff08;10MB&#xff09;进度效果展示 大文件分片上传效果展示 前端 思路 前端的思路&#xff1a;将大文件切分成多个小文件&#xff0c;然后并发给后端。 页面构建 先在页…

百望云供应链协同解决方案入选北大创新评论产业研究案例库

11月28日-29日&#xff0c;百望云受邀出席《北大创新评论》2023 Inno China 中国产业创新大会&#xff0c;从战略构建、生态塑造、科技创新等议题出发&#xff0c;与学术专家、产业专家、企业代表共赴盛会&#xff0c;思享汇聚。会上&#xff0c;《北大创新评论产业研究案例库&…

提升--21---JMM(Java内存模型)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 JMM--Java Memory ModelJMM 定义JMM规则&#xff1a;线程间通信的步骤&#xff1a; JMM的三大特性&#xff1a;原子性&#xff08;Atomicity&#xff09;可见性&…

uniapp是否可以用vant等移动端UI库、使用步骤以及需要注意的问题

文章目录 使用vant步骤使用中遇到的问题在浏览器中的运行效果综上&#xff0c;不建议uniapp项目使用vant。 使用vant步骤 首先vant可以兼容uniapp&#xff0c;直接用vant版就好。微信小程序专用版本是&#xff1a;vant-weapp。 基本使用步骤&#xff1a; 1、安装 # 安装 Va…

Django创建基本的app应用并配置URL路径-成功运行服务

开发环境&#xff1a;Pycharm2021 Win11 首先创建虚拟环境: 可参考&#xff1a; Pycharm开发环境下创建python运行的虚拟环境&#xff08;自动执行安装依赖包&#xff09;_pycharm自动下载依赖包_heda3的博客-CSDN博客 1、安装 Django 在虚拟环境下安装pip install django …

任意密码重置+CRRF

一、XSS漏洞 在商城的搜索处&#xff0c;输入标准语句的传参直接就可以弹窗 二、逻辑漏洞-用户枚举 在用户注册界面&#xff0c;点击发送验证码&#xff0c;然后用BURP发包 更改手机号传参&#xff0c;这里手机号传参没有进行加密&#xff0c;直接用手机号的位置进行爆破 正确的…