Andriod开发 fragment

news2024/12/24 8:58:28

1.fragment

fragment是一个可以嵌入到Activity中的可重用UI组件。它可以让你在一个Activity中展示多个界面,并且可以在运行时动态地添加、移除、替换和组合不同的fragment,从而实现复杂的UI交互效果。

与Activity类似,Fragment也有自己的生命周期,包括onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()等方法。同时,Fragment也可以接收来自Activity的回调事件,并且可以通过FragmentManager来管理Fragment的生命周期和交互。

生命周期

 

2.fragment静态注册

静态注册指的就是直接在Activity的布局中加入一个fragment

<?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"
    tools:context=".FragmentStaticActivity"
    android:orientation="vertical"
    >
    
    <fragment
        android:id="@+id/fg"
        android:name="com.example.chapter08.fragment.StaticFragment"
        android:layout_width="match_parent"
        android:layout_height="100dp"></fragment>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textColor="@color/teal_200"
        android:layout_marginTop="30dp"
        android:textSize="30dp"></TextView>

</LinearLayout>

fragment里有一个属性name,指向了对应的fragment子类:

这个子类可以实现fragment的逻辑交互操作,就像Activity的class一样

package com.example.chapter08.fragment;

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.example.chapter08.R;

/**
 * A simple {@link Fragment} subclass.
 * Use the {@link StaticFragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class StaticFragment extends Fragment {
    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_static, container, false);
    }
}

这个子类中的onCreateView方法,指明了这个fragment对应的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".fragment.StaticFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:text="Hello 0616!"
        android:textColor="@color/purple_500"/>

    <ImageView
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="match_parent"
        android:src="@drawable/l1"
        android:scaleType="fitXY"
        ></ImageView>

</LinearLayout>

整体逻辑就是:

Activity class->Activity xml (包含 fragment)->fragment class -> fragment xml

3.fragment动态注册

前面说的静态注册,就是直接在需要fragment的页面的xml里直接加上一个fragment,然后用属性name写清楚fragment指向的类。

动态注册指的是程序运行后,再在页面中加入fragment。

我们可以直接在Andriod Studio 里new一个blank的fragment

 然后我们可以看到fragment.java里自动生成了

public static DynamicFragment newInstance()

这个方法可以用于创建 fragment,然后将fragment所需的参数打包到Bundle中,然后作为fragment的参数存储。

接着在

public View onCreateView()

我们可以设置这个fragment对应的布局(xml),然后使用刚才保存的Bundle读取参数,设置布局中的View

具体如下:

package com.example.chapter08.fragment;

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.chapter08.R;

/**
 * A simple {@link Fragment} subclass.
 * Use the {@link DynamicFragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class DynamicFragment extends Fragment {


    public static DynamicFragment newInstance(int position, int image_id, String desc) {
        DynamicFragment fragment = new DynamicFragment();
        Bundle args = new Bundle();
        args.putInt("position", position);
        args.putInt("image_id", image_id);
        args.putString("desc", desc);
        fragment.setArguments(args);
        return fragment;
    }



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
       View view = inflater.inflate(R.layout.fragment_dynamic, container, false);
        Bundle bundle = getArguments();
        if(bundle!=null){
            ImageView iv = view.findViewById(R.id.iv);
            TextView tv = view.findViewById(R.id.tv);
            iv.setImageResource(bundle.getInt("image_id"));
            tv.setText(bundle.getString("desc"));
        }
        return view;
    }
}

创建这个fragment:

DynamicFragment.newInstance(position,book.image,book.name);

我们可以用fragment来实现引导页,需要使用的Adapter为 FragmentPagerAdapter的子类:

package com.example.chapter08;

import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;

import com.example.chapter08.entity.Book;
import com.example.chapter08.fragment.DynamicFragment;

import java.util.List;

public class MobileFragmentPagerAdapter extends FragmentPagerAdapter {
    private List<Book> list;
    public MobileFragmentPagerAdapter(@NonNull FragmentManager fm, List<Book> list) {
        super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
        this.list = list;
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        Book book = list.get(position);
        return DynamicFragment.newInstance(position,book.image,book.name);
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return list.get(position).name;
    }
}

 主Activity:

package com.example.chapter08;

import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.PagerTabStrip;
import androidx.viewpager.widget.ViewPager;

import android.graphics.Color;
import android.os.Bundle;
import android.util.TypedValue;

import com.example.chapter08.entity.Book;

import java.util.List;

public class FragmentDynamicActivity extends AppCompatActivity {

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


        //init pager tab
        PagerTabStrip pt =  findViewById(R.id.pt);
        pt.setTextSize(TypedValue.COMPLEX_UNIT_SP,20);
        pt.setTextColor(Color.GRAY);

        //init view page
        ViewPager vp = findViewById(R.id.vp);
        List<Book> list = Book.getDefaultList();
        MobileFragmentPagerAdapter adapter = new MobileFragmentPagerAdapter(getSupportFragmentManager(), list);
        vp.setAdapter(adapter);

        vp.setCurrentItem(2);


    }
}

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

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

相关文章

Linux监控Raid磁盘健康状态

Raid卡型号与操作 Raid卡市场主要是LSI、Adaptec、Highpoint、Promise等厂商提供。Adaptac被PMC收购后&#xff0c;提供的Raid卡即为PMC,简称为P卡。LSI公司提供的Raid卡&#xff0c;即为L卡。 Raid卡配置操作方式 Raid配置可以通过BIOS启动后进入Raid的配置页面进行配置&#…

【Proteus仿真】74HC192功能验证

前言 74HC192是一种四位可向上或向下计数的计数器芯片&#xff0c;可用于电子设备中的计数器、定时器和频率计等应用。74HC192的模式可以分为4种&#xff0c;向上计数&#xff0c;向下计数&#xff0c;并行输入&#xff0c;重置。还有就是&#xff0c;仿真中一些引脚的名称可能…

【硬件】嵌入式电子设计基础之单片机

本篇文章介绍了基于单片机平台开发的一些基本理论知识&#xff0c;包括了硬件最小系统的说明以及基于单片机开发的过程。文中还额外介绍了ARM体系架构&#xff0c;帮助读者从更深层次去熟悉我们平常最容易接触的开发平台&#xff0c;熟悉这些寄存器定义和处理器模式能够帮助我们…

为什么说网络安全是IT行业最后的红利?

前言 “没有网络安全就没有国家安全”。当前&#xff0c;网络安全已被提升到国家战略的高度&#xff0c;成为影响国家安全、社会稳定至关重要的因素之一。 网络安全行业特点 1、就业薪资非常高&#xff0c;涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万…

Python实现京东茅台抢购脚本, 原来这么简单

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 开发环境: python 3.8 运行代码 pycharm 2022.3.2 辅助敲代码 专业版 京东茅台抢购脚本可以分为以下几部分&#xff0c;具体实现步骤如下&#xff1a; 1. 登录京东账号 首先需要登录京东账号。 一个简单的方式是使用Pyth…

Linux 读书笔记之《鸟哥的 Linux 私房菜 基础学习篇(第四版)》

文章目录 鸟哥 Linux 私房菜&#xff08;基础学习篇&#xff09;第零章、计算器概论第一章、Linux 是什么与如何学习第二章、主机规划与磁盘分区第四章、首次登入与在线求助第五章、Linux 的文件权限与目录配置第六章、Linux 文件与目录管理第七章、Linux 磁盘与文件系统管理第…

springCloudAlibaba组件-Nacos-服务发现与负载均衡(三)

文章目录 服务发现概述服务发现两种形式nacos的负载均衡机制 服务发现概述 如果项目使用微服务架构&#xff0c;如果A微服务需要访问B微服务&#xff0c;需要http请求进行调用&#xff0c;当然需要B微服务的地址与端口号&#xff0c;微服务可以向之前提到的服务中心进行获取B服…

U盘无法格式化?快速解决方法大揭秘!

简介&#xff1a;本文将介绍如何解决U盘无法格式化的问题&#xff0c;并提供快速解决方法。无法格式化的U盘可能会导致数据无法读取或写入&#xff0c;因此解决这个问题具有重要价值。 工具原料&#xff1a; 电脑品牌型号&#xff1a;Lenovo ThinkPad T480 操作系统版本&…

开源代码分享(4)—考虑自动重合闸与DG的配电网可靠性评估(附matlab代码)

摘要&#xff1a;电力系统的可靠性是现代电力系统规划、设计和运行中的一个关键方面。智能电网概念的崛起为开发一个能够成为自愈电网的智能网络带来了很高的希望&#xff0c;提供了克服效用面临的中断问题的能力&#xff0c;并花费了数千万美元的维修和损失。在这项工作中&…

【C语言】C语言从入门到精通第1章C语言概述

目录 一、C语言发展史 &#xff08;一&#xff09;程序语言简述 1、机器语言 2、汇编语言 3、高级语言 &#xff08;二&#xff09;C语言的历史 二、C语言的特点 &#xff08;一&#xff09;高效性 &#xff08;二&#xff09;灵活性 &#xff08;三&#xff09;功能丰…

常用的几种图像置乱算法

图像置乱算法是一种用于保护图像信息安全的技术&#xff0c;它可以将原始的图像信息进行加密和混淆&#xff0c;使得未经授权的用户无法获取到原始的图像信息。在信息安全领域中&#xff0c;图像置乱技术被广泛应用于图像加密、数字水印、安全传输等方面。下面是几种常用的图像…

English Learning - L3 作业打卡 Lesson6 Day39 2023.6.12 周一

English Learning - L3 作业打卡 Lesson6 Day39 2023.6.12 周一 引言&#x1f349;句1: A Festival for the Dead is held once a year in Japan.成分划分弱读连读语调 &#x1f349;句2: This festival is a cheerful occasion.成分划分弱读连读语调 &#x1f349;句3: For on…

腾讯太狠:40亿QQ号, 给你1G内存,怎么去重?

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如腾讯、美团、阿里、拼多多、极兔、有赞、希音的面试资格&#xff0c;遇到一几个很重要的面试题&#xff1a; 40亿Q号如何设计算法去重&#xff0c;相同的Q号码仅保留一个&#x…

在 Quarkus 中的使用 Mutiny 进行响应式编程

在 Quarkus 中使用 Mutiny - 事件驱动的 Java 响应式编程库 本教程介绍在 Quarkus 中使用事件驱动的 Mutiny 响应式编程库 以应对异步系统开发中的挑战。 概述 Mutiny 是一个&#xff08;Reactive Programming&#xff09;响应式编程库, 事件是 Mutiny 的设计核心&#xff0…

1.3 springboot项目中,数据层HikariCP与MyBatis整合

步骤1&#xff1a;在顶级父工程中pom引入mysql和mybatis依赖 <!-- mysql驱动 --> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.41</version> </dependency> <…

微信公众号每天定时发送消息给女朋友

前言 这是我在这个网站整理的笔记&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;RodmaChen 每天定时发送消息给女朋友 一. 环境准备二. 代码拉取和配置三. 项目部署3.1 直接运行3.2 后台运行 四. 效果图 参考地址&#xff1a;https://github.com/limoes…

云服务器部署极简版openGauss,本地Data Studio远程连接

openGauss是一款开源关系型数据库管理系统&#xff0c;华为研发&#xff0c;2020年7月1日开源。Data Studio提供了一个图形化界面来管理openGauss数据库。 1.下载安装包 在华为云上租一台服务器&#xff0c;操作系统选&#xff1a;openEuler 20.03 64bit (64-bit) 获取openGa…

C程序设计(第五版)

文章目录 前言第3章 顺序程序设计第4章 选择结构程序设计c第5章 循环程序设计第6章 利用数组处理批量数据第7章 用函数实现模块化程序设计第8章 善于利用指针第9章 用户建立数据类型结构体字节对齐 第10章 对文件的输入输出 前言 鉴于写CSDN博客一篇一篇查找比较麻烦&#xff0…

day55_springmvc

今日内容 零、 复习昨日 零、 复习昨日 1 maven项目编译后代码在target 2 发现代码都没有错,该写的都有,但是已启动服务器404,查看target,如果编译会后资源不全面,那就删除重新编译 3 重新看一下,如何使用mavne创建javaweb项目 一、参数绑定 【重点】 所谓参数绑定,就是前端发请…

【GPT LLM】跟着论文学习gpt

GPT1开山之作&#xff1a;Improving language understanding by generative pre-training 本文提出了gpt1&#xff0c;即使用无标签的数据对模型先进行训练&#xff0c;让模型学习能够适应各个任务的通用表示&#xff1b;后使用小部分 task-aware的数据对模型进行微调&#xff…