Kotlin入门(24)如何自定义视图
Android提供了丰富多彩的视图与控件,已经能够满足大部分的业务需求,然而计划赶不上变化,总是有意料之外的情况需要特殊处理。比如PagerTabStrip无法在布局文件中指定文本大小和文本颜色,只能在代码中通过setTextSize和setTextColor方法来设置。这用起来殊为不便,如果它能像TextView那样直接在布局指定文本大小和颜色就好了;要想让PagerTabStrip支持该特性,就得通过自定义视图来实现,而自定义视图的第一种途径便是自定义属性。 仍旧以翻页标题栏PagerTabStrip举例,现在给它新增两个自定义属性,分别是文本颜色textColor,以及文本大小textSize。下面给出Java编码的自定义步骤: 1. 在resvalues目录下创建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.ViewPager
android:id="@+id/vp_content"
android:layout_width="match_parent"
android:layout_height="400dp" >
<com.example.custom.widget.CustomPagerTab
android: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.BLACK
private var textSize = 15
init {
txtColor = Color.BLACK
textSize = 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())
}
}
完成以上三步修改后,运行测试应用,展示的界面效果如下图所示,此时翻页标题栏的文字颜色变为红色,而且字体也变大了。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android PC端用ADB抓取指定应用日志实现步骤
- Android studio 禁用AndroidX方式
- Android 实现把bitmap图片的某一部分的颜色改成其他颜色
- AndroidStudio构建项目提示错误信息“unable to find valid certification”的完美解决方案
- Android自定义View实现抖音飘动红心效果
- Android Studio 利用Splash制作APP启动界面的方法
- android surfaceView实现播放视频功能
- Android Studio中一套代码多渠道打包的实现方法
- Android自定义View实现圆环进度条
- Android启动页用户相关政策弹框的实现代码
- 10个好用的 HTML5 特性
- Android实现签名涂鸦手写板
- Android 开发使用Activity实现加载等待界面功能示例
- 详解Android使用CoordinatorLayout+AppBarLayout+CollapsingToolbarLayou实现手指滑动效果
- Android开发自定义控件之折线图实现方法详解