资讯专栏INFORMATION COLUMN

Kotlin入门(24)如何自定义视图

Coly / 2805人阅读

摘要:修改之后的布局文件代码如下上述自定义属性的三个步骤,其中第二步骤涉及到代码,接下来用改写类的代码,主要改动有以下两点原来的两个构造函数,合并为带默认参数的一个主构造函数,并且直接跟在类名后面类名后面要加上注解,表示该类支持被代码调用。

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


    
        
        
    

 

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。修改之后的布局文件代码如下:



    

        
    

上述自定义属性的三个步骤,其中第二步骤涉及到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())
    }
}

 

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/2696.html

相关文章

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

    摘要:有鉴于此,循环视图的适配器把视图持有者的重用逻辑剥离出来,由系统自行判断并处理持有者的重用操作。至此本节的适配器实现过程终于落下帷幕,一路上可谓是过五关斩六将,硬生生把数十行的代码压缩到不到十行的代码,经过不断迭代优化方取得如此彪炳战绩。前面在介绍列表视图和网格视图时,它们的适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项在屏幕上看...

    Raaabbit 评论0 收藏0
  • 今年最新的30个Android库,你了解吗?

    摘要:本文就向大家介绍今年最新的深受开发者喜爱的个库。目前提供的功能有和三个位置的吸附指定要分屏的数量,支持水平和垂直分屏,滚动时的回调。只能包含一个子布局,例如,,,等。项目的简介写得很好,易于理解。 Android开发技术越来越成熟,Android开发工具当然也层出叠现。本文就向大家介绍今年最新的深受开发者喜爱的30个Android库。希望对你的Android开发工作能起到助力。 1.M...

    KevinYan 评论0 收藏0
  • Kotlin入门(19)Android的基础布局

    摘要:表示水平布局,表示垂直布局。表示靠左对齐表示靠右对齐表示靠上对齐表示靠下对齐表示居中对齐。相对布局内部的视图位置不依赖于排列规则,而依赖于指定的参照物,这个参照物可以是与该视图平级的视图,也可以是该视图的上级视图上级视图即相对布局自身。线性布局线性布局LinearLayout是最常用的布局,顾名思义,它下面的子视图像是用一根线串了起来,所以其内部视图的排列是有顺序的,要么从上到下垂直排列,要...

    RaoMeng 评论0 收藏0
  • Kotlin入门(22)适配器的简单优化

    摘要:如果用实现这个适配器类会是怎样的呢马上利用把上述代码转换为编码,转换后的代码类似以下片段相比之下,直接转换得来的代码,最大的改进是把构造函数及初始化参数放到了第一行,其它地方未有明显优化。列表视图 为实现各种排列组合类的视图(包括但不限于Spinner、ListView、GridView等等),Android提供了五花八门的适配器用于组装某个规格的数据,常见的适配器有:数组适配器ArrayA...

    Elle 评论0 收藏0
  • Kotlin + Spring Boot : 下一代 Java 服务端开发 》

    摘要:下一代服务端开发下一代服务端开发第部门快速开始第章快速开始环境准备,,快速上手实现一个第章企业级服务开发从到语言的缺点发展历程的缺点为什么是产生的背景解决了哪些问题为什么是的发展历程容器的配置地狱是什么从到下一代企业级服务开发在移动开发领域 《 Kotlin + Spring Boot : 下一代 Java 服务端开发 》 Kotlin + Spring Boot : 下一代 Java...

    springDevBird 评论0 收藏0

发表评论

0条评论

Coly

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<