图文详解自定义View视图的属性及引用

yizhihongxing

下面是图文详解自定义View视图的属性及引用的完整攻略。

一、什么是自定义View

自定义View是指用户自己编写View组件的过程。Android系统为我们提供了许多基础View组件,但它们并不能完全满足我们的需求。当我们需要一个独特的、不在基础View组件中存在的View组件时,就需要使用自定义View。

二、自定义View的属性

我们可以在自己编写的自定义View中定义属性,用于在XML布局文件中声明和设置,使得自定义View可以在XML布局文件中灵活使用。在自定义View的代码中,我们需要使用一下两种方法来定义自定义View的属性:

1.在xml文件中定义属性

在自定义View的代码中,我们需要使用declare-styleable来定义自定义View的属性,在res/values/attrs.xml中添加如下代码:

<declare-styleable name="MyCustomView">
    <attr name="my_attribute_one" format="string" />
    <attr name="my_attribute_two" format="integer" />
</declare-styleable>

上面代码中,我们定义了两个自定义属性“my_attribute_one”和“my_attribute_two”,分别以string和integer的格式进行定义。这样,我们在XML布局文件中声明自定义View时,就可以使用这两个自定义属性了。

2.在自定义View中获取属性值

我们在XML布局文件中声明的自定义属性,可以在自定义View中直接获取。我们可以在自定义View的代码中使用以下方法获取自定义属性值:

val a = context.theme.obtainStyledAttributes(attrs, R.styleable.MyCustomView, defStyleAttr, 0)

val myAttributeOne = a.getString(R.styleable.MyCustomView_my_attribute_one)
val myAttributeTwo = a.getInt(R.styleable.MyCustomView_my_attribute_two, 0)

a.recycle()

上面代码中,我们通过调用obtainStyledAttributes方法获取所有在XML布局文件中声明的自定义属性,然后使用getStringgetInt方法来获取自定义属性值。需要注意的是,我们需要在获取完自定义属性之后调用recycle方法来回收资源,避免内存泄漏。

三、自定义View的引用

在XML布局文件中使用自定义View,需要满足以下两个条件:

  1. 在XML布局文件中声明自定义View

  2. 在自定义View的代码中实现构造方法

下面,我们通过以下两个示例来详细讲解自定义View的引用。

示例一:自定义View显示TextView

我们可以编写一个自定义View来显示一个TextView,具体步骤如下:

首先,在res/layout/中新建一个XML布局文件custom_textview_layout.xml,代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="200dp"
    android:layout_height="100dp"
    android:background="@color/colorPrimary"
    android:gravity="center"
    android:orientation="vertical">

    <com.example.mydemo.views.CustomTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hello"
        app:textColor="@color/colorWhite" />

</LinearLayout>

上面代码中,我们在LinearLayout中声明了一个自定义ViewCustomTextView,并声明了一个自定义属性textColor用于设置TextView的字体颜色。

接下来,在res/layout/中新建一个TextView的XML布局文件textview_layout.xml,代码如下:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_textview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="24sp" />

这里,我们将自定义属性中声明的textColor设置到TextView上,代码如下:

class CustomTextView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {

    private val mTextView: TextView

    init {
        val inflater = LayoutInflater.from(context)
        val view = inflater.inflate(R.layout.textview_layout, this, false)
        addView(view)

        mTextView = view.findViewById(R.id.my_textview)

        val a = context.obtainStyledAttributes(attrs, R.styleable.CustomTextView)
        val textColor = a.getColor(R.styleable.CustomTextView_textColor, 0)
        mTextView.setTextColor(textColor)

        a.recycle()
    }

}

在上面的代码中,我们在构造方法中获取了XML布局文件中声明的自定义属性textColor,然后将其设置到TextView上。

现在,我们运行程序,可以看到一个背景为蓝色、字体颜色为白色的TextView。

示例二:自定义View显示自定义属性

我们可以编写一个自定义View显示自定义属性,使得XML布局文件传入什么属性值,自定义View就显示什么属性值。具体步骤如下:

首先,我们需要在res/values/attrs.xml中声明一个自定义属性my_attribute,代码如下:

<declare-styleable name="CustomView">
    <attr name="my_attribute" format="string" />
</declare-styleable>

下面,我们新建一个XML布局文件custom_view_layout.xml,代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="200dp"
    android:layout_height="100dp"
    android:background="@color/colorAccent"
    android:gravity="center"
    android:orientation="vertical">

    <com.example.mydemo.views.CustomView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:my_attribute="这是自定义属性的值" />

</LinearLayout>

在这个XML布局文件中,我们声明了CustomView,并传入了一个自定义属性my_attribute

接下来,我们在自定义View的代码中获取这个自定义属性,并将其设置到TextView上,代码如下:

class CustomView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {

    private val mTextView: TextView

    init {
        val inflater = LayoutInflater.from(context)
        val view = inflater.inflate(R.layout.textview_layout, this, false)
        addView(view)

        mTextView = view.findViewById(R.id.my_textview)

        val a = context.obtainStyledAttributes(attrs, R.styleable.CustomView)
        val myAttribute = a.getString(R.styleable.CustomView_my_attribute)
        mTextView.text = myAttribute

        a.recycle()
    }

}

在上面的代码中,我们在构造方法中获取XML布局文件中声明的自定义属性my_attribute,然后将其设置到TextView上。

现在,我们运行程序,可以看到一个背景为蓝色、字体为这是自定义属性的值的自定义View。

四、小结

通过本文的讲解,我们可以了解到自定义View如何去定义属性以及引用。自定义View中定义属性的方式可以通过在xml文件中定义或者在样式文件中定义,其中,样式文件中的定义,可以直接以style的方式继承。自定义View的引用,可以通过xml文件实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:图文详解自定义View视图的属性及引用 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 单页应用SPA做SEO的一种清奇的方案

    单页应用SPA做SEO的一种清奇的方案 背景 随着前端技术的不断发展,越来越多的网站开始采用前后端分离的方式进行开发。单页应用(SPA)作为前后端分离方案中的一种,在用户体验上有着独特的优势。 然而,SPA和传统的多页应用相比,在SEO方面存在一些挑战。由于SPA的页面内容大多是通过AJAX异步获取,浏览器不会触发页面跳转,导致搜索引擎无法爬取到页面的内容,…

    其他 2023年3月28日
    00
  • 解决stram++的host代理443端口被占用的问题(电脑有虚拟机…

    解决stream++的host代理443端口被占用的问题(电脑有虚拟机…) 如果你在使用stream++时遇到了host代理443端口被占用的问题,那么本文就可以帮助你解决这个问题。本文适用于电脑有虚拟机的情况。 问题描述 在使用stream++时,你可能会遇到类似的错误: Error: listen EACCES 127.0.0.1:443 at Se…

    其他 2023年3月28日
    00
  • 微信公众号自定义菜单添加多篇文章的图文教程

    下面就给您详细讲解“微信公众号自定义菜单添加多篇文章的图文教程”。 1. 登录微信公众平台 首先,我们需要进入微信公众平台的后台管理页面,使用绑定公众号的微信账号和密码登录。 2. 进入菜单管理页面 在左侧菜单栏中点击“菜单管理”,然后选择需要添加多篇文章的菜单,进入菜单编辑页面。 3. 添加图文素材 在菜单编辑页面中,点击要添加的菜单项,然后选择“素材管理…

    other 2023年6月25日
    00
  • Webpack中使用环境变量的各种正确姿势

    使用环境变量是在Webpack中实现灵活配置的一种方式。以下是关于Webpack中使用环境变量的各种正确姿势的完整攻略。 环境变量的概念 环境变量是指在操作系统中设置的一些变量,存储了操作系统中的一些信息,可以被系统中的各个程序所访问和使用,它们可以动态地影响程序运行的结果。在Webpack中,使用环境变量可以实现动态的、按需的、有条件的构建,增加应用的灵活…

    other 2023年6月27日
    00
  • postman:上传文件测试

    Postman上传文件测试攻略 Postman是一款流行的API测试工具,它可以帮助我们测试API的各种功能,包括上传文件。在本文中,我们将详细介绍如何使用Postman进行上传文件测试。 步骤 以下是使用Postman进行上传文件测试的步骤: 打开Postman并创建一个新的请求。 选择HTTP方法(通常是POST或PUT)。 在请求URL中输入API的端…

    other 2023年5月7日
    00
  • 关于linux:如何在grep期间显示文件名

    Linux: 如何在grep期间显示文件名 在Linux中,grep是一种常用的文本搜索工具。当搜索多个文件时,有时需要在搜索结果中显示文件名。本文将详解如何在grep期间显示文件名,包括两种方法和示例说明。 方法一:使用grep命令的-i选项 可以使用命的-i选项来在搜索结果中显示文件名。具体步骤如下: grep -i -H ‘search_pattern…

    other 2023年5月8日
    00
  • Win10一周年更新版天气无法显示预报怎么办 Win10系统天气应用无法显示预报的解决方法

    Win10一周年更新版天气无法显示预报怎么办 在使用Win10一周年更新版的过程中,有不少用户会发现系统自带的天气应用无法显示预报。问题的解决方法如下: 方法一:重启天气应用 有时候天气应用的预报功能可能出现错误,导致无法显示预报。这种情况下,可以尝试重新启动天气应用,方法如下: 鼠标右键点击屏幕上的Windows图标,选择“任务管理器”。 在“任务管理器”…

    other 2023年6月27日
    00
  • c#开发wps插件(2)

    C#开发WPS插件(2) 在C#开发WPS插件时,需要使用WPS VBA API和C#互操作技术。以下是详细的攻略: 步骤 以下是开发WPS插件的步骤: 安装WPS开发工具包。 WPS开发具包是开发WPS插件的必备工具。可以从WPS官网下载并安装。 创建C#项目。 在Visual Studio中创建一个C#项目,选择“类库”作为项目类型。 添加WPS VBA…

    other 2023年5月7日
    00
合作推广
合作推广
分享本页
返回顶部