Android开发之自定义控件-组合控件的开发与实现

这篇具有很好参考价值的文章主要介绍了Android开发之自定义控件-组合控件的开发与实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最终实现的效果展示图:

Android开发之自定义控件-组合控件的开发与实现

 Android开发之自定义控件-组合控件的开发与实现

类似支付宝微信,底部分隔线对齐标题效果:

Android开发之自定义控件-组合控件的开发与实现

 

Android开发之自定义控件-组合控件的开发与实现

 

 

完整渲染显示效果(包含三个条目右边不同颜色的文字):

Android开发之自定义控件-组合控件的开发与实现

立体效果: 

Android开发之自定义控件-组合控件的开发与实现

隐藏资产总额条目右边更多箭头 

Android开发之自定义控件-组合控件的开发与实现

隐藏中国历史条目右边的文字:

Android开发之自定义控件-组合控件的开发与实现

隐藏中国历史条目下边的分隔线:

Android开发之自定义控件-组合控件的开发与实现

隐藏条目2中国历史左边的图标:

Android开发之自定义控件-组合控件的开发与实现

 效果说明:

上图中我们实现了自定义组合控件,每个条目中实际包含了至少5个安卓组件,箭头右边的文字及每个构成组件各个元素都可以实现灵活配置隐藏或更改颜色等操作。使用时,每个条目是一个整体,非常方便高效。当然我们还可以根据自己的需要在条目中添加更多的控件来实现高效的自定义控件效果:比如在右边的文字和箭头中间,又或者是左边的文字右边添加一个红色小圆圈,实现有更新内容的提示。类似微信或支付宝app的效果。

下面开始教程:

如下图所示,想必类似的条目布局大家都不陌生,在各种app的个人信息页面或者设置页面很常见,我们需要重复的将几种原生控件组合到一起使用:

Android开发之自定义控件-组合控件的开发与实现

Android开发之自定义控件-组合控件的开发与实现

这时我们就可以把这几个控件组合成一个控件来使用(自定义组合控件),方便高效简洁。

单个条目如下面的效果:

Android开发之自定义控件-组合控件的开发与实现

要实现上面的单个条目的组合,首先,我们根据条目的需求新建一个条目的布局文件item_view.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="50dp">

    <ImageView
            android:id="@+id/item_icon"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_margin="10dp"
            android:src="@drawable/ic_baseline_supervisor_account_24"
            android:layout_centerVertical="true"/>

    <TextView
            android:id="@+id/item_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="用户名"
            android:layout_centerVertical="true"
            android:textColor="#000000"
            android:layout_toRightOf="@+id/item_icon"/>

    <TextView
            android:id="@+id/item_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Crystal"
            android:layout_centerVertical="true"
            android:textColor="#B8860B"
            android:visibility="visible"
            android:layout_toLeftOf="@+id/item_arrow"/>

    <ImageView
            android:id="@+id/item_arrow"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:src="@drawable/ic_baseline_keyboard_arrow_right_24"
            android:layout_alignParentRight="true"
            android:layout_marginRight="10dp" />

    <View
            android:id="@+id/item_line"
            android:layout_width="match_parent"
            android:layout_height="0.5dp"
            android:layout_alignParentBottom="true"
            android:visibility="visible"
            android:background="#D3D3D3"/>
</RelativeLayout>

如上,我们以RelativeLayout布局为根布局,包含一个条目的2个ImageView、2个TextView、一个View。然后需要创建一个自定义控件ItemView并继承自LinearLayout,并实现其构造方法,在构造方法中进行初始化,代码如下:

package com.example.CustomItem;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * @author wh445306
 * @version 1.0
 * @Description ItemView
 * @Date 2023-03-14 1:23
 */

public class ItemView extends LinearLayout {
    private Boolean isBottom;
    private Boolean isItemText;
    private Boolean isArrow;
    private ImageView itemIcon;
    private ImageView rightArrow;
    private TextView leftTitle;
    private TextView itemText;
    private View itemLine;


    public ItemView(Context context, AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(getContext()).inflate(R.layout.item_view, this);
        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ItemView);//解析布局

        isBottom = ta.getBoolean(R.styleable.ItemView_show_bottom_line, true); //底部分割线是否显示
        isItemText = ta.getBoolean(R.styleable.ItemView_show_right_text, true);//右边描述文字是否显示
        isArrow = ta.getBoolean(R.styleable.ItemView_show_right_arrow, true);  //右边箭头是否显示

        itemIcon = findViewById(R.id.item_icon);   //左边图标
        rightArrow = findViewById(R.id.item_arrow);//右边箭头
        leftTitle = findViewById(R.id.item_title); //左边标题文字
        itemText = findViewById(R.id.item_text);   //右边描述文字或数值
        itemLine = findViewById(R.id.item_line);   //底部分割线

        itemIcon.setImageDrawable(ta.getDrawable(R.styleable.ItemView_left_icon)); //图标赋值

        leftTitle.setText(ta.getText(R.styleable.ItemView_left_title));
        itemText.setText(ta.getText(R.styleable.ItemView_right_text));
        itemText.setTextColor(ta.getColor(R.styleable.ItemView_right_text_color, Color.BLACK)); 
        itemText.setVisibility(isItemText ? VISIBLE : INVISIBLE);
        itemLine.setVisibility(isBottom ? VISIBLE : INVISIBLE);
        rightArrow.setVisibility(isArrow ? VISIBLE : GONE); 



        //回收属性对象
        ta.recycle();

    }

}

在初始化的方法中,首先我们使用布局填充器 LayoutInflater 的 inflate() 方法来加载刚刚定义的 item_view.xml 布局,并且要特别注意【参二】传入了一个 this 对象,表示指定当前的 ItemView 对象为加载的布局文件的父控件,即 item_view.xml 布局为 ItemView 的子布局。否则,如果传入 null 的话,则就需要我们再使用 addView(child) 方法为当前 ItemView 添加子布局。

        然后使用 findViewById() 方法获取控件,并且提供了 setTitle() 和 setImageResource() 方法用于在外部分别设置每个条目的图片和标题,这样就可以在页面的布局文件中引用 ItemView 控件,并且在代码中为每个条目设置不用的内容,这样一个自定义组合控件就告一段落了。

        现在我们可以在代码中为每个条目设置不同的内容(图片和标题)了,但是如果我们想直接在页面布局文件的 ItemView 标签内控制每个条目的内容,就像系统控件的各个属性那样,这就需要再为 ItemView 控件自定义一些其它属性了。

 如何为我们的自定义控件:ItemView 自定义一些其它属性呢?

首先在 res/values 目录下创建 attrs.xml 属性文件,然后仿照系统的 attrs.xml 属性文件中的格式为 ItemView控件自定义属性,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<resources>
        <declare-styleable name="ItemView">
            <attr name="left_icon" format="integer" /><!--左侧图标-->
            <attr name="left_title" format="string" /><!--左侧标题文字-->
            <attr name="right_text" format="string" /><!--右侧描述文字-->
            <attr name="right_text_color" format="color" /><!--右侧描述文字颜色-->
            <attr name="show_right_text" format="boolean" /><!--是否显示右侧描述文字-->
            <attr name="show_right_arrow" format="boolean" /> <!--是否显示右侧箭头-->
            <attr name="show_bottom_line" format="boolean" /> <!--是否显示下划线-->
        </declare-styleable>

</resources>

到这里我们就可以在app主布局页面中直接引用我们的自定义组合控件 ItemView 了,并且在布局文件中为控件设置不同的属性,布局文件如下:

<?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="wrap_content"
              android:orientation="vertical"
              tools:context=".MainActivity">

        <com.example.CustomItem.ItemView
                android:id="@+id/txt1"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                app:left_icon="@drawable/ic_baseline_supervisor_account_24"
                app:left_title="用户名"
                app:right_text="Crystal"
                app:right_text_color="#228B22"
                app:show_right_arrow="true"
                app:show_bottom_line="true"/>

        <com.example.CustomItem.ItemView
                android:id="@+id/txt2"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                app:left_icon="@drawable/ic_baseline_settings_24"
                app:left_title="中国历史"
                app:right_text="上下五千年的岁月"
                app:right_text_color="#9400D3"
                app:show_right_arrow="true"
                app:show_right_text="true"
                app:show_left_icon="true"
                app:show_bottom_line="true"/>

        <com.example.CustomItem.ItemView
                android:id="@+id/txt3"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                app:left_icon="@drawable/ic_baseline_attach_money_24"
                app:left_title="资产总额"
                app:right_text="186,889.59"
                app:show_right_arrow="true"
                app:show_bottom_line="true"/>


</LinearLayout>

可以看到,此时我们并没有在代码中为条目设置内容,但布局文件的自定义属性已经生效,如下所示。现在的界面看起来和最开始的写3个 RelativeLayout 布局并没有什么变化,但是我们的处理方式已经完全不一样了,如果有很多这样的条目,那么后续使用将非常方便,而且布局文件的条理也会非常清晰。

然后运行起来效果就出来了:

Android开发之自定义控件-组合控件的开发与实现

作者原创文章,转载请注明出处,谢谢 文章来源地址https://www.toymoban.com/news/detail-496571.html

到了这里,关于Android开发之自定义控件-组合控件的开发与实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 之自定义绘制一

    绘制的基本要素 onDraw(Canvas) 绘制方法 Canvas 绘制工具 Paint 调整风格 粗细等 坐标系: x y ,3D 会有z轴,x  左到右,y 上至下,与数学中y颠倒 尺寸单位: 布局中 dp ,sp ,代码中 px;dp 为了适配不同的尺寸 绘制的关键: draw(Canvas )......(关键类:Paint) Paint.ANTI_ALIAS_FLAG 抗锯齿 paint.setFlag 像

    2024年02月11日
    浏览(35)
  • Android之自定义时间选择弹框

    随着产品人员不断变态下,总是会要求我们的界面高大上,随意UI能画出来我们就得搞出来才行,这里有自定义弹框,以及时间选择控件的运用,根据年和月判断当月有多少天,需要什么就copy什么。 代码如下(示例): 代码如下(示例): 代码如下(示例): 代码如下(示

    2024年02月10日
    浏览(29)
  • Qt自定义控件 —— 颜色选择组合控件

             在开始阅读本文之前,如果您有学习创建Qt自定义控件并在其他项目中引用的需求,请参考: Linux系统下在Qt Creator中创建自定义控件并在其他项目中引用 https://blog.csdn.net/YMGogre/article/details/128920804 目录 1、应用场景: 2、所需资源: 3、界面布局: 3.1、各布局/控件

    2024年02月10日
    浏览(28)
  • C# 自定义控件库之Lable组合控件

    1、创建类库 2、在类库中添加用户控件(Window窗体) 3、控件视图 4、后台代码

    2024年02月07日
    浏览(30)
  • Hexo 主题开发之自定义模板

    关于 Hexo 如何开发主题包的教程已经是大把的存在了,这里就不再赘述了。这篇文章主要讲的是作为一个主题的开发者,如何让你的主题具有更好的扩展性,在用户自定义修改主题后,能够更加平易升级主题。 Hexo 提供两种方式安装主题包: 直接在 themes 目录下直接存放主题

    2024年02月04日
    浏览(40)
  • 微信小程序之自定义组件开发

    从小程序基础库版本 1.6.3 开始,小程序支持简洁的组件化编程。所有自定义组件相关特性都需要基础库版本 1.6.3 或更高。开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用;也可以将复杂的页面拆分成多个低耦合的模块,有助于代码维护。自

    2024年02月02日
    浏览(32)
  • 鸿蒙OS应用开发之自定义弹窗

    前面学习了文本输出,这是比较常用的输出方式,毕竟它是向人们展示内容的基本方式。在这里学习另外一个展示方式,就是弹窗的方式。说到弹窗,其实用户是非常害怕的,因为意味用户必须处理这个窗口,不处理就不能返回。特别是弹窗的广告,更是让用户痛苦不已,所

    2024年02月04日
    浏览(40)
  • 使用WPF开发自定义用户控件,以及实现相关自定义事件的处理

    在前面随笔《使用Winform开发自定义用户控件,以及实现相关自定义事件的处理》中介绍了Winform用户自定义控件的处理,对于Winform自定义的用户控件来说,它的呈现方式主要就是基于GDI+进行渲染的,对于数量不多的控件呈现,一般不会觉察性能有太多的问题,随着控件的数量

    2024年02月02日
    浏览(40)
  • 使用Winform开发自定义用户控件,以及实现相关自定义事件的处理

    在我们一些非标的用户界面中,我们往往需要自定义用户控件界面,从而实现不同的内容展示和处理规则,本篇内容介绍使用Winform开发自定义用户控件,以及实现相关自定义事件的处理。 对于比较规范的界面,需要进行一定的分析,以便从中找到对应的规则,逐步细化为自

    2024年02月03日
    浏览(30)
  • Jmeter 压测实战:Jmeter 二次开发之自定义函数

    目录 1 前言 2 开发准备 3 自定义函数核心实现 3.1 新建项目 3.2 继承实现 AbstractFunction 类 3.3 最终项目结构 4 Jmeter 加载扩展包 4.1 maven 构建配置 4.2 项目打包 4.3 Jmeter 加载扩展包 5 自定义函数调用调试 5.1 打开 Jmeter 函数助手,选择自定义函数 5.2 京东宙斯接口验证 JMeter 是一个开

    2024年02月16日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包