Android提供了丰富多彩的视图与控件,已经能够满足大部分的业务需求,然而计划赶不上变化,总是有意料之外的情况需要特殊处理。比如PagerTabStrip无法在布局文件中指定文本大小和文本颜色,只能在代码中通过setTextSize和setTextColor方法来设置。这用起来殊为不便,如果它能像TextView那样直接在布局指定文本大小和颜色就好了;要想让PagerTabStrip支持该特性,就得通过自定义视图来实现,而自定义视图的第一种途径便是自定义属性。
仍旧以翻页标题栏PagerTabStrip举例,现在给它新增两个自定义属性,分别是文本颜色textColor,以及文本大小textSize。下面给出Java编码的自定义步骤:
1. 在res\values目录下创建attrs.xml,文件内容如下所示,其中declare-styleable的name属性值表示新视图的名称,两个attr节点表示新增的两个属性分别是textColor和textSize:

<resources><declare-styleable name="CustomPagerTab"><attr name="textColor" format="color" /><attr name="textSize" format="dimension" /></declare-styleable>
</resources>

2. 在模块的widget目录下创建CustomPagerTab.java,填入以下自定义视图的代码:

public class CustomPagerTab extends PagerTabStrip {private int textColor = Color.BLACK;private int textSize = 15;public CustomPagerTab(Context context) {super(context);}public CustomPagerTab(Context context, AttributeSet attrs) {super(context, attrs);//构造函数从attrs.xml读取CustomPagerTab的自定义属性if (attrs != null) {TypedArray attrArray=getContext().obtainStyledAttributes(attrs, R.styleable.CustomPagerTab);textColor = attrArray.getColor(R.styleable.CustomPagerTab_textColor, textColor);textSize = attrArray.getDimensionPixelSize(R.styleable.CustomPagerTab_textSize, textSize);attrArray.recycle();}setTextColor(textColor);setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize);}//    //PagerTabStrip没有三个参数的构造函数
//    public PagerTab(Context context, AttributeSet attrs, int defStyleAttr) {
//    }
}

3. 布局文件的根节点增加自定义的命名空间声明,如“xmlns:app="http://schemas.android.com/apk/res-auto"”;并把android.support.v4.view.PagerTabStrip的节点名称改为自定义视图的全路径名称如“com.example.custom.widget.PagerTab”,同时在该节点下指定新增的两个属性即app:textColor与app:textSize。修改之后的布局文件代码如下:

<LinearLayout 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="match_parent"android:orientation="vertical"android:padding="10dp" ><android.support.v4.view.ViewPagerandroid:id="@+id/vp_content"android:layout_width="match_parent"android:layout_height="400dp" ><com.example.custom.widget.CustomPagerTabandroid:id="@+id/pts_tab"android:layout_width="wrap_content"android:layout_height="wrap_content"app:textColor="@color/red"app:textSize="17sp" /></android.support.v4.view.ViewPager>
</LinearLayout>

上述自定义属性的三个步骤,其中第二步骤涉及到Java代码,接下来用Kotlin改写CustomPagerTab类的代码,主要改动有以下两点:
1、原来的两个构造函数,合并为带默认参数的一个主构造函数,并且直接跟在类名后面;
2、类名后面要加上注解“@JvmOverloads constructor”,表示该类支持被Java代码调用。因为布局文件中引用了自定义视图的节点,系统是通过SDK里的Java代码找到自定义视图类,所以凡是自定义视图都要加上该注解,否则App运行时会抛出异常。
下面是CustomPagerTab类改写之后的Kotlin代码:

//自定义视图务必要在类名后面增加“@JvmOverloads constructor”,因为布局文件中的自定义视图必须兼容Java
class CustomPagerTab @JvmOverloads constructor(context: Context, attrs: AttributeSet?=null) : PagerTabStrip(context, attrs) {private var txtColor = Color.BLACKprivate var textSize = 15init {txtColor = Color.BLACKtextSize = 15//初始化时从attrs.xml读取CustomPagerTab的自定义属性if (attrs != null) {val attrArray = getContext().obtainStyledAttributes(attrs, R.styleable.CustomPagerTab)txtColor = attrArray.getColor(R.styleable.CustomPagerTab_textColor, txtColor)textSize = attrArray.getDimensionPixelSize(R.styleable.CustomPagerTab_textSize, textSize)attrArray.recycle()}setTextColor(txtColor)setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize.toFloat())}
}

完成以上三步修改后,运行测试应用,展示的界面效果如下图所示,此时翻页标题栏的文字颜色变为红色,而且字体也变大了。

点此查看Kotlin入门教程的完整目录

__________________________________________________________________________
打开微信扫一扫下面的二维码,或者直接搜索公众号“老欧说安卓”添加关注,更快更方便地阅读技术干货。

Kotlin入门(24)如何自定义视图相关推荐

  1. Kotlin入门教程——目录索引

    Kotlin是谷歌官方认可的Android开发语言,即将发布的Android Studio 3.0版本也会开始内置Kotlin,所以未来在App开发中Kotlin取代Java是大势所趋,就像当初And ...

  2. Kotlin入门(23)适配器的进阶表达

    前面在介绍列表视图和网格视图时,它们的适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项在屏幕上看不到了,则系统会自动回收相应的视图对象.随着 ...

  3. Kotlin入门(12)类的概貌与构造

    上一篇文章提到泛型函数appendString是在类外面定义,这不免使人疑惑,类里面又该怎样定义成员函数呢?为解答这个疑问,接下来的几篇文章将好好描述一下Kotlin如何操作类及其对象,本篇文章先对类 ...

  4. Kotlin 第一弹:自定义 ViewGroup 实现流式标签控件

    古人学问无遗力, 少壮工夫老始成.纸上得来终觉浅, 绝知此事要躬行. – 陆游 <冬夜读书示子聿> 上周 Google I/O 大会的召开,宣布了 Kotlin 语言正式成为了官方开发语言 ...

  5. 【eoe教程】Android中自定义视图的绘制方法

    原文链接 :http://android.eoe.cn/topic/ui 自定义视图最重要的部分是它的外观.你可以根据应用的需求简单或复杂的实现它. 这个教程包含了最常见的操作. 重写onDraw() ...

  6. Android自定义视图二:如何绘制内容

    这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...

  7. SpringMVC系列(九)自定义视图、重定向、转发

    一.自定义视图 1. 自定义一个视图HelloView.java,使用@Component注解交给Spring IOC容器处理 1 package com.study.springmvc.views; ...

  8. Kotlin入门(33)运用扩展属性

    进行App开发的时候,使用震动器要在AndroidManifest.xml中加上如下权限: <!-- 震动 --><uses-permission android:name=&quo ...

  9. Kotlin入门(30)多线程交互

    Android开发时常会遇到一些耗时的业务场景,比如后台批量处理数据.访问后端服务器接口等等,此时为了保证界面交互的及时响应,必须通过线程单独运行这些耗时任务.简单的线程可使用Thread类来启动,无 ...

最新文章

  1. OpenCV+python:轮廓发现与对象测量
  2. 2018 Wannafly summer camp Day3--Knight
  3. 光端机的几种物理接口类型
  4. 推荐:解析“extern”
  5. 接口(interface)有什么优点,为什么要用接口
  6. 【毕业设计】67-基于单片机的三相电压型SPWM逆变器控制设计及应用(仿真、原理图、源代码、低重复参考文档、答辩PPT、英文文献)
  7. 车辆运动学模型和动力学模型
  8. 四旋翼电池、电机、螺旋桨选型与搭配
  9. VastBase账户锁The account has been locked
  10. 使用wxpy实现在微信定时发送文件和消息
  11. 速腾聚创 RoboSense RS-Helios 32线激光雷达使用 LeGO-LOAM 算法建图
  12. 如何获取Intel网卡驱动的源代码
  13. 论文简介:Extract Line Art from Illustrations
  14. 教育行业电商SaaS系统解决方案:助力企业实现经营、管理一体化
  15. 生活中的一些常用理论
  16. No manual entry for xxx 错误的解决方案
  17. 疫情影响下的物联网发展趋势
  18. 2016.11.29遇到的问题
  19. 北京/深圳招聘 | 华为诺亚方舟实验室招聘决策推理方向实习生、博士后等
  20. fortran 编译器安装(转载)

热门文章

  1. 数据结构与算法:实验一线性表(字符串分类统计)
  2. Leetcode每日一题:164.maximum-gap(最大间距)
  3. Leetcode每日一题:424.longest-repeating-character-replacement(替换后的最长重复字符)
  4. 吴恩达|机器学习作业6.1.SVM建立垃圾邮件分类器
  5. Spring注解驱动开发-----容器day01
  6. Spring Boot Maven 打包可执行Jar文件!
  7. 以太坊开发语言solidity简介
  8. python __main__ __name__ __file__
  9. LeetCode刷题(22)
  10. Android在string.xml中定义html文档并加载显示,以及拦截WebView链接事件