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

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之间的通信。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MS8231/8232微功耗、高精度、轨到轨输入输出运算放大器

产品简述 MS8231/8232 是单通道、双通道的轨到轨输入输出单电源运 放。它们具有很低的功耗和较高的精度&#xff0c;很适合电池供电和便携 式电子系统。 MS8231/8232 具有稳定的单位增益特性&#xff0c;并具有 13kHz 的信 号带宽&#xff0c;使其适合电池电流检测和传…

Ant Design Pro初始化报错

今天按照官网步骤初始化项目&#xff0c;第一次报错 fatal: unable to access https://github.com/ant-design/ant-design-pro/: SSL certificate problem: unable to get local issuer certificate 致命&#xff1a;无法访问https://github.com/ant-design/ant-design-pro/&…

虾皮数据分析网站:了解Shopee市场趋势与优化运营的利器

在如今的电商时代&#xff0c;越来越多的人选择在虾皮购物&#xff08;Shopee&#xff09;平台上开设自己的店铺。然而&#xff0c;要在这个竞争激烈的市场中脱颖而出并取得成功&#xff0c;并不是一件容易的事情。为了更好地了解市场趋势、优化产品和店铺运营&#xff0c;了解…

直流负载的核心组成

直流负载的核心组成包括电源、电阻和电流表&#xff0c;电源是直流负载的能量来源&#xff0c;通常采用直流电源或电池。电阻是直流负载的负载元件&#xff0c;用于消耗电流并产生电功率。电流表用于测量通过电阻的电流大小&#xff0c;在实际应用中&#xff0c;直流负载还可能…

全屏显示功能

全屏显示功能 screenfull 依赖下载 yarn add screenfull --save-dev使用 <template><!-- 全屏的字体图标 --><header><i class"iconfont icon-quanping"> </i></header> </template> <script> import screenfull …

openGauss学习笔记-142 openGauss 数据库运维-例行维护-导出并查看wdr诊断报告

文章目录 openGauss学习笔记-142 openGauss 数据库运维-例行维护-导出并查看wdr诊断报告 openGauss学习笔记-142 openGauss 数据库运维-例行维护-导出并查看wdr诊断报告 生成快照数据需参数enable_wdr_snapshoton&#xff0c;访问WDR快照数据需要sysadmin或monadmin权限&#…

Bad file descriptor (C:\ci\zeromq_1602704446950\work\src\epoll.cpp:100)

文章目录 报错信息问题原因解决方案 报错信息 Bad file descriptor (C:\ci\zeromq_1602704446950\work\src\epoll.cpp:100) 问题原因 更新 pandas 的时候自动安装了高版本的 pyzmq 依赖库。而 jupyter 依赖的是 pyzmq19.0.2 版本的。 同时&#xff0c;如果win电脑是中文的用户…

vs-code之vue3插件

1.Vue 3 Support - All In One Vue3 代码片段突出显示了 Visual Studio Code 的格式化程序生成器 生成vue3对应的的代码 如ref等&#xff0c; 2.Volar 相信使用 VSCode 开发 Vue2 的同学一定对 Vetur 插件不会陌生&#xff0c;作为 Vue2 配套的 VSCode 插件&#xff0c;它的主…

冰酒为什么贵?一篇给你讲清楚

冰酒因为昂贵被定义为&#xff1a;颜色和价格都如同黄金的奢侈品。那么&#xff0c;号称液体黄金的冰酒为什么这么贵呢&#xff1f;云仓酒庄给大家讲讲清楚。 云仓酒庄多品牌多代言运营模式&#xff0c;邀请当红明星来出席或代言自身产品&#xff0c;找到与品牌自身形象、调性相…

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

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

如何看待 Android 面试却是 Java 面试官?

如何看待 Android 面试却是 Java 面试官&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「Android资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&…

大学生如何搭建自己的网站

这篇是我在大一的时候&#xff0c;写过的一篇文章。 前言 作为一名大学生&#xff0c;我觉得搭建个人网站很有意义。 这篇博客讲述的是这个寒假&#xff0c;我是如何从零到搭建好个人网站的过程。我提供的主要是具体的思路&#xff0c;也附带了一些零零散散的细节。时间跨度…

在用户不安装 ImageMagick 的情况下使用

需要以编程的方式配置环境变量&#xff08;手工配置也是一样的效果&#xff09; 1、首先要配置 path 将 {ImageMagick目录} 配置到path中 2、配置 MAGICK_HOME 将 {ImageMagick目录} 配置到MAGICK_HOME中 3、配置MAGICK_CODER_MODULE_PATH 将 {ImageMagick目录}\modules\…

自动驾驶:传感器初始标定

手眼标定 机器人手眼标定AxxB&#xff08;eye to hand和eye in hand&#xff09;及平面九点法标定 Ax xB问题求解&#xff0c;旋转和平移分步求解法 手眼标定AXXB求解方法&#xff08;文献总结&#xff09; 基于靶的方法 相机标定 (1) ApriTag (2) 棋盘格&#xff1a;cv::f…

分享77个菜单导航JS特效,总有一款适合您

分享77个菜单导航JS特效&#xff0c;总有一款适合您 77个菜单导航JS特效下载 链接&#xff1a;https://pan.baidu.com/s/1sfT9ONLH4ocliA1C7Z5xbQ?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0…

【Node-RED】http response收发实现

Node-RED安装 主要包括node.js 环境Node-RED的安装&#xff0c;具体可以参考这篇博客nodered-环境搭建及使用&#xff0c;讲得很全&#xff0c;还包括了基本的面板介绍&#xff0c;以及windows /linux 下的相关配置 Http 收发实现 本博客重点介绍http response 的使用&#…

我有才满足于自媒体行业的知识付费平台课程

用户管理 提供会员特权和积分奖励&#xff0c;提高用户忠诚度和购买力。 用户通过在平台上进行消费、签到、参与活动等方式获取积分&#xff0c;用于兑换丰厚奖品或提升会员等级。增强用户的参与感与忠诚度&#xff0c;提高用户粘性&#xff0c;并刺激用户的购买力。 为用户打…

IRS辅助的隐蔽通信 (IRS aided covert communication)

这里写自定义目录标题 系统模型与问题formulation系统模型Willie的检测优化问题构建 提出算法A IRS反射矩阵优化Willie的Detection Error Probability (DEP) 本文是论文 Covert Communication in Intelligent Reflecting Surface Assisted Networks With a Friendly Jammer 的阅…

网络和Linux网络_10(网络层)IP协议+分片组装+网段划分+路由

目录 1. IP协议作用和报头 1.1 IP和TCP作用 1.2 IP协议报头 2. 分片与组装 2.1 分片与组装概念 2.2 类似面试题的QA 3. 网段划分和IP地址 3.1 网段划分 3.2 IP地址分类 3.3 内外IP和公网IP地址 4. 路由和8位生存时间 4.1 路由的概念 4.2 8位生存时间 5. IP相关选…

销售人员一定要知道的6种获取电话号码的方法

对于销售来说&#xff0c;电话销售是必须要知道的销售方法&#xff0c;也是销售生涯中的必经之路。最开始我们并不清楚这么电话是从哪里来的&#xff0c;也不清楚是通过哪些方法渠道获取。那么今天就来分享给各位销售人员获取客户电话号码的方法。 1.打印自己的名片&#xff0…