03 Android基础--fragment

news2024/9/30 9:24:30

03 Android基础--fragment

    • 什么是fragment?
    • fragment生命周期?
    • 动态的fragment与静态的fragment
    • fragment常用的两个类与API
    • Fragment与Activity通信

什么是fragment?

碎片,一个activity中可以使用多个fragment,可以把activity看成碎片的容器。fragment也有自己的生命周期

fragment生命周期?

在这里插入图片描述
需要知道的是
创建和重建过程: Activity生命周期优先于Fragment

暂停和销毁过程: Fragment生命周期优先于Activity

动态的fragment与静态的fragment

一个xml写,一个用Java代码写。

// 静态的fragment

// 第一步:编写fragment所需要的XML文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
    tools:context=".BlankFragment1">


    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="30dp"/>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:text="Button" />
</FrameLayout>



// 第二步:编写activity所需要的XML文件,把fragment的XML定位到activity所需的XML文件中。
<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <!-- name为确定 这个fragment绑定的哪个,id必须设置,因为资源管理会使用。一个avtivity可以包含多个fragment-->
    <fragment
        android:id="@+id/fragment1"
        android:name="com.example.fifthdemo_framgent_01.BlankFragment1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

</LinearLayout>


// 第三步:编写fragment本身的代码
public class BlankFragment1 extends Fragment {


    private View root;
    private TextView textView;
    private Button button;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (root == null) {
            root = inflater.inflate(R.layout.fragment_blank1, container, false);
        }

        textView = root.findViewById(R.id.textView);
        button = root.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                textView.setText("button setOnClickListener");
            }
        });

        return root;
    }
}

// 第四步:编写activity。这个时候,fragment就会被渲染到activity中了。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

// 动态的fragment:一般都用这个

// 第一步:编写fragment所需要的XML文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
    tools:context=".BlankFragment1">


    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="30dp"/>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:text="Button" />
</FrameLayout>


// 第二步:编写fragment本身的代码
public class BlankFragment1 extends Fragment {


    private View root;
    private TextView textView;
    private Button button;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (root == null) {
            root = inflater.inflate(R.layout.fragment_blank1, container, false);
        }

        textView = root.findViewById(R.id.textView);
        button = root.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                textView.setText("button setOnClickListener");
            }
        });

        return root;
    }
}



// 第三步:编写activity所需要的XML文件
<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">


 	<Button
        android:id="@+id/bt1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="add fragment" />

    <Button
        android:id="@+id/bt2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="repalce" />

 <!-- fragment的容器,将来动态创建的fragment直接放这里面-->
    <FrameLayout
        android:id="@+id/framelayout_1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#A68EA3"/>

</LinearLayout>


// 第四步:编写activity,动态的创建fragment
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button1 = findViewById(R.id.bt1);
        button1.setOnClickListener(this);

        Button button2 = findViewById(R.id.bt2);
        button2.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {   //点击事件
        switch (view.getId()) {
            case R.id.bt1:  replaceFragment(new BlankFragment1());
                            break;
            case R.id.bt2:  replaceFragment(new ItemFragment2());
                            break;
        }
    }

    private void replaceFragment(Fragment fragment) {
        //获取Fragment的管理器类 FragmentManager
        FragmentManager fragmentManager = getSupportFragmentManager();
        //获取 FragmentManager中用于 Fragment 替换之类的类 FragmentTransaction
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        //创建一个替换Fragment的事件
        transaction.replace(R.id.framelayout_1,fragment);   // 替换的是framelayout_1中的fragment
        //将新的Fragment对象压入一个栈内,点击back会进行回退,而非退出app
        transaction.addToBackStack(null);
        //提交事件
        transaction.commit();
    }
}

补充:FragmentManager支持链式调用:

// FragmentManager支持链式调用:
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
    .replace(R.id.fragment_container, ExampleFragment.class, null)
    .setReorderingAllowed(true)
    .addToBackStack("name") // name can be null
    .commit();

fragment常用的两个类与API

常用的类

  • FragmentManager :顾名思义是负责管理Fragment的管理类,可以对Fragment进行添加、移除、替换等操作。在activity中操作。
  • FragmentTransaction :通过FragmentManager获得,保证了fragment操作的原子性。

常用的API

  1. FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务
  2. transaction.add();//让Activity中添加一个Fragment
  3. transaction.remove();//从Activity移除一个Fragment,如果被移除的
    Fragment没有添加到回退栈,这个Fragment事例将会被销毁。
  4. transaction.replace();//使用另一个Fragment替换当前到,就相当于remove()以后,再add()
  5. transaction.hide();//隐藏当前的Fragment。
  6. Transaction.show();//显示之前隐藏的Fragment
  7. detach();//将view从UI中移除和remove()不同,此时Fragment的状态依然由FragmentManager维护。
  8. attach();重建view视图,附加到UI上并显示。
  9. transaction.commit();//提交一个事务。

Fragment与Activity通信

有很多种,接下来说一些常用的

  • 通过构造器
  • 通过ViewModel
  • 通过EventBus
  • 通过接口回调
  • 通过Handler
  • 通过广播

接下来介绍两种最常用的:

       // 通过构造器,在activity中。
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        Fragment fragTop = new FrameTop();
        fragmentTransaction.replace(R.id.frame1,fragTop);
        Bundle bundle = new Bundle();
        fragTop.setArguments(bundle);
        bundle.putString("name","fragTop");
        fragmentTransaction.commit();



    // 在fragment中获取
    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        Bundle arguments = getArguments();
        String name = arguments.getString("name");
    }

// 通过viewModel,将来这个最常用
// 官方文档代码示例:
public class SharedViewModel extends ViewModel {
    private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

    public void select(Item item) {
        selected.setValue(item);
    }

    public LiveData<Item> getSelected() {
        return selected;
    }
}

public class ListFragment extends Fragment {
    private SharedViewModel model;

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
        itemSelector.setOnClickListener(item -> {
            model.select(item);
        });
    }
}

public class DetailFragment extends Fragment {

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
        model.getSelected().observe(getViewLifecycleOwner(), item -> {
           // Update the UI.
        });
    }
}

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

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

相关文章

应用模型开发指南上新介绍

Module、HAP、Ability、AbilitySta-ge、Context……您是否曾经被这些搞不懂又绕不开的知识点困扰&#xff1f; 现在&#xff0c;全新的《应用程序包基础知识》及《应用模型开发指南》为您答疑解惑&#xff01; 这里有您关注的概念解析、原理机制阐述&#xff0c;也有丰富的…

gitlab+idea回退代码并提交到新分支

目录结构前言idea创建新分支查看代码提交记录使用IntelliJ IDEA获取使用Git Bash Here获取代码回退到指定版本回退执行命令行使用IntelliJ IDEA实现使用Git Bash Here实现回退完成验证idea提交指定版本代码验证分支代码推动成功前言 IntelliJ IDEA GitLab开发过程中需将代码回…

ajax调用restful接口

HTTP动词对应操作POST新增信息GET获取信息PUT更新信息DELETE删除信息一、POST-----新增信息 1. 后台接口 PostMapping(value "/save") public String save(RequestBody(required true) Emp emp){System.err.println(emp.toString());// 将数据信息存库empService.…

Android开发面试【金三】——启动优化

前言 一下子来到了&#xff0c;面试的高潮季。金三银四的三月份&#xff1b;在我们Android开发的众多面试中&#xff0c;扑面而来的超多面试题难道很多程序员。 Android的性能优化&#xff0c;主要是从以下几个方面进行优化的&#xff1a; 稳定&#xff08;内存溢出、崩溃&am…

安全认证--JWT介绍及使用

安全认证--JWT介绍及使用1.无状态登录原理1.1.什么是有状态&#xff1f;1.2.什么是无状态1.3.如何实现无状态1.4.JWT1.4.1.简介1.4.2.数据格式2.编写JWT工具2.1.添加JWT依赖2.2.载荷对象2.3.工具2.4.测试2.4.1.配置秘钥2.4.2.测试类2.5项目源码1.无状态登录原理 有状态登录和无…

G1D54-CRF

一、CRF的输入X是什么&#xff1f;是构造的特征吗&#xff1f; 如此&#xff0c;CRF的x只用于状态函数吗&#xff1f; CRF的例子解释调用代码 机器之心 知乎忆榛 此处线性链条件随机场的特征函数形式被统一了&#xff1f; BilstmCRF&#xff0c;强烈推荐&#xff01;&#x…

AM402和SV660N、IS620N运动控制

软件&#xff1a;InoProShop(V1.7.3) 1、添加EtherCAT伺服从站 2、PLC运动控制程序和ETHERCAT在一个任务中。 3、编码器脉冲设置。 注意电机转速值是以秒还是分钟计量单位。 SV660N IS620N 4、设置电机停机方式。使用sin停机效果比较圆滑&#xff0c;默认梯形。 5、库管理器…

广和通携手联发科技正式发布基于MediaTek T830 平台5G模组FG370的可快速落地FWA解决方案

2月28日&#xff0c;全球领先的物联网无线通信解决方案和无线通信模组提供商广和通正式宣布&#xff1a;新一代5G模组FG370已率先实现量产&#xff0c;并于2023世界移动通信大会&#xff08;MWC Barcelona 2023&#xff09;期间携手联发科技正式发布基于FG370的FWA解决方案&…

十三、MyBatis的缓存

缓存&#xff1a;cache 缓存的作用&#xff1a;通过减少IO的方式&#xff0c;来提高程序的执行效率。 mybatis的缓存&#xff1a;将select语句的查询结果放到缓存&#xff08;内存&#xff09;当中&#xff0c;下一次还是这条select语句的话&#xff0c;直接从缓存中取&#xf…

数字信号复习题纲

数字信号复习题纲一、希尔伯特变换器&#xff08;:heavy_check_mark: &#xff09;1. 什么是希尔伯特变换器&#xff1f;2. 试证明信号通过希尔伯特变换器后的输出二、能量信号的自相关函数、卷积运算与能量谱&#xff08;:heavy_check_mark:&#xff09;1. 能量信号2. 试证明自…

webpack配置完全指南

前言 对于入门选手来讲&#xff0c;webpack 配置项很多很重&#xff0c;如何快速配置一个可用于线上环境的 webpack 就是一件值得思考的事情。其实熟悉 webpack 之后会发现很简单&#xff0c;基础的配置可以分为以下几个方面&#xff1a; entry 、 output 、 mode 、 resolve …

深入理解Storm 之 TridentStrom

从Demo讲起: FixedBatchSpout spout new FixedBatchSpout(new Fields("sentence"), 3, new Values("the cow jumped over the moon"),new Values("the man went to the store and bought some candy"),new Values("four score and seven …

新库上线 | CnOpenData中国债券市场债券信息数据

中国债券市场债券信息数据 一、数据简介 债券是政府、企业、银行等债务人为筹集资金&#xff0c;按照法定程序发行并向债权人承诺于指定日期还本付息的有价证券。债券购买者或投资者与发行者之间是一种债权债务关系&#xff0c;债券发行人即债务人&#xff0c;投资者&#xff…

关于 python 的异常使用说明 (python 的文件和异常)

文章目录异常1. 处理异常 ZeroDivisionError 异常2. 使用 try-except 代码块3. 使用异常避免崩溃4. else 代码块5. 处理 FileNotFoundError 异常6. 分析文本7. 失败时一声不吭异常 pyhong 使用被异常成为异常的特殊对象来管理程序执行期间发生的错误。 每当发生让 python 不知所…

【计算机网络:自顶向下方法】Chapter5 网络层:控制平面

本系列文章为笔者在学习b站中科大郑烇老师的计算机网络课程时&#xff08;郑老师讲得很清晰&#xff01;&#xff01;&#xff09;&#xff0c;结合课程PPT与《计算机网络&#xff1a;自顶向下方法》&#xff08;第七版&#xff09;所作的学习笔记&#xff0c;部分图片源自课程…

gitee 奇安信代码卫士使用

注册 gitee 账号后&#xff0c;push 一个项目&#xff0c;或者 fork 一个别人的项目&#xff0c;这里 fork 了一个 java-sec-code 靶场&#xff0c;使用的是个人版&#xff0c;像是低配版的 fortify 在项目的 服务 项下&#xff0c;选择奇安信代码卫士 创建分析 新建分析&…

【Java|golang】2373. 矩阵中的局部最大值

给你一个大小为 n x n 的整数矩阵 grid 。 生成一个大小为 (n - 2) x (n - 2) 的整数矩阵 maxLocal &#xff0c;并满足&#xff1a; maxLocal[i][j] 等于 grid 中以 i 1 行和 j 1 列为中心的 3 x 3 矩阵中的 最大值 。 换句话说&#xff0c;我们希望找出 grid 中每个 3 x …

操作系统笔记、面试八股(一)—— 进程、线程、协程

文章目录1. 进程、线程、协程1.1 进程1.1.1 进程间的通信方式1.1.2 进程同步方式1.1.3 进程的调度算法1.1.4 优先级反转1.1.5 进程状态1.1.6 PCB进程控制块1.1.7 进程的创建和撤销过程1.1.8 为什么要有进程1.2 线程1.2.1 为什么要有线程1.2.2 线程间的同步方式1.3 协程1.3.1 什…

创建Firebase项目并接入Firebase推送: Firebase Cloud Messaging (FCM)

1.FCM简介&#xff1a;Firebase Cloud Messaging (FCM) 是一种跨平台消息传递解决方案&#xff0c;可供您可靠地传递消息&#xff0c;而且还是免费的服务。支持 Android&#xff0c;IOS,Web,Flutter,Unity.消息类型可以使用 FCM 向客户端发送两种类型的消息&#xff1a;通知消息…

CEC2017:鱼鹰优化算法(Osprey optimization algorithm,OOA)求解cec2017(提供MATLAB代码)

一、鱼鹰优化算法简介 鱼鹰优化算法&#xff08;Osprey optimization algorithm&#xff0c;OOA&#xff09;由Mohammad Dehghani 和 Pavel Trojovsk于2023年提出&#xff0c;其模拟鱼鹰的捕食行为。 鱼鹰是鹰形目、鹗科、鹗属的仅有的一种中型猛禽。雌雄相似。体长51-64厘米…