自定义viewGroup

news2025/1/13 10:03:19

案例分析:

    • 继承自extends LinearLayout

public class MainTabBarView extends LinearLayout
    • 实现3个方法

 public MainTabBarView(Context context) {
        this(context, null);
    }

    public MainTabBarView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MainTabBarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }
    • 关于Android attr

详见:

Android 自定义view (一)——attr 理解 - 易术军 - 博客园 (cnblogs.com)

Android attr 是什么

(1)attr 的简单理解就是一个属性约束,约束具体属性字段的属性的数据类型(boolean、string、float…)

(2)attr的文件名称不是固定的,只是方便理解和规范,也可以是其他名称,比如arrt、aesa…

(3)其实我们经常在使用,比如我们界面的布局文件,从狭隘的方面理解只要用xml形式文件就涉及到约束,而attr就是其中 的一种约束文件(类似Schema)而已

Android attr 的作用

(1)attr 作用就是约束属性数据类型,xml资源文件中定义各种attr,指定attr的数据类型。

Android attr 的使用方式

(1) 在自定义View的构造函数中解析这些从XML中定义的属性值,将其存放到View对应的成员变量中

(2) 在layout文件中为自定义View的XML属性赋值

Android attr 的简单创建

(1)我们在res/values目录下新建了一个名为attrs_ysj.xml文件,文件名是什么不重要,只要是xml文件就行。

(2)我们在该文件中定义我们自定义View所支持的XML属性。

(3)由图可知该文件的根结点是<resources> </resources>,我们在根节点下可以添加多个子节点,在节点中通过name指定XML属性名称,通过format指定XML属性值的类型,如下图所示:

(4)format支持的类型有enum、boolean、color、dimension、flag、float、fraction、integer、reference、string。

(5)通过定义一个styleable,我们可以在R文件里自动生成一个int[],数组里面的int就是定义在styleable里面的attr的id。所以我们在获取属性的时候就可以直接使用styleable数组来获取一系列的属性。

TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MainTabBarView);

全部代码

package com.example.musicprotectedmvvmf.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.LinearLayout;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.appcompat.widget.AppCompatTextView;

import com.example.musicprotectedmvvmf.R;

import me.jessyan.autosize.utils.AutoSizeUtils;

/**
 * Administrator
 * 2023/1/5
 */
public class MainTabBarView extends LinearLayout {
    public MainTabBarView(Context context) {
        this(context, null);
    }

    public MainTabBarView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MainTabBarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

   
    private void init(Context context, @NonNull AttributeSet attrs) {
        setOrientation(VERTICAL);
        setGravity(Gravity.CENTER);

        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MainTabBarView);

      
        AppCompatImageView icon = new AppCompatImageView(context);
        icon.setImageDrawable(array.getDrawable(R.styleable.MainTabBarView_tabIcon));
        icon.setLayoutParams(new ViewGroup.LayoutParams(AutoSizeUtils.dp2px(context, 40), AutoSizeUtils.dp2px(context, 40)));
        int padding = AutoSizeUtils.dp2px(context, 4);
        
        icon.setPadding(padding, padding, padding, padding);
        icon.setBackgroundResource(R.drawable.sel_menu_main_tab_bg);
        icon.setImageTintList(context.getColorStateList(R.color.sel_menu_main_tab_icon_tint));
        addView(icon);

        AppCompatTextView text = new AppCompatTextView(context);
        text.setText(array.getString(R.styleable.MainTabBarView_tabText));
        text.setTextColor(getResources().getColorStateList(R.color.sel_menu_main_tab_text_tint, context.getTheme()));

        LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        lp.setMargins(0, AutoSizeUtils.dp2px(context, 4), 0, 0);
        text.setLayoutParams(lp);
        text.setTextSize(14);
        addView(text);

        //回收 TypedArray,供以后的调用者重新使用
        array.recycle();
    }
}

引用

 <com.example.musicprotectedmvvmf.view.MainTabBarView
                        isSelected="@{vm.selectedTabId==MainViewConstant.TAB_FIND}"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:onClick="@{()->handlers.onClickTab(MainViewConstant.TAB_FIND)}"
                        android:padding="8dp"
                        app:tabIcon="@drawable/ic_main_tab_podcast"
                        app:tabText="发现" />

显示效果

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

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

相关文章

Kettle--MySQL生产数据库千万、亿级数据量迁移方案及性能优化

一、Kettle环境搭建 一、Windows主要用于可视化创建数据迁移用到的ktr转换脚本、kjb作业脚本&#xff0c;以及脚本需要配置的DB2信息、读写性能优化信息等&#xff0c;也可直接在客户端完成不同数据库之间的数据迁移。 测试库表及数据 &#xff08;1&#xff09;创建测试库表…

PVE安装win10并开启远程桌面

接上一篇一、win10安装镜像最新版下载下载地址&#xff1a;https://next.itellyou.cn/现在的win10最新版时22h2,文件名为zh-cn_windows_10_business_editions_version_22h2_updated_dec_2022_x64_dvd_cde06342.iso如果对更新有要求&#xff0c;建议每月跟踪下载一次二、上传win…

IRCNN-FPOCS 代码解读(1):整体框架

0 前言 按照自己实现论文代码的思路&#xff0c;去研究作者的代码&#xff0c;找到自己的知识盲区和不足&#xff0c;提升编码技能。 本模块主要介绍代码实现思路。细节分析详见后续博客。 1、合成地震数据 利用波动方程&#xff1f;&#xff1f;&#xff1f;合成数据&…

JavaScript的“神奇”之处

JavaScript 是一门很棒的语言。它的语法简单&#xff0c;生态系统也很庞大&#xff0c;最重要的是&#xff0c;它拥有最伟大的社区力量。我们知道&#xff0c;JavaScript 是一个非常有趣的语言&#xff0c;但同时也充满了各种奇怪的行为。让我们一起来看一下吧~ example 数组…

Weston 窗口管理(2)

窗口管理(2) 本文基于 weston 分支 10.0.2 进行描述. 五、概述 本文为窗口管理(1)的续章,更多站在开发者角度,以 weston 的代码实现讲解窗口管理(1)中所实现的部分业务场景. 六、数据结构 在窗口管理(1)中曾经描述过 weston 具体的分层逻辑,如下: 再进一步可以把 WESTON_LAY…

关于grpc的第一次尝试

自己瞎琢磨的&#xff0c;有错勿怪。 一、rpc理解 微服务会在不同的端口使用不同的语言提供相异的服务&#xff0c;端口之间的通信就使用rpc。这边的grpc的“g”我原先意味是golang&#xff0c;后来发现是google。 在golang关于rpc的官方包中&#xff0c;rpc主要有使用http/…

(7)Qt中的自定义槽(函数)

目录 槽函数定义的规则 关联信号与槽错误的示例 类成员函数函数做槽函数使用 静态类成员函数做槽函数使用 全局函数做槽函数使用 lambda表达式做槽函数使用 使用lambda表达式的注意事项 注意事项一&#xff1a; 注意事项二&#xff1a; 槽函数定义的规则 1.槽函数返回值…

多图解析KMP算法原理

KMP是什么 KMP是一种字符串匹配算法&#xff0c;能够判断字符串s2&#xff0c;是否为字符串s1的子串 例如&#xff1a;s1 "abd123def"&#xff0c;s2 "123"&#xff0c;KMP会返回4&#xff0c;代表s2是s1的子串&#xff0c;第一个匹配的下标为3 假设s…

线程池及源码分析

目录 1 java构建线程的方式 2 线程池的7个参数 3 线程池属性标识&线程池的状态 3.1 核心属性 3.2 线程池的状态 4 线程池的执行流程 5 添加工作线程的流程 6 Worker的封装&后续任务的处理 1 java构建线程的方式 一般就3~4种&#xff1a; 继承Thread&#xff…

迎接新年,暂且用Python绘制几个中国结吧

前言 今天就来分享几个用python绘制的图案吧 马上就要迎来新年了 就绘制了几个中国结&#xff0c;嘿嘿 话不多说&#xff0c;直接展示一下代码和效果图吧 更多学习资料与源码点击文章末尾名片领取 1. 效果图&#xff1a; 代码展示 import turtle turtle.screensize(600,…

GPDB插件安装工具之gppkg

gppkg命令gppkg是一个python3编写的打包脚本&#xff0c;在整个集群中安装.gppkg格式的Greenplum数据库扩展&#xff08;例如PL/Java、PL/R和MADlib&#xff09;及其依赖项&#xff0c;位于/usr/local/cloudberry-db/bin/gppkg(自己安装的gpdb目录)&#xff0c;安装到$GPHOME里…

1个寒假能学多少网络安全知识?

现在可以看到很多标题都声称三个月内就可以转行网络安全领域&#xff0c;并且成为月入15K的网络工程师。那么&#xff0c;这个寒假的时间能学多少网络安全知识&#xff1f;是否能入门网络安全工程师呢&#xff1f; 答案是肯定的。 虽然网络完全知识是一门广泛的学科&#xff…

ccc-sklearn-13-朴素贝叶斯(1)

朴素贝叶斯 一种直接衡量标签和特征之间概率关系的有监督学习算法&#xff0c;专注分类的算法&#xff0c;基于概率论和数理统计的贝叶斯理论。在计算的过程中&#xff0c;假设特征之间条件独立&#xff0c;不进行建模&#xff0c;采用后验估计。 sklearn中的朴素贝叶斯 类含…

1-选择题练手

1.采用递归方式对顺序表进行快速排序&#xff0c;下列关于递归次数的叙述中&#xff0c;正确的是 A.每次划分后&#xff0c;先处理较长的分区可以减少递归次数 B.递归次数与初始数据的排列次序无关 C.每次划分后&#xff0c;先处理较短的分区可以减少递归次数 D.递归次数与…

DaVinci:键 - 外部蒙版

调色页面&#xff1a;键Color&#xff1a;Key在调色页面&#xff0c;可以轻松地从媒体池将某个片段拖至节点面板中&#xff0c;以作为外部蒙版。或者&#xff0c;在节点上右击选择“添加蒙版” Add Matte。若无附加&#xff0c;则可以选择本节点片段的明度信息作为外部蒙版。当…

hbase2.x orphan regions on filesystem(region丢失)问题修复

问题描述&#xff1a;orphan regions on filesystem 可以通过主master web页面的HBCK Report查看 也可以通过hbck2工具查看 # 查看指定表 hbase hbck -j $HBASE_HOME/lib/hbase-hbck2-1.3.0-SNAPSHOT.jar addFsRegionsMissingInMeta default:tableName # 查看命名空间下所有…

Yolov5+TensorRT-生成dll-python/c++调用dll

YOlov5-6.0TensorRTdllpython/c调用简介1.项目环境2.TensorRT验证1.在tensorrtx-yolov5-v6.0\yolov5目录下新建build目录2.编写CMake.txt,根据自己目录更改2&#xff08;OpenCV_DIR&#xff09;、3&#xff08;TRT_DIR&#xff09;、10&#xff08;Dirent_INCLUDE_DIRS&#xf…

LabVIEW网络服务器何使用,有哪些不同

LabVIEW网络服务器何使用&#xff0c;有哪些不同NI有几款不同的Web服务器&#xff0c;可使用不同的产品并覆盖不同的用例。它们具有非常相似的名称&#xff0c;可以互换使用&#xff0c;但每个都提供不同的功能。应用程序Web服务器描述&#xff1a;NI应用Web服务器加载使用LabV…

企业微信商户号是什么?如何开通?

企业微信作为一款优秀的移动办公工具&#xff0c;与微信全方位打通&#xff0c;既可以与客户沟通交流&#xff0c;也可以在达成交易后直接进行对公收款&#xff0c;但是前提是要开通企业微信商户号。前言企业微信和微信都出自腾讯&#xff0c;而且企业微信全方位连接微信&#…

C#,图像二值化(16)——全局阈值的力矩保持算法(Moment-proserving Thresholding)及其源代码

1、力矩保持法 提出了一种基于矩保持原理的自动阈值选择方法。以这样的方式确定地计算阈值&#xff0c;即在输出画面中保留输入画面的时刻。实验结果表明&#xff0c;该方法可以将给定的图像阈值化为有意义的灰度级。该方法描述了全局阈值&#xff0c;但也适用于局部阈值。 A…