《Android 群英传》读书笔记:自定义 View 之创建复合控件

Android自定义复合控件深入实践指南 本文还有配套的精品资源,点击获取 简介:Android自定义复合控件是提升应用UI个性化和功能性的关键手段。本示例将指导初学者理解并掌握创建自定义复合控件的完整过程,涵盖从创建自定义View类、绘制视图、属性定义、事件处理、布局参数、XML中使用自定义控件、实例化与使用、测试与调试到性能优化和复用与封装。开发者将通过本指南学习如何根据项目需求创造出具有独特功能和外观的UI组... 阅读详情

转载请注明出处: http://blog.youkuaiyun.com/like_program/article/details/53164867

创建复合控件可以很好地创建出具有重用功能的控件集合。这种方式通常需要继承一个合适的 ViewGroup,再给它添加指定功能的控件,从而组合成新的复合控件。

通过这种方式创建的控件,我们一般会给它指定一些可配置的属性,让它具有更强的拓展性。

下面以一个 TopBar 为例,讲解如何创建复合控件。

先看下最终效果图:

效果图1

打开 Android Studio,新建 TopBarTest 项目。

1. 自定义属性

在 res / values 目录下新建 attrs.xml ,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="TopBar">
        <!-- 标题内容 -->
        <attr name="title_text" format="string"/>
        <!-- 标题字体大小 -->
        <attr name="title_text_size" format="dimension"/>
        <!-- 标题颜色 -->
        <attr name="title_text_color" format="color"/>
        <!-- 左边按钮的文字 -->
        <attr name="left_text" format="string"/>
        <!-- 左边按钮文字颜色 -->
        <attr name="left_text_color" format="color"/>
        <!-- 左边按钮的背景 -->
        <attr name="left_bg" format="reference|color"/>
        <!-- 右边按钮文字 -->
        <attr name="right_text" format="string"/>
        <!-- 右边按钮文字颜色 -->
        <attr name="right_text_color" format="color"/>
        <!-- 右边按钮背景 -->
        <attr name="right_bg" format="reference|color"/>
    </declare-styleable>

</resources>
  • <declare-styleable> 标签声明使用自定义属性
  • name 属性来确定引用的名称
  • <attr> 标签来声明具有的自定义属性
  • format 属性来指定自定义属性的类型
注意:

有些属性可以是颜色属性,也可以是引用属性。比如按钮的背景,可以把它指定为颜色,也可以把它指定为一张图片,所以用 “ | ” 来分割不同的属性 – reference|color 。

确定好属性后,我们在代码中获取这些属性。

2. 创建自定义控件

自定义属性写好了之后,就可以创建一个自定义控件,让它继承自 ViewGroup。

新建 TopBar.java,继承自 RelativeLayout,代码如下:

package com.example.topbartest;

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

public class TopBar extends RelativeLayout {

    /**
     * 左边按钮的文字颜色
     */
    private int mLeftTextColor;

    /**
     * 左边按钮的背景
     */
    private Drawable mLeftBackground;

    /**
     * 左边按钮的文字
     */
    private String mLeftText;

    /**
     * 右边按钮的文字颜色
     */
    private int mRightTextColor;

    /**
     * 右边按钮的背景
     */
    private Drawable mRightBackground;

    /**
     * 右边按钮的文字
     */
    private String mRightText;

    /**
     * 标题文字的颜色
     */
    private int mTitleTextColor;

    /**
     * 标题文字的大小
     */
    private float mTitleTextSize;

    /**
     * 标题文字
     */
    private String mTitleText;

    /**
     * 左边按钮
     */
    private Button mLeftButton;

    /**
     * 右边按钮
     */
    private Button mRightButton;

    /**
     * 标题
     */
    private TextView mTitleView;

    private LayoutParams mLeftParams;
    private LayoutParams mRightParams;
    private LayoutParams mTitleParams;

    public TopBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public TopBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        setBackgroundColor(0xFFF59563);
        // 把在 attrs.xml 中定义的 declare-styleable 中
        // 所有属性名称存储到 TypedArray 中
        TypedArray typedArray = context.obtainStyledAttributes(attrs,
                R.styleable.TopBar);

        // 从 TypedArray 中取出各属性对应的值
        // 取出的值是我们在 layout_topbar.xml 中给各属性赋的值
        mLeftTextColor = typedArray.getColor(
                R.styleable.TopBar_left_text_color, 0);
        mLeftBackground = typedArray
                .getDrawable(R.styleable.TopBar_left_bg);
        mLeftText = typedArray.getString(R.styleable.TopBar_left_text);

        mRightTextColor = typedArray.getColor(
                R.styleable.TopBar_right_text_color, 0);
        mRightBackground = typedArray
                .getDrawable(R.styleable.TopBar_right_bg);
        mRightText = typedArray.getString(R.styleable.TopBar_right_text);

        mTitleTextColor = typedArray.getColor(
                R.styleable.TopBar_title_text_color, 0);
        mTitleTextSize = typedArray.getDimension(
                R.styleable.TopBar_title_text_size, 10);
        mTitleText = typedArray.getString(R.styleable.TopBar_title_text);

        // 获取完 TypedArray 的值后,
        // 一般要调用 recycle 方法来避免重新创建的时候出错
        typedArray.recycle();

        mLeftButton = new Button(context);
        mRightButton = new Button(context);
        mTitleView = new TextView(context);

        // 为创建的组件元素赋值
        mLeftButton.setBackgroundDrawable(mLeftBackground);
        mLeftButton.setText(mLeftText);
        mLeftButton.setTextColor(mLeftTextColor);

        mRightButton.setBackgroundDrawable(mRightBackground);
        mRightButton.setText(mRightText);
        mRightButton.setTextColor(mRightTextColor);

        mTitleView.setTextColor(mTitleTextColor);
        mTitleView.setTextSize(mTitleTextSize);
        mTitleView.setText(mTitleText);

        // 标题文字在 TextView 中心
        mTitleView.setGravity(Gravity.CENTER);

        // 左边按钮的布局参数
        mLeftParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.MATCH_PARENT);
        // 左边按钮在父布局的左边
        mLeftParams.addRule(ALIGN_PARENT_LEFT, TRUE);
        // 添加到父布局
        addView(mLeftButton, mLeftParams);

        // 右边按钮的布局参数
        mRightParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.MATCH_PARENT);
        // 右边按钮在父布局的右边
        mRightParams.addRule(ALIGN_PARENT_RIGHT, TRUE);
        // 添加到父布局
        addView(mRightButton, mRightParams);

        // 标题的布局参数
        mTitleParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.MATCH_PARENT);
        // 标题在父布局的中心
        mTitleParams.addRule(CENTER_IN_PARENT, TRUE);
        // 添加到父布局
        addView(mTitleView, mTitleParams);

        mLeftButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener != null) {
                    mListener.leftClick();
                }
            }
        });

        mRightButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener != null) {
                    mListener.rightClick();
                }
            }
        });
    }

    public TopBar(Context context) {
        super(context);
    }
}

之所以在 public TopBar(Context context, AttributeSet attrs) 这个构造方法中实例化布局,是因为等会要从布局文件中加载 TopBar。

要实例化布局文件中的控件,就会执行 public TopBar(Context context, AttributeSet attrs) 这个构造方法。

刚刚我们调用 typedArray.getXXX() 方法来获取自定义属性的值。那么我们就要在布局文件中给我们自定义的属性赋值。

新建 layout_topbar.xml ,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<com.example.topbartest.TopBar xmlns:android="http://schemas.android.com/apk/res/android"
                               xmlns:app="http://schemas.android.com/apk/res-auto"
                               android:layout_width="match_parent"
                               android:layout_height="40dp"
                               app:left_bg="@drawable/blue_button"
                               app:left_text="返回"
                               app:left_text_color="#FFFFFF"
                               app:right_bg="@drawable/blue_button"
                               app:right_text="更多"
                               app:right_text_color="#FFFFFF"
                               app:title_text="自定义标题"
                               app:title_text_color="#123412"
                               app:title_text_size="10sp">

</com.example.topbartest.TopBar>

blue_button 是一个选择器,blue_button.xml 代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- 手指按下 -->
    <item android:state_pressed="true">
        <!-- 矩形 -->
        <shape android:shape="rectangle">

            <!-- 填充的颜色 -->
            <solid android:color="#33444444"/>
        </shape>
    </item>
    <!-- 手指未按下 -->
    <item>
        <!-- 矩形 -->
        <shape android:shape="rectangle">

            <!-- 填充的颜色 -->
            <solid android:color="#3EC5FF"/>
        </shape>
    </item>

</selector>
命名空间
xmlns:android="http://schemas.android.com/apk/res/android"

这行代码就是在指定引用的命名空间 xmlns,即 xml namespace。这里指定了命名空间为 android,因此在接下来使用系统属性的时候,才可以使用 android: 来引用 Android 的系统属性。

同样的,如果要使用自定义的属性,那么就需要创建自己的命名空间。

在 Android Studio 中,默认使用如下代码引入命名空间:

xmlns:app="http://schemas.android.com/apk/res-auto"

命名空间可以随便命名,然后使用自定义的属性时,就可以通过这个命名空间来引用。

3. 引用模板

在 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="com.example.topbartest.MainActivity">

    <include
        android:id="@+id/topBar"
        layout="@layout/layout_topbar"/>
</RelativeLayout>

如果不想用 <include> 标签引用复合控件,也可以直接在布局文件 activity_main.xml 中引入 TopBar:

<?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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context="com.example.topbartest.MainActivity">

    <com.example.topbartest.TopBar
        android:id="@+id/topBar"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        app:left_bg="@drawable/blue_button"
        app:left_text="返回"
        app:left_text_color="#FFFFFF"
        app:right_bg="@drawable/blue_button"
        app:right_text="更多"
        app:right_text_color="#FFFFFF"
        app:title_text="自定义标题"
        app:title_text_color="#123412"
        app:title_text_size="10sp"/>
</RelativeLayout>
注意:

如果在布局文件 activity_main.xml 中引入 TopBar,需要引入命名空间:

xmlns:app="http://schemas.android.com/apk/res-auto"

4. 给按钮添加点击逻辑

由于是 UI 模板,那么每个调用者所需要这些按钮能够实现的功能都是不一样的,所以,不能直接在 UI 模板中添加具体的实现逻辑,只能通过接口回调的思想,将具体的实现逻辑交给调用者。

1. 定义接口

在 TopBar.java 中定义一个左右按钮点击的接口,在接口中创建两个方法,分别用于左边按钮的点击和右边按钮的点击,代码如下:

public interface OnTopBarClickListener {
    // 左按钮点击事件
    void leftClick();
    // 右按钮点击事件
    void rightClick();
}

2. 暴露接口给调用者

定义好了接口之后,要暴露接口给调用者来注册接口回调。

private OnTopBarClickListener mListener;

public void setOnTopBarClickListener(OnTopBarClickListener listener) {
    mListener = listener;
}

3. 调用接口

public TopBar(Context context, AttributeSet attrs) {
    super(context, attrs);

    ......

    mLeftButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mListener != null) {
                mListener.leftClick();
            }
        }
    });

    mRightButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mListener != null) {
                mListener.rightClick();
            }
        }
    });
}
注意:

调用接口的方法时,一定要先判断接口是否为空,否则,如果调用者没有实现这个接口,那么 mListener 就还是为 null,这时调用接口的方法,就会引起 NullPointerException (空指针异常)

4. 调用者实现接口回调

修改 MainActivity.java ,代码如下:

private TopBar mTopBar;

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

    mTopBar = (TopBar) findViewById(R.id.topBar);
    mTopBar.setOnTopBarClickListener(new TopBar.OnTopBarClickListener() {
        @Override
        public void leftClick() {
            Toast.makeText(MainActivity.this, "点击了 返回", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void rightClick() {
            Toast.makeText(MainActivity.this, "点击了 更多", Toast.LENGTH_SHORT).show();
        }
    });
}

运行一下程序:

效果图1

TopBar 已经成功显示出来了。

5. 设置按钮的显示或隐藏

引用模板的时候,可能不需要某个按钮,也可能根本不需要按钮,所以最好能动态的修改 UI 模板的按钮显示或隐藏,提供模板的可定制性。

要设置按钮的显示或隐藏,我们可以给左边按钮和右边按钮设置 id,通过 id 来区别是哪个按钮,从而控制按钮的显示或隐藏。

修改 TopBar.java ,代码如下:

/**
 * 左边按钮的 id
 */
public static final int BUTTON_LEFT = 0;

/**
 * 右边按钮的 id
 */
public static final int BUTTON_RIGHT = 1;

/**
 * 设置按钮的显示或隐藏
 *
 * @param id     按钮 id
 * @param isShow true 为 显示
 *               false 为隐藏
 */
public void setButtonVisible(int id, boolean isShow) {
    if (isShow) {
        if (id == BUTTON_LEFT) {
            mLeftButton.setVisibility(VISIBLE);
        } else if (id == BUTTON_RIGHT) {
            mRightButton.setVisibility(VISIBLE);
        }
    } else {
        if (id == BUTTON_LEFT) {
            mLeftButton.setVisibility(INVISIBLE);
        } else if (id == BUTTON_RIGHT) {
            mRightButton.setVisibility(INVISIBLE);
        }
    }
}

然后我们在 MainActivity.java 中动态控制按钮的显示或隐藏,代码如下:

// 显示左边按钮
mTopBar.setButtonVisable(TopBar.BUTTON_LEFT, true);
// 隐藏右边按钮
mTopBar.setButtonVisable(TopBar.BUTTON_RIGHT, false);

运行一下程序:

效果图2

可以看到,右边按钮已经被隐藏了。

源码下载

Android自定义复合控件实现通用标题栏 主要为大家详细介绍了Android自定义复合控件实现通用标题栏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 立即下载

相关推荐

PWM调光原理详解:为什么你的LED灯会闪烁?从硬件到软件的避坑指南

本文深入解析PWM调光原理,揭示LED灯闪烁的根本原因,并提供从硬件设计到软件算法的全面解决方案。通过分析人眼视觉暂留机制和PWM参数设置,帮助开发者避免频闪问题,提升照明质量。特别适合电子工程师和智能家居开发者参考。

weixin_29189363的博客 292

android复合控件

一.复合控件TopBar 创建复合控件可以很好地创建出具有重用功能的控件集合。比如TopBar。 做法:一般需要继承ViewGroup,再给它添加指定功能的控件。 以TopBar为例: 1.自定义属性 在values目录下创建attrs.xml文件,在该文件中定义相关的属性即可。 <?xmlversion="1.0"encoding="utf-8"...

ddd2015的博客 257

Gazebo仿真环境下的强化学习实现

实际上利用Gazebo进行强化学习无非是环境获取上的不同,Gazebo的环境控制需要使用ROS服务进行控制,状态可以通过Gazebo进行获取,同时某些必要数据需要从话题中获取,最重要的是组织获取 的数据(通过话题等)与控制Gazebo的仿真步骤之间的组合。强化学习的手段与传统算法无异,强化学习方法最重要的是要确定动作空间、状态空间、奖励空间,这三个空间是work的前提。在笔者自己的环境中,将获取里程计的话题以及获取激光点的数据替换成为了自己的本机的仿真环境匹配的话题。

Moresweet 猫甜 6447

android 复合 控件,Android 复合控件 图片+文字有选中效果和点击事件

封装一个小小的控件,便于复用,分享一下,如果有更好的方法请告知首先创建复合控件的布局文件icontextview.xmlandroid:id="@+id/layout_icontextview"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:...

weixin_28686771的博客 381

Sobel原理及计算过程详解

该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。首先,我们需要构建一个Sobel算子,通常是一个 3x3 的矩阵。Sobel算子可以分别计算水平和垂直方向的梯度值,然后将两者合并得到总梯度值。索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度近似值。所以,我们假设选择图像矩阵中的点A(1, 1),即第二行第二列的元素,对应的。接下来,我们将使用Sobel算子计算这个点的梯度值。

2301_76461741的博客 1万+

FPGA SPI驱动ADC避坑指南:以ADC128S022为例,详解时序设计与代码调试

本文以ADC128S022为例,详细解析FPGA通过SPI驱动ADC的时序设计与代码调试中的常见问题。从时钟分频计算、SPI模式选择到状态机实现,提供避坑指南和实战技巧,帮助工程师解决数据采集系统中的时序匹配难题。特别针对FPGA与ADC通信中的微妙差异,给出精确的Verilog代码示例和ModelSim仿真验证方法。

weixin_42522374的博客 458

Android 自定义View(二):创建复合控件

另一个例子:自定义switch按钮创建复合控件分为三步:1.     设计属性2.      实现View3.     引用View这里设计一个qq联系人界面的TopBar其中有三部分组成,左边圆形头像,中间文本,右边按钮,还有个蓝色默认背景1.设计属性在Android Studio的res的values中右键新建XML文件qq_topbar_attrs.xml,内容如下android中通过&lt...

0729Liang 954

别再手动备份了!用Python脚本批量导出华为/华三交换机配置(附完整代码)

本文详细介绍了如何使用Python脚本实现华为/华三交换机配置的自动化备份,大幅提升网络运维效率。通过paramiko库建立SSH连接,结合pandas处理设备清单,实现配置的批量导出与规范化存储,解决传统手动备份耗时易错的问题。

weixin_28737603的博客 448

Android群英传读书笔记---自定义控件(-)

自定义控件虽然我也写过自定义控件,但是从没有进行一个系统的总结,正好借这本书的内容,重新梳理一下, 通常情况下,常用的有三种方法: 对现有控件进行扩展 通过组合控件来实现新的控件 重写view来实现全新的控件(最难) 1. 对现有控件进行拓展对原生控件的扩展,只需要重写onDraw(Canvas canvas)即可private void initPaint(){ paint1 = new

charles_lun专栏 1539

【AI黑话日日新】什么是AI Infra?

是支撑AI模型开发、训练、推理、部署与规模化运营的,是连接底层算力与上层AI应用的“数字基建”。没有高效的AI Infra,大模型训练、推理与落地都无法高效实现。

专注:太空算力、AI infra、异构调度、大模型成本工程 1094

YOLOv9分割训练自己数据和推理训练好模型,并教你使用Labelme工具标注数据(附YOLOv9分割模型结构图),全网最详细教程

YOLOv9 通过研究数据传输时的信息丢失问题,提出了可编程梯度信息(PGI)和通用高效层聚合网络(GELAN)架构,提高了参数利用率和模型性能。与 SOTA 方法相比,GELAN 仅使用传统卷积算子即可实现更好的参数利用率。PGI 适用于从轻型到大型的各种模型,使从头开始训练的模型能够获得更好的结果。YOLOv9 被评价为新的 SOTA 实时目标检测器。接下来本文手把手教你训练自己分割数据集和推理训练好的分割模型。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1491

《Android群英传》---读书笔记1

Android群英传—-读书笔记标签: android进阶 读书笔记1.3 Android app组件架构应用运行上下文 可以理解为Context即为android系统中应用的上下文对象 Activity, Service, Application都是继承自Context 当应用程序第一次启动的时候,Android系统会创建一个Application对象,同时创建Application Co

yarsnwoing的博客 445

从开发到生产:Power APP 的应用和编程实践

一旦您在开发环境中完成了应用程序的开发、调试和测试,就可以将其部署到生产环境中供用户使用。在 Power APP Studio 中,您可以选择将应用程序发布到 Power APP 网关或将其嵌入到其他应用程序中。使用 Power APP Studio 内置的调试工具,您可以逐步执行应用程序并查看变量的值,以确保逻辑的正确性。在上述代码中,我们通过将两个文本输入框(TextInput1 和 TextInput2)中的文本转换为数字,并将它们相加,将结果存储在 Result 变量中。

2301_79326510的博客 1504

Android群英传读书笔记——第三章:Android控件架构和自定义控件详解

第三章目录 3.1 Android控件架构 3.2 View的测量 3.3 View的绘制 3.4 ViewGroup的测量 3.5 ViewGroup的绘制 3.6 自定义View  3.6.1 对现有的空间进行拓展 3.6.2 创建复合控件 3.6.3 重写View来实现全新的空间 3.7 自定义ViewGroup 3.8 事件拦截机制分析 第三章读书笔记 3.1 Andro...

pengbo6665631的博客 308

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android控件架构与自定义控件详解

基于 《android 群英传 》的读书笔记

Amant 1113

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android自定义控件

当系统控件不能满足我们的需求的时候,这时候我们就需要自定义控件,根据我们的需求来定制一个能满足我们需求的控件。如果预构建的微件或布局都不能满足您的需求,您可以创建自己的 View 子类。如果您只需要对现有微件或布局进行细微调整,则只需将相应微件或布局子类化并替换其方法即可。

qq_50726065的博客 846

jre9下载 jdk9

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

android 自定义复合控件

接下来给大家介绍android的自定义复合控件的方法。为什么要自定义复合控件?这个问题问的比较经典。。。。大家都知道面对组件开发的开发方式有很多的好处,其中最大的好处就是能够提高组件的复用,如果组件需要变化的时候也容易进行修改和重构。举个例子来说如下图如果每个acitivity都需要一个顶部的导航的话,如果不把其当成组件进行开发那么所有的页面我们都需要对其重新进行布局,而且对该控件每个页面都需要进

曾庆磊的个人博客 4881

安卓开发学习之018 创建复合控件

复合控件即是指不可分割的、自包含的视图组,其中包含了多个排列和连接在一起的子视图。 当创建复合控件时,必须对它包含的视图的布局、外观和交互进行定义。复合控件是通过扩展一个ViewGroup(通常是一个布局)来创建的。以你,要创建一个新的复合控件,首先需要选择一个最合适放置子控件的布局类,然后扩展该类public class MyCompoundView extends LinearLayout {

Yu的专栏 1243

构造Android复合控件

在Android的界面设计中,经常使用到比较类似的布局,比如说:系统设置等等地方,而这些布局每次单独的使用会使用大量的代码进行构建,在这里我给各位介绍一种复合控件的使用,如有不对之处,请指教。 1.单个子项的代码:单个子项的布局文件就相当于ListView的item类似,实际上就是界面上相似的布局尽最大的可能统一到一个布局文件中,容纳拥有最多的控件的布局,通过属性值来控制布局中各个控件的显示。可以

非洲的企鹅 429

记录学习Android基础的心得05:常用控件(基础篇)

文章目录前言一、基本控件二、1.总结 功高成怨府,权盛是危机。——王迈《读渡江诸将传》 前言 在心得文章02里面介绍了控件的常识知识,本文书接上文,由易到难接着介绍常用控件的基础知识:单选按钮RadioButton、复选框CheckBox、开关Switch、评分条RatingBar、进度条ProcessBar,接着介绍编辑框EditText的定制使用,菜单Menu的用法,最后给出下拉框Spinner和适配器adapter的简单使用。本文控件的描述方法为:默认的外形展示->类结构的分析->

YQYUN的博客 2719

android自定义View之复合控件

复合控件可以很好地创建出具有重用功能的控件集合。 很多的APP都有一些共通的UI界面,为了统一应用程序的风,下面我们就以一个Topbar为实例讲解复合控件。 实现效果如图: 第一步:定义属性 在res资源目录的values目录下创建一个attrs.xml属性定义文件,为一个View提供可自定义的属性。 代码中,通过标签声明了自定义属性,并通过name属性来确定引用的名称。 <?xml

qq_24023775的博客 508

Android的创建复合控件

新建工程,在values新建resour flie,取名为attrs(attr是attribute 属性的简写,因为有多个属性,所以就取名为attrs )。 先举个栗子<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="myTop"> <attr name="m

qq_34396634的博客 356

android:layout_margin真实含义 及 自定义复合控件 layout()执行无效的问题解决

一、关于layout_margin 搞Android时间也不短了,对layout_margin也不陌生了,可最近遇到一个问题让我发现,对它的认识还不够深入全面。大量网络资料上都说,layout_margin指view距离父view的距离。这个说法不够严谨,正确的说法是,距离view的相对view的距离才更准确。 在Linearlayout下,可以认为是距离父view的距离。但在RelativeLa

yanzi1225627的专栏 2万+

Android常用控件

单选按钮控件,继承了 Button 控件,可以直接使用 Button 控件支持的各种属性和方法。与普通按钮不同的是,RadioButton 控件多了一个可以选中的功能。EditText 控件允许用户在控件里输入和编辑内容,并可以在程序中对这些内容进行处理。其继承自 TextView 控件,具有 TextView 的所有属性的同时,还有自己的属性。CheckBox 控件是复选框控件,继承于 Button 控件,一般用于多项选中操作。除了拥有View类的属性,还发展了些自己的属性,常用的如下图所示。

weixin_58963766的博客 5748

Android 常见界面控件(简单控件篇)

第3章 Android 常见界面控件(简单控件篇) 目录第3章 Android 常见界面控件(简单控件篇)3.1 简单控件的使用3.1.1 TextView3.1.2 Button3.1.3 EditText3.1.4 ImageView3.1.5 RadioButton3.1.6 CheckBox3.1.7 Toast 3.1 简单控件的使用 3.1.1 TextView TextView控件用于显示文本信息,我们可以在XML布局文件中以添加属性的方式来控制TextView的样式,

小菜鸡的小博客 7471
上一篇: 《Android 群英传》读书笔记:自定义 View 之对现有控件进行拓展
下一篇: 《Android 群英传》读书笔记:自定义 View -- 比例图
like_program
博客等级 码龄10年 88粉丝 18原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值