使用Fragement(碎片)

news/2024/7/7 22:08:23

一、Fragment简介

屏幕大小的差距可能会使同样的界面在不同设备上显示出不同的效果,为了能同时兼顾到手机和平板电脑的开发,从Android3.0版本开始提供了Fragment。

Fragment(碎片)是一种嵌入在Activity中的UI片段,它可以用来描述Activity中的一部分布局。如果Activity界面布局中的控件比较多,比较复杂,那么Activity管理起来就很麻烦,我们可以使用Fragment把屏幕划分成几个片段,进行模块化管理,从而可以充分地利用屏幕的空间。

一个Activity中可以包含多个Fragment,一个Fragment也可以在多个Activity中使用,如果在Activity中有多个相同的业务模块,则可以复用Fragment。

Fragment具有节省资源的优势。

二、Fragment的生命周期

Activity生命周期有5种状态,分别是启动状态、运行状态、暂停状态、停止状态销毁状态。因为Fragment是被嵌入Activity中使用,所以它的生命周期的状态直接受其所属Activity的生命周期状态影响。当在Activity中创建Fragment时,Fragment处于启动状态;当Activity被暂停时,其中的所有Fragment也被暂停;当Activity被销毁时,其中的所有Fragment也被销毁。当Activity处于运行状态时,可以单独地对每一个Fragment进行操作,如添加或删除,当进行添加操作时,Fragment处于启动状态;当进行删除操作时,Fragment处于销毁状态。

添加Fragment -> onAttach() Fragment和Activity建立关联时调用 -> onCreate() -> onCreateView() Fragment创建视图(加载布局)时调用 -> onActivityCreated() Fragment相关联的Activity已经创建完成时调用 -> onStart() -> onResume() -> 用户点击返回键或Fragment被移除或替换 / 当Fragment被添加到返回栈,然后被移除或替换 -> onPause() -> onStop() -> onDestoryView() Fragment关联的视图被移除时调用 -> onDestory() -> onDetach() Fragment和Activity解除关联时调用 -> Fragment被销毁

三、创建Fragment

public class MyFragment extends Fragment {
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {

        //如果有传入参数
        //Bundle bundle=getArguments();

        // 在此处通过 inflater 来加载 Fragment 的布局
        // container 参数是父级视图(即在其中创建该 Fragment 的 ViewGroup)
        // savedInstanceState 参数包含了之前保存的状态,可用于恢复先前的状态
        
        View view=inflater.inflate(R.layout.myfragment_layout,container,false);
        //R.layout.myfragment_layout是MyFragment的XML布局文件
        return view;
        
    }
}

 getArgments()方法在有传入参数时使用。

第三个参数(Bundle savedInstanceState)包含了之前保存的状态,可用于恢复先前的状态。

四、在Activity中添加Fragment

1.在XML布局文件中静态添加Fragment

在Activity引用的布局文件中添加Fragment时,需要使用<fragment></fragment>标签,该标签与其他控件的标签类似,但必须指定 android:name 属性,其属性值为Fragment的全路径名称

例.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <fragment
        android:name="com.example.myTest.MyFragment"
        android:id="@+id/myFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    
</RelativeLayout>

2.Activity中动态加载Fragment

当Activity运行时,也可以将Fragment动态添加到Activity中:

(1) 创建Fragment的对象

(2) 获取Fragment管理器(FragmentManager)的实例

(3) 开启FragmentTransaction(事务)

(4) 向Activity布局容器(一般为FrameLayout)中添加Fragment对象

(5) 通过commit()方法提交事务

//创建碎片实例
MyFragment myFragment=new MyFragment();

//获取碎片管理器
FragmentManager fragmentManager=getFragmentManager();

//开始事务
FragmentTransaction fragmentTransaction = fragmentManager .beginTransaction();

//添加Fragment对象: 第一个参数为布局容器资源id,要添加的Fragment对象
fragmentTransaction .replace( R.id.frameLayout , myFragment );

//提交事务
fragmentTransaction .commit();

四、Fragment中参数

Fragment传递进的参数或自定义变量,会在屏幕旋转时丢失。

可用 setArguments(Bundle b)getArguments()

setArguments(Bundle b) 需在 commit() 前使用。

//创建碎片实例
MyFragment myFragment=new MyFragment();


//创建Bundle
Bundle bundle=new Bundle();

//添加序列化信息及其他类型信息
bundle.putSerializable((Serializable)(MyActivity.this));
bundle.putInt("key",12345);

//向碎片中添加参数(Bundle)
myFragment.putArguments(Bundle);


//获取碎片管理器
FragmentManager fragmentManager=getFragmentManager();
//开始事务
FragmentTransaction fragmentTransaction = fragmentManager .beginTransaction();
//添加Fragment对象: 第一个参数为布局容器资源id,要添加的Fragment对象
fragmentTransaction .replace( R.id.frameLayout , myFragment );
//提交事务
fragmentTransaction .commit();

五、推荐用法

不推荐使用 .replace() ,每次都会重新构建一次Fragment。

推荐使用 .add( R.id.relativeLayout , myFragment ) .hide( myFragment ) .show( myFragment )


http://lihuaxi.xjx100.cn/news/1710070.html

相关文章

C++(boost):通过boost::process::child同步调用其他程序

boost提供了boost::process::child,可以通过其调用其他程序,并获得输出: #include <boost/process/child.hpp> #include <boost/process/io.hpp> #include <vector> #include <iostream> #include <string> #include <tuple>using nam…

leetcode:2347. 最好的扑克手牌(python3解法)

难度&#xff1a;简单 给你一个整数数组 ranks 和一个字符数组 suit 。你有 5 张扑克牌&#xff0c;第 i 张牌大小为 ranks[i] &#xff0c;花色为 suits[i] 。 下述是从好到坏你可能持有的 手牌类型 &#xff1a; "Flush"&#xff1a;同花&#xff0c;五张相同花色的…

MTK6737安卓核心板-MT6737核心板_4G安卓模块

MT6737核心板以竞争力的价格提供出色的性能和功耗效率&#xff0c;降低了BOM、GMO和内存成本&#xff0c;符合以价值为导向的市场需求。该核心板是一种先进的解决方案&#xff0c;为终端用户提供了高品质又经济实惠的体验。它与全球范围内的IMS兼容&#xff0c;支持VoLTE、ViLT…

msvcr100.dll丢失怎样修复,msvcr100.dll丢失怎么解决(最新方法分享)

我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcr100.dll丢失”。这个错误通常会导致某些程序无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些措施来修复丢失的msvcr100.dll文件。本文将介绍五个有效的解决方法&#xff0c;帮助大家解决这一问题。 一…

并发编程常见面试题(超详细)

文章目录 并发编程进程和线程的区别并发和并行的区别创建线程的方式线程之间的状态&#xff0c;状态之间的转换新建三个线程&#xff0c;如何保证按顺序执行wait方法和sleep的区别如何停止一个正在运行的线程synchronized关键字底层原理Monitor属于重量级锁&#xff0c;了解过锁…

后台交互-个人中心->小程序登录微信登录接口演示,小程序授权登录理论,小程序授权登录代码演示,微信表情包存储问题

小程序登录微信登录接口演示小程序授权登录理论小程序授权登录代码演示微信表情包存储问题 1.小程序登录微信登录接口演示 推荐使用 wx.getUserProfile 获取用户信息&#xff0c;开发者每次通过该接口获取用户个人信息均需用户确认 // pages/index/index.js Page({data: {user…

自然语言处理---RNN经典案例之构建人名分类器

1 案例介绍 关于人名分类问题&#xff1a;以一个人名为输入, 使用模型帮助判断它最有可能是来自哪一个国家的人名&#xff0c;这在某些国际化公司的业务中具有重要意义&#xff0c;在用户注册过程中&#xff0c;会根据用户填写的名字直接给他分配可能的国家或地区选项&#xff…

出差学小白知识No6:LD_PRELOAD变量路径不对找不到库文件

交叉编译的时候出现以下问题&#xff0c;显示LD_PRELOAD变量找不到路劲 首先先查看一下LD_PRELOAD的路径&#xff1a;echo $LD_PRELOAD 如果输出一大串&#xff0c;那么先进行清空&#xff1a;unset LD_PRELOAD 重新给LD_PRELOAD进行赋值他的路径和库文件&#xff1a; expor…