自定义View之组合自定义控件

Android View体系(十)自定义组合控件 上一篇我们讲到了自定义View,接着我们来讲讲常用的自定义组合控件,自定义组合控件就是多个控件组合起来成为一个新的控件,主要用来解决多次重复的使用同一类型的布局。比如我们应用的顶部的标题栏,还有弹出的固定样式的dialog,这些都是常用的,所以把他们所需要的控件组合起来重新定义成一个新的控件。 阅读详情

今晚是几分焦虑的学习呀,想着第一次面试在周六,想多学点知识,但是发现好像其实自己的基础都学完了,在找多点进阶的学,离题了,恩,好的,入正题,如何在安卓中使用自定义View控件,并且实现动态的实现,接口回调机制等。
这篇文章仅仅是组合控件,不涉及自定义View的绘制。开始!!!
1、首先在values下新建一个attrs的xml文件,指定自定义控件的各种属性
代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 自定义控件 -->
    <declare-styleable name="TopBar">
        <!-- 自定义title的三个属性 -->
        <attr name="Title" format="string" />
        <attr name="TitleColor" format="color" />
        <attr name="TitleSize" format="dimension" />
        <!-- 自定义Button的三个属性 -->
        <attr name="ButtonTitle" format="string" />
        <attr name="ButtonColor" format="color" />
        <attr name="ButtonSize" format="dimension" />
    </declare-styleable>
</resources>

2、自定义一个View的Java文件,这个文件是用来实例化attrs里面的各种属性的
步骤:
1、初始化界面的控件

//1、自定义控件初始化
    private Button button;
    private TextView title;

2、初始化attrs的各种属性,将attrs里面的各种属性放在TypedArray中(TypedArray类似于一个Map集合,可以通过key取得value)

//2、自定义属性的初始化
    //title的属性
    private String Title;
    private  int TitleColor;
    private float TitleSize;
    //Button的属性
    private String ButtonTitle;
    private  int ButtonColor;
    private float ButtonSize;

3、将存放在TypedArray中的属性取出,设置给我们初始化的属性,同时将我们的属性设置给自定义控件

//2、将存储在TypedArray中的属性添加到并回收TypedArray
        Title=ta.getString(R.styleable.TopBar_Title);
        TitleColor=ta.getColor(R.styleable.TopBar_TitleColor, 0);
        TitleSize=ta.getFloat(R.styleable.TopBar_TitleSize, 16);

        ButtonTitle=ta.getString(R.styleable.TopBar_ButtonTitle);
        ButtonColor=ta.getColor(R.styleable.TopBar_ButtonColor, 0);
        ButtonSize=ta.getFloat(R.styleable.TopBar_ButtonSize, 14);

        ta.recycle();
        //3、将各自的属性增加到各自的空间中
        button=new Button(context);
        title=new TextView(context);

        title.setText(Title);
        title.setTextColor(TitleColor);
        title.setTextSize(TitleSize);
        title.setGravity(Gravity.CENTER);
        button.setText(ButtonTitle);
        button.setTextColor(ButtonColor);
        button.setTextSize(ButtonSize);

        //到这里已经完成了自定义控件的各个组成成分
        setBackgroundColor(0xFF00FFDA);

4、当预定义在attrs中的属性关联控件之后,剩下的是设置控件位于View中位置,可以使用LayoutParams进行设置

    //首先使用 LayoutParams进行剩余属性的设置
        TitleParams=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
        TitleParams.addRule(RelativeLayout.CENTER_IN_PARENT,TRUE);

        ButtonParams=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.MATCH_PARENT);
        ButtonParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,TRUE);

5、使用ViewGroup的addView()方法将我们的自定义控件添加到自定义View中,静态的自定义View就基本实现了

addView(title, TitleParams);
addView(button, ButtonParams);

6、实现View的动态变换,我们使用类似于View的点击事件的接口回调机制进行实现
接口回调机制:是一种作为模板暴露出去的方法可以供实现者实现的一种机制
代码如下:

//实现接口回调机制
    private TopbarClickListener listener;
    //接口
    public interface TopbarClickListener{
        public void ButtonClick();
    }
    //回调
    public void SetOnTopbarClickListener(TopbarClickListener listener){
        this.listener=listener;
    }

这样,我们的自定义控件就实现了
7、使用自定义控件
其实使用自定义控件是和使用系统自带控件是一样的,有两点需要注意:
第一是命名控件,在res/包名
第二是我们的控件在布局文件的定义:要导入类
如下:

  <com.example.topbar.TopBarView
        android:id="@+id/topbar"
        android:layout_height="45dp"
        android:layout_width="match_parent"
        myview:Title="标题"
        myview:TitleColor="#000000"
        myview:TitleSize="20sp"
        myview:ButtonTitle="按钮"
        myview:ButtonColor="#000000"
        myview:ButtonSize="20sp"
       />   

命名空间:

 xmlns:myview="http://schemas.android.com/apk/res/com.example.topbar"

这样我们的布局写好了
最后是在主界面调用我们的自定义View

package com.example.topbar;

import com.example.topbar.TopBarView.TopbarClickListener;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;


public class MainActivity extends Activity {

    private TopBarView topbar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        topbar=(TopBarView) findViewById(R.id.topbar);
        topbar.SetOnTopbarClickListener(new TopbarClickListener() {

            @Override
            public void ButtonClick() {
                Toast.makeText(MainActivity.this, "按钮被点击", Toast.LENGTH_LONG).show();

            }
        });
    }

自定义控件的View代码如下:

package com.example.topbar;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class TopBarView extends RelativeLayout  {

    //1、自定义控件初始化
    private Button button;
    private TextView title;
    //2、自定义属性的初始化
    //title的属性
    private String Title;
    private  int TitleColor;
    private float TitleSize;
    //Button的属性
    private String ButtonTitle;
    private  int ButtonColor;
    private float ButtonSize;
    //在控件的属性都设置好后,设置包裹内容,位于父组件的位置的相关属性
    private LayoutParams TitleParams;
    private LayoutParams ButtonParams;
    //实现接口回调机制
    private TopbarClickListener listener;
    //接口
    public interface TopbarClickListener{
        public void ButtonClick();
    }
    //回调
    public void SetOnTopbarClickListener(TopbarClickListener listener){
        this.listener=listener;
    }
    public TopBarView(Context context, AttributeSet attrs) {
        super(context, attrs);
        //在构造方法中完成初始化View对象
        //1、将定义attrs的属性添加到TypedArrray中
        TypedArray ta=context.obtainStyledAttributes(attrs,R.styleable.TopBar);
        //2、将存储在TypedArray中的属性添加到并回收TypedArray
        Title=ta.getString(R.styleable.TopBar_Title);
        TitleColor=ta.getColor(R.styleable.TopBar_TitleColor, 0);
        TitleSize=ta.getFloat(R.styleable.TopBar_TitleSize, 16);

        ButtonTitle=ta.getString(R.styleable.TopBar_ButtonTitle);
        ButtonColor=ta.getColor(R.styleable.TopBar_ButtonColor, 0);
        ButtonSize=ta.getFloat(R.styleable.TopBar_ButtonSize, 14);

        ta.recycle();
        //3、将各自的属性增加到各自的空间中
        button=new Button(context);
        title=new TextView(context);

        title.setText(Title);
        title.setTextColor(TitleColor);
        title.setTextSize(TitleSize);
        title.setGravity(Gravity.CENTER);
        button.setText(ButtonTitle);
        button.setTextColor(ButtonColor);
        button.setTextSize(ButtonSize);

        //到这里已经完成了自定义控件的各个组成成分
        setBackgroundColor(0xFF00FFDA);
        //接下来实现控件的组合
        //首先使用 LayoutParams进行剩余属性的设置
        TitleParams=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
        TitleParams.addRule(RelativeLayout.CENTER_IN_PARENT,TRUE);
        addView(title, TitleParams);
        ButtonParams=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.MATCH_PARENT);
        ButtonParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,TRUE);
        addView(button, ButtonParams);
    }

}
Android自定义View初探——自定义组合控件 声明: 本文章例子来源于bilibili 程序猿拉大锯 本文章主要是自己的一些知识点理解,记录自己的学习 自己的感悟: 自己从19年的下半年就开始第一次接触自定义View的内容,期间也断断续续看过一些视频,也自己亲手做过一些小的demo啊等等,最终却都是以失败告终,可能是网上的关于自定义View的内容很乱也没有一个很完整的一套流程,也可能是自己当时比较浮躁,看一些知识点时都是大眼一看,就觉得自己会了,等到真正操作起来却又手忙脚乱,无从下手的感觉。知识嘛,肯定是多多益善,毕竟也是跟我们的薪资有着直接关系的, 阅读详情

相关推荐

Android自定义View——再探自定义组合控件

这里写目录标题声明1.继承自父容器2.定义获取相关属性->res/values/attrs3.把子view加载进来4.定义功能接口 interface5.暴露点击事件供外部实现 声明 本文章例子来源于bilibili up 程序猿拉大锯 本文章主要是自己对于一些知识点理解算是总结吧,记录自己的学习 本专栏不会进行收费,所有文章都会设置成试读,请各位读者放心,设置收费专栏是为了让更多的人看到此专栏 ok ,根据上篇文章你肯定对自定义组合控件算是有了一定的理解了,为了加深记忆,这里再上一个有关自定义组合控

yuhang01的博客 758

自定义View中调用控件的两种方式

第一种是需要写一个XML,然后在自定义代码中获取控件 1               android:orientation="vertical"               android:layout_width="match_parent"               android:layout_height="200dp">             androi

breakfrox的博客 1737

物联网 Mixly-智能楼道灯

一、实验目的及要求 熟悉声音及人体红外传感器用法。 二、实验原理与内容 1.使用声音传感器实现声控灯功能。 2.使用人体红外传感器实现人体检测控制灯功能。 三、实验软硬件环境 硬件:Arduino、LED灯、声音传感器、人体红外传感器 软件:Mixly IDE 四、实验过程(实验步骤、记录、数据、分析) 核心代码截图 声控灯: 人体红外检测灯: 3.实验效果图: (1)、声控灯总线连接: (1)、声控灯声音大于一某个值时灯亮,经过2秒后灯灭: (3)、人体红外检测灯连接总线: (4)、人体红外

qq_43430810的博客 1917

自定义view (一)自定义控件 viewGroup

自定义一个包含了各种控件的viewGroup, 这里主要是用来给 app “我的” 模块下的多条类似的item, 有一点,自定义的view不能放到作为lib的moudel里面,不然就会像使用pulltorefresh一样,你使用自定义的控件的时候,自己的属性系统不会提示不说,其他的控件的属性也不会提示,很蛋疼; 1、自定义View的属性 2、在View的构造方法中获得我们自定义

sinstar1的博客 667

极智嘉嵌入式面试题及参考答案

IIC(Inter-Integrated Circuit)即集成电路总线,是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它仅使用两根线,即串行数据线 SDA 和串行时钟线 SCL,就能实现多个设备之间的通信,具有简单、高效、占用资源少等优点,广泛应用于各种嵌入式系统中。

大模型大数据攻城狮的专栏 922

ModuleNotFoundError: No module named‘langchain.schema.output parserlangchain.schema is not a package

电脑里现有的langchain库版本与import所需的不同,卸载原有langchain,重新下载最新的langchain。在步骤1后,若仍不可运行。在确保已重新下载新langchain后,重启python后,可正常运行。在版本号中填入所需的langchain版本号,可在requirements.txt查看。运行如下代码时,出现error。

weixin_45751925的博客 1713

进阶之自定义View之组合控件

对于Android小伙伴来说,自定义View是一个初级程序员进阶中高级程序员所必需掌控的技能。 话不多说,接下来我们直接开始讲解: 自定义View按类型来划分的话,自定义View的实现方式大概可以分为三种: 组合控件 继承控件 自绘控件 今天这一篇我们讲解的就是组合控件。 定义标题栏布局文件 activity_common_title.xml。 <?xml version="1.0"...

jhonjson的博客 672

Python爬虫-汽车之家各车系月销量榜数据

本文是该专栏的第41篇,后面会持续分享python爬虫干货知识。本文以某汽车平台为例,基于python采集该平台“各车系月销量”的榜单数据。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码)

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 1619

自定义View从实现到原理(六)- 实现自定义组合控件

自定义View从实现到原理(六) 终于回到了实现这一部分,经过了之前的解析,我们从实现到原理,这次再次回到实现,这一次的实现·就不会是像之前那次的简单实现了,经过梳理我们已经有能力写出一些复杂的自定义View,那么就进入到这个系列的最后一节,实现自定义组合控件。 实现自定义组合控件 所谓自定义组合控件,就是多个空间组合起来成为了一个新的控件,主要用于解决多次重复的使用同一类型的布局,就比如说我们常用的顶部标题栏以及弹出的样式dialog等,这些都很常用,所以将他们所需要的控件组合起来形成一个新的控件,就可以

Loveyy 6337

SpringBoot从入门到精通(全)

前言 ==本博文结合软件idea进行主要讲解== **springboot的特性主要有** - 简化 Spring 应用程序的创建和开发过程 - 抛弃了繁琐的 xml 配置过程,采用大量的默认配置简化以及注解反射 - 直接使用 java main 方法启动内嵌的 Tomcat 服务器运行 Spring Boot 程序,不需要部署 war 包文件 **四大核心**分别为自动配置、起步依赖、Actuator和命令行界面

码农研究僧的博客 7万+

风控域——知识图谱相关原理

本文全面介绍了知识图谱在风控领域的应用原理。从基础知识入手,阐述了知识图谱的定义、概念及应用场景,重点聚焦于金融风控。进一步讲解了知识图谱的技术架构,涵盖计算、融合与构建等方面。深入探讨了知识表示、建模、抽取、挖掘、存储、融合、检索和推理等关键技术原理,并结合金融风控实际需求,详细说明了各技术环节的具体应用方法与流程,为构建高效风控知识图谱提供了理论与实践指导。

庄小焱 608

自定义View之组合控件

一、简要介绍之前写过自定义view与viewgroup但是那里阐述的是写一个可以设置多属性的可以设置响应事件的view,但是很多场景下又有很多不同,比如下图所示的由几个控件组合起来一个自定义控件来实现布局代码复用、逻辑清晰等作用二、组合控件优势一般,我们在布局的时候,如果出来多个类似的样式,比如上图的ImagVIew+TextVIew+ImagVIew会出现多次,我们可以有多种写法,比如使用线性布局

firesmog的博客 963

[数学建模][2012年A国赛模拟] 3. 葡萄酒的评价

暑期学校数学建模培训第三次模拟:2012年国赛A题,一道完全统计方面的题目。据老师反映当年有位老师所带领小组取得“全国10佳优秀论文奖”,我们大组搞统计的老师建模能力不行,但其统计理论非常扎实,在此期间给予我们非常大的帮助,十分感谢老师的倾囊相授。我们小组的定位也不在统计方向,主攻物理建模及优化模型,故本次模拟就用SPSS软件简单做了下,还是学到了多元统计的许多知识,达到了本次训练的目的。 ...

Y-puyu 的博客 3万+

Android学习自定义View(三)——自绘控件和组合控件

MainActivity如下: package cc.testviewstudy3; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.app.Activity; /** * Demo描述: * 关于自定义View的学习(三)

谷哥的小弟 2346

电路板保险丝如何选型

在电路板保险丝选型过程中,需要考虑多个因素以确保其适合特定的电路需求。最后,经过以上程序选定的样品需要在实际的电路中进行测试,以验证所选择的保险丝是否合适。

weixin_57010826的博客 1310

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android自定义组合view,Android中View自定义组合控件的基本编写方法

有很多情况下,我们只要运用好Android给我提供好的控件,经过布局巧妙的结合在一起,就是一个新的控件,我称之为“自定义组合控件”。那么,这种自定义组合控件在什么情况下用呢?或者大家在做项目时候会发现,某些布局会被重复的利用,同一个布局的XML代码块会被重复的复制黏贴多次,这样会造成代码结构混乱不说,代码量也会增大,各种控件都需要在Java代码中被申明和处理相应的逻辑,工作量着实不小,所以,必须要...

weixin_39648297的博客 249

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

android 组合控件,Android自定义View之组合控件

简介在Android开发中除了View的自定义绘制以外,组合控件也是比较常见的一种自定义View的方式,这种方式通过把系统提供的一些常见View组合起来,添加一些自定义的属性;很少或者根本不需要进行手动的额外绘制,操作相对简单一些,也能大幅度提升开发效率。在绝大多数app中都有这样的页面:常见页面需求整理从上图我们可以看到这种常见的UI效果中包含了几种情况:1.选择效果,例如时间的选择,点击右边弹...

weixin_31156945的博客 428

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

android自定义控件中文乱码,Android笔记--自定义View之组合控件

Android-自定义View分享是最好的记忆--如需转发请注明出处[强调]:共同学习 共同进步 不喜勿喷内容简介前言实现总结1. 前言这次更新有2个目的1. 复用控件,而不是每次都写冗余代码2. 好久没有更新了(๑• . •๑)在Android开发当中自定义View是一项不可或缺的技能,也是我们大部分小白以及小小白的软肋。自定义View其实也不是很难,因为我们不需要攻克什么技术难关,只需要...

weixin_35436076的博客 225

【安卓笔记】自定义view之组合控件

组合控件即将若干个系统已有的控件组合到一块形成一个组合控件,比如带返回按钮的标题栏就是一个最简单的组合控件。 使用组合控件的好处是提高代码的复用性,一处定义多处使用。 下面我们将使用组合控件实现这样的效果: 首先,我们需要自定义一个view: package com.example.widgets; import android.app.Activity; import

RowandJJ 2688

Android自定义View-自定义组合控件

简介 自定义组合控件就是多个控件组合起来 成为一个新的控件,其主要用于解决多次重复地使用同一类型的布局。比如我们应用的顶部标题栏及弹出 的固定样式的 Dialog,这些都是常用的,所以把它们所需要的控件组合起来重新定义成一个新的控件。 使用 首先,我们定义组合控件的布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout x...

solo_jm的博客 411

Android自定义View----1. 自定义组合控件

Android自定义View----1. 自定义View 实现方式 本节正文: 自定义View的实现方式大概可以分为三种,自绘控件、组合控件以及继承控件。接下来看下每种方式分别是如何自定义View的。 一、组合控件 自定义view中,组合控件是最简单的实现方式,组合控件可以理解为,充分利用系统原有的组件基础上,将多个组件放到同一个布局

Steampy专栏 777

android开发:自定义view之组合控件

日常生活中我们使用微信、QQ、微博等都会看到很多条目item,效果如下: 其实它是通过组合控件将textView和ImgView组合起来作为一个新的view: 1.在value文件夹下的attr文件加入我们自定义的属性声明 <declare-styleable name="MenuItemView"> <!--布局中左边的icon--> ...

一个程序员-二白的博客 563

Android自定义控件View(三)组合控件

不少人应该见过小米手机系统音量控制UI,一个圆形带动画效果的音量加减UI,效果很好看。它是怎么实现的呢?这篇博客来揭开它的神秘面纱。先上效果图 相信很多人都知道Android自定义控件的三种方式,Android自定义控件View(一)自绘控件,Android自定义控件View(二)继承控件,还有就是这一节即将学习到的组合控件。我们通过实现圆形音量UI来讲解组合控件的定义和使用。组合控件所谓组合控件

废墟的树的专栏 8787

android自定义view之组合控件

1、比如要实现下面的这种效果: 2、首先实现布局效果,新建布局文件layout_custom <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://sch...

程序浪的专栏 305

菜鸟笔记的第一天,自定义View(组合控件)

菜鸟笔记的第一天,自定义View之组合控件,求鼓励

冰冰有礼的博客 266
上一篇: 使用Fragment实现微信界面的点击切换
下一篇: Android多线程机制解析
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值