Android入门第47天-Fragment的基本使用

news2024/11/26 8:27:00

简介

我们的Android入门一步步已经进入中级。我们讲完了所有的基本组件的基本使用、Activity、Service、BroadCast。今天我们来到了Fragment篇章。Fragment和Activity比到底是一个什么样的存在呢?我们以一个很小的例子来说通Fragment。

Fragment是什么

  • Fragment可以套在activity里;
  • 一个Fragment可以属于多个activity;
  • Fragment可以适配(屏幕尺寸);
  • Fragment有自己的生命周期;

因此Fragment可以复用。Fragment的生命 周期如下:

课程目标

我们通过以下这么一个小例子来了解一个Fragment的基本使用

  1. 我们有一个全真模拟登录后的APP主界面,分为topbar,中间有4个fragment,底部有tabbar;
  2. 底部的tabbar有4个按钮用textview+android:background来实现的;
  3. 每个底部按钮被点一次就显示一个fragment;

当中这块fragment可是一整块的,它是可以适匹屏幕的,因此可以在PAD上使用。

我们下面来看全代码

全代码

项目结构

 

全局静态常量

我们对res/values下这两个文件涉及到了修改,增加了一些全局静态常量。这是一个编程上的好习惯比如说以后我们要碰上国际化,肯定不能在代码里写死一些“字符串”吧?

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="purple_200">#FFBB86FC</color>
    <color name="purple_500">#FF6200EE</color>
    <color name="purple_700">#FF3700B3</color>
    <color name="teal_200">#FF03DAC5</color>
    <color name="teal_700">#FF018786</color>
    <color name="black">#FF000000</color>
    <color name="white">#FFFFFFFF</color>
    <color name="bg_black">#000000</color>
    <color name="bg_white">#FFFFFF</color>
    <color name="bg_topbar">#FCFCFC</color>
    <color name="bg_gray">#00F1F1F1</color>
    <color name="transparent">#00FFFFFF</color>
    <color name="text_gray">#8D7A71</color>
    <color name="text_white">#FFFFFF</color>
    <color name="text_yellow">#FFC800</color>
    <color name="text_topbar">#694E42</color>
    <color name="div_white">#E5E5E5</color>
</resources>

 这边我们是从name="white"后开始增加的自定义的属性。

strings.xml

<resources>
    <string name="app_name">DemoFragmentWithTabBar</string>
    <string name="tab_menu_alert">提醒</string>
    <string name="tab_menu_profile">信息</string>
    <string name="tab_menu_pay">我的</string>
    <string name="tab_menu_setting">设置</string>
</resources>

 项目中用到的图片

这些图片主要是这么用的,我来解释一下:

  1. 我们底部有4个按钮;
  2. 每个按钮我们定义它没有按下去、按下去后的两个状态,因此有4个xml,每个xml中含各两个按钮状态定义的selector;

因此一共8个图片。

用于定义4个按钮按下去和没有按下去时状态的Selector XML

  • 因为我们有4个按钮,每个按钮我们定义它没有按下去、按下去后的两个状态,因此有4个xml,每个xml中含各两个按钮状态定义的selector,这就有4个xml,每个xml内容差不多;
  • 同时每个按钮上有文字,而文字也分按下去和没有按下去时。对于文字的状态显示我们可以共用一个selector xml;
  • 我们用textview中的drawTop属性控制中在textview的text的上方汇制一个透明区域,然后把图片位于text上方来制作出下方4个按钮的tabbar效果,因此这一个透明区域的样式是一样的,因此可以4个按钮共用一个用用汇制透明区域的selector xml;

所以总计有6个xml,我们来一个个看。

 

用来定义下部4个“按钮”每个文字上方透明放置图片区域的tab_menu_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true">
        <shape>
            <solid android:color="#FFC4C4C4" />
        </shape>
    </item>
    <item>
        <shape>
            <solid android:color="@color/transparent" />
        </shape>
    </item>
</selector>

 用来定义下部4个“按钮”每个文字按下去和没有按下去时的效果的tab_menu_text.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/text_yellow" android:state_selected="true" />
    <item android:color="@color/text_gray" />
</selector>

提醒-tab_menu_notification.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@mipmap/tab_channel_pressed" android:state_selected="true" />
    <item android:drawable="@mipmap/tab_channel_normal" />
</selector>

信息-tab_menu_message.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@mipmap/tab_message_pressed" android:state_selected="true" />
    <item android:drawable="@mipmap/tab_message_normal" />
</selector>

 我的-tab_menu_better.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@mipmap/tab_better_pressed" android:state_selected="true" />
    <item android:drawable="@mipmap/tab_better_normal" />
</selector>

设置-tab_menu_settings.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@mipmap/tab_my_pressed" android:state_selected="true" />
    <item android:drawable="@mipmap/tab_my_normal" />
</selector>

下面我们来看我们的Fragment

Fragment

fg_content.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/bg_white">

    <TextView
        android:id="@+id/txt_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text=""
        android:textColor="@color/text_yellow"
        android:textSize="20sp"/>

</LinearLayout>

SimpleFragment.java

package org.mk.android.demobar;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class SimpleFragment extends Fragment {

    private String content;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fg_content, container, false);
        TextView txt_content = (TextView) view.findViewById(R.id.txt_content);
        Bundle bundle = getArguments();
        String content = bundle.getString("content");
        txt_content.setText(content);
        return view;
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".MainActivity">

    <RelativeLayout
        android:id="@+id/ly_top_bar"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:background="@color/bg_topbar">

        <TextView
            android:id="@+id/txt_topbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:textSize="18sp"
            android:textColor="@color/text_topbar"
            android:text="信息"/>


        <View
            android:layout_width="match_parent"
            android:layout_height="2px"
            android:background="@color/div_white"
            android:layout_alignParentBottom="true"/>

    </RelativeLayout>



    <LinearLayout
        android:id="@+id/ly_tab_bar"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:layout_alignParentBottom="true"
        android:background="@color/bg_white"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/txt_notification"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/tab_menu_bg"
            android:drawablePadding="3dp"
            android:drawableTop="@drawable/tab_menu_notification"
            android:gravity="center"
            android:padding="5dp"
            android:text="@string/tab_menu_alert"
            android:textColor="@drawable/tab_menu_text"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/txt_message"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/tab_menu_bg"
            android:drawablePadding="3dp"
            android:drawableTop="@drawable/tab_menu_message"
            android:gravity="center"
            android:padding="5dp"
            android:text="@string/tab_menu_profile"
            android:textColor="@drawable/tab_menu_text"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/txt_better"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/tab_menu_bg"
            android:drawablePadding="3dp"
            android:drawableTop="@drawable/tab_menu_better"
            android:gravity="center"
            android:padding="5dp"
            android:text="@string/tab_menu_pay"
            android:textColor="@drawable/tab_menu_text"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/txt_setting"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/tab_menu_bg"
            android:drawablePadding="3dp"
            android:drawableTop="@drawable/tab_menu_setting"
            android:gravity="center"
            android:padding="5dp"
            android:text="@string/tab_menu_setting"
            android:textColor="@drawable/tab_menu_text"
            android:textSize="16sp"/>

    </LinearLayout>

    <View
        android:id="@+id/div_tab_bar"
        android:layout_width="match_parent"
        android:layout_height="2px"
        android:background="@color/div_white"
        android:layout_above="@id/ly_tab_bar"/>


    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/ly_top_bar"
        android:layout_above="@id/div_tab_bar"
        android:id="@+id/ly_content">

    </FrameLayout>

</RelativeLayout>

MainActivity.java

package org.mk.android.demobar;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.FrameLayout;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    //UI Object
    private TextView txt_topbar;
    private TextView txt_notification;
    private TextView txt_message;
    private TextView txt_better;
    private TextView txt_setting;
    private FrameLayout ly_content;

    //Fragment Object
    private SimpleFragment fg1, fg2, fg3, fg4;
    private FragmentManager fManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        fManager = getFragmentManager();
        bindViews();
        txt_notification.performClick();   //模拟一次点击,既进去后选择第一项
    }

    //UI组件初始化与事件绑定
    private void bindViews() {
        txt_topbar = (TextView) findViewById(R.id.txt_topbar);
        txt_notification = (TextView) findViewById(R.id.txt_notification);
        txt_message = (TextView) findViewById(R.id.txt_message);
        txt_better = (TextView) findViewById(R.id.txt_better);
        txt_setting = (TextView) findViewById(R.id.txt_setting);
        ly_content = (FrameLayout) findViewById(R.id.ly_content);

        txt_notification.setOnClickListener(this);
        txt_message.setOnClickListener(this);
        txt_better.setOnClickListener(this);
        txt_setting.setOnClickListener(this);
    }

    //重置所有文本的选中状态
    private void setSelected() {
        txt_notification.setSelected(false);
        txt_message.setSelected(false);
        txt_better.setSelected(false);
        txt_setting.setSelected(false);
    }

    //隐藏所有Fragment
    private void hideAllFragment(FragmentTransaction fragmentTransaction) {
        if (fg1 != null) fragmentTransaction.hide(fg1);
        if (fg2 != null) fragmentTransaction.hide(fg2);
        if (fg3 != null) fragmentTransaction.hide(fg3);
        if (fg4 != null) fragmentTransaction.hide(fg4);
    }


    @Override
    public void onClick(View v) {
        FragmentTransaction fTransaction = fManager.beginTransaction();
        hideAllFragment(fTransaction);
        switch (v.getId()) {
            case R.id.txt_notification:
                setSelected();
                txt_notification.setSelected(true);
                if (fg1 == null) {
                    fg1 = new SimpleFragment();
                    String content = "第一个Fragment";
                    Bundle bd = new Bundle();
                    bd.putString("content", content);
                    fg1.setArguments(bd);
                    fTransaction.add(R.id.ly_content, fg1);
                } else {
                    fTransaction.show(fg1);
                }
                break;
            case R.id.txt_message:
                setSelected();
                txt_message.setSelected(true);
                if (fg2 == null) {
                    fg2 = new SimpleFragment();
                    String content = "第二个Fragment";
                    Bundle bd = new Bundle();
                    bd.putString("content", content);
                    fg2.setArguments(bd);
                    fTransaction.add(R.id.ly_content, fg2);
                } else {
                    fTransaction.show(fg2);
                }
                break;
            case R.id.txt_better:
                setSelected();
                txt_better.setSelected(true);
                if (fg3 == null) {
                    fg3 = new SimpleFragment();
                    String content = "第三个Fragment";
                    Bundle bd = new Bundle();
                    bd.putString("content", content);
                    fg3.setArguments(bd);
                    fTransaction.add(R.id.ly_content, fg3);
                } else {
                    fTransaction.show(fg3);
                }
                break;
            case R.id.txt_setting:
                setSelected();
                txt_setting.setSelected(true);
                if (fg4 == null) {
                    fg4 = new SimpleFragment();
                    String content = "第四个Fragment";
                    Bundle bd = new Bundle();
                    bd.putString("content", content);
                    fg4.setArguments(bd);
                    fTransaction.add(R.id.ly_content, fg4);
                } else {
                    fTransaction.show(fg4);
                }
                break;
        }
        fTransaction.commit();
    }
}

核心代码思路导读

  1. 刚打开APP,我们模拟一次点击,使用组件的performClick触发,从而点击“提醒”按钮因此来显示第一个fragment;
  2. 每次点击先把当前所有的fragment“隐藏”再显示相应的那个被按钮点下去后需要显示的fragment

运行效果如下

 自己动一下手吧。

 

 

 

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

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

相关文章

智能家居DIY系列之智能灯泡

一、什么是智能灯 传统的灯泡是通过手动打开和关闭开关来工作。有时&#xff0c;它们可以通过声控、触控、红外等方式进行控制&#xff0c;或者带有调光开关&#xff0c;让用户调暗或调亮灯光。 智能灯泡内置有芯片和通信模块&#xff0c;可与手机、家庭智能助手、或其他智能…

浅析JWT Attack

前言 在2022祥云杯时遇到有关JWT的题&#xff0c;当时没有思路&#xff0c;对JWT进行学习后来对此进行简单总结&#xff0c;希望能对正在学习JWT的师傅们有所帮助。 JWT JWT&#xff0c;即JSON WEB TOKEN&#xff0c;它是一种用于通信双方之间传递安全信息的简洁的、URL安全…

创新研发负载分担机制,天翼云IPv6网络带宽再升级!

网络作为社会信息化的基础&#xff0c;已成为人们日常生活不可或缺的一部分。网络通过模拟信号将信息转为电流进行传播&#xff0c;在这个过程中&#xff0c;网卡便充当了解码器的作用&#xff0c;能够将电信号转换为计算机能够识别的数字信号。 网卡&#xff0c;即网络接口卡&…

关于LabVIEW大作业/课设/论文的写作框架整理(主体三部曲)

文章目录 一、前言二、写作框架2.1 介绍函数以及工具箱2.2 介绍相关原理2.3 系统设计和案例演示三、总结一、前言 因为在Labview临近要交大作业,发现自己根本不会写,程序等的已经准备好了,但是对于写作一直不知道查了查知网文章,让我有了个大概了解,在此帖出来,希望能帮…

1569_AURIX_TC275_电源管理与系统控制单元

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 之前看了不少类似的寄存器信息&#xff0c;总体来说阅读价值不是很大&#xff0c;查询的价值多一些。如果是进行编码&#xff0c;这样的寄存器信息需要查一下&#xff0c;在功能了解的时候…

java面试强基(22)

为什么要使用多线程呢? 先从总体上来说&#xff1a; 从计算机底层来说&#xff1a; 线程可以比作是轻量级的进程&#xff0c;是程序执行的最小单位,线程间的切换和调度的成本远远小于进程。另外&#xff0c;多核 CPU 时代意味着多个线程可以同时运行&#xff0c;这减少了线程…

漏洞丨实例分析cve2012-0158

作者&#xff1a;黑蛋 作者&#xff1a;黑蛋 一、漏洞简介 CVE-2012-0158是一个office栈溢出漏洞&#xff0c;Microsoft Office 2003 sp3是2007年9月18日由微软公司创作的一个办公软件&#xff0c;他的MSCOMCTL.ocx中的MSCOMCTL.ListView控件检查失误&#xff0c;由于读取长…

MySQL数据库Linux系统安装tar包

MySQL数据库Linux系统安装tar包 使用的远程工具是mabaxterm,使用此工具连接linux服务器&#xff0c; 第一步先把mysql安装包拖到远程工具的目录里&#xff1a;/usr/local 第二步&#xff1a;cd到local目录下解压数据库mysql 命令&#xff1a; cd …/usr/local 解压数据库masq…

endo BCN-PEG4-COOH,1881221-47-1,endo BCN-四聚乙二醇-羧酸特点分享

●外观以及性质&#xff1a; endo BCN-PEG4-acid含有BCN基团和羧酸基团&#xff0c;酸基团可以在偶联条件下与胺反应形成酰胺键。BCN基团可以发生点击化学反应。 【产品理化指标】&#xff1a; ●中文名&#xff1a;endo BCN-四聚乙二醇-羧酸 ●英文名&#xff1a;endo BCN-P…

APS智能排产帮助LNG船舶生产厂家充分利用产能,提升生产效益

前一段时间&#xff0c;由于欧洲各国集中储备天然气准备过冬&#xff0c;引发全球对LNG船舶&#xff0c;也就是液化天然气运输船的需求持续增加。一艘LNG船单日租金成本已跃升至近40万美元&#xff08;约合人民币283万元&#xff09;&#xff0c;同比增长340%以上&#xff0c;一…

测试面试 | 某 BAT 大厂测试开发面试真题与重点解析

image1080677 64.8 KB 本文作者 J2W 为霍格沃兹测试学院《测试开发实战进阶》班优秀学员&#xff0c;4 个多月从初出茅庐、勉勉强强的初级测试开发快速成长&#xff0c;成功拿下某 BAT 大厂中级测试开发岗位 Offer&#xff0c;并获得学院奖学金。助教老师对其一致评价是「学习非…

程序人生:自学上岸自动化测试薪资20K,我的经验值得想进阶的朋友借鉴...

经常有人问过这样一个问题&#xff1a;‘’自动化测试是真的这么厉害吗&#xff1f;如何从零成为自动化测试工程师&#xff1f;” 我之前写过这样一篇文章【从功能测试进阶自动化测试&#xff0c;熬夜7天整理出这一份超全学习指南【附网盘资源】】 厉害不厉害在于你有没有扎实…

java-爬虫-es

文章目录1.数据来源&#xff1a;数据库、mq、爬虫2.爬虫&#xff1a;获取想要的页面数据1.导入依赖2.爬取核心部分编码3.测试解析成功4.封装对象5.引入es配置类6.将HtmlParseUtil注册到spring7.爬取的数据入es库8.空白文件初始化vue文献&#xff1a;https://www.kuangstudy.com…

Java程序员的技术进阶成长路线

据不完全统计&#xff0c;截至目前(2017.07)为止&#xff0c;中国Java程序员的数量已经超过了100万。而且&#xff0c;随着IT培训业的持续发展和大量的应届毕业生进入社会&#xff0c;Java程序员面临的竞争压力越来越大。那么&#xff0c;作为一名Java初级程序员&#xff0c;怎…

【财务】FMS财务管理系统:礼品卡管理

本文总结了FMS财务管理系统中的礼品卡管理&#xff0c;以及如何根据不同类型卡的流程和管理&#xff0c;进行相应的账务处理。 目前在各大电子商务网站或APP购买商品时&#xff0c;在支付时有很多网站都可以使用礼品卡&#xff0c;对于礼品卡的管理也是公司及财务部重点关注的&…

[附源码]Nodejs计算机毕业设计基于WEB的心理测评系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

Django期末考试复习

目录一、Django复习内容二、建立一个项目1.进入环境2.建立项目3.打开文件三、建立APP1.进入View文件2.进入Django环境3.建立App四、注册超级用户1.INSTALLED_APPS配置2.建立模型3.数据库的迁移4.进入环境注册超级用户5.开启服务器五、配置数据库一、Django复习内容 二、建立一个…

【云原生进阶之容器】第一章Docker核心技术1.4节——chroot技术

1. 背景 1.1 什么是 chroot chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以 `/`,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为 `/` 位置。 1.2 为何使用 chroot 在经过 chroot 之后,…

git merge 命令详解

1. 前言 2. 合并场景之 Fast-forward&#xff08;快速合并&#xff09; 3. 合并场景之 three way merge&#xff08;三路合并之正常合并&#xff09; 4. 合并场景之 three way merge&#xff08;三路合并之冲突合并&#xff09; 5. 中止合并 1. 前言 将指定分支合并到当前分支…

继承中国元宇宙之父钱学森先生“灵境”的概念产物—XR电影《告别核桃》代表了什么?

元宇宙大家都不陌生吧&#xff0c;那么你听说过“灵境”吗&#xff1f;你知道“灵境”与元宇宙XR影片《告别核桃》有什么关系吗&#xff1f;在2021年12月9日举行的2021元宇宙产业论坛上&#xff0c;钱学森线上30年前55份珍贵的手稿曝光。原来早在1990年&#xff0c;钱学森就曾在…