View 自定义 - 不同的实现方式

本文探讨了自定义Android控件的不同实现策略,包括复用现有布局、组合控件、扩展现控及完全自定义View和ViewGroup。重点讲解了如何利用include标签、组合视图和定制测量与布局方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概念

1.2 自定义控件的不同实现方式

复用已有控件复用布局文件
组合现有的控件
扩展已有的控件继承特定的View(如TextView)
继承特定的ViewGroup(如LinearLayout)
完全自定义直接继承 View主要是实现 onMeasure() + onDraw(),因为没有子元素需要布局。
需要自己实现 wrap_content、padding,不需要自己实现 margin 该属性是由父容器决定的。
直接继承 ViewGroup主要是实现 onMeasure() + onLayout(),因为子元素都绘制好了父容器不需要额外绘制。
需要自己实现 wrap_content、padding、margin。
  • 对于 wrap_content 需要在 onMeasure() 中处理。

  • 对于自定义View,padding 是在 draw() 中处理。

  • 对于自定义ViewGroup,padding 和 margin 需要在 onMeasure() 和 onLayout() 中处理。

二、复用已有控件

2.1 复用布局文件

  1. 新建一个 layout_title.xml 文件,编写需要复用的布局。
  2. 在要使用的 activity_main.xml布局中,通过 <include layout="@layout/title" /> 引用。
  3. 在 MainActivity 中,可通过复用布局的实例 title.findViewById 查找 子View ID来拿到实例进行配置。

2.2 组合现有的 View 控件

  1. 新建一个 layout_title.xml 文件,将 view 控件组合起来。
  2. 新建一个TitleLayout.class,继承自LinearLayout,在 init{} 初始化代码块中通过 LayoutInflater 对布局文件进行加载和配置。
  3. 在要使用的 activity_main.xml布局中,通过完整包名引用。

layout_title.xml 

<LinearLayout>
    <Button...>
    <TextView...>
    <Button...>
</LinearLayout>

TitleLayout.class

class TitleLayout(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
    init {
        LayoutInflater.from(context).inflate(R.layout.layout_title, this)
        leftButton.setOnClickListener{
            val activity = context as Activity
            activity.finish()
        }
        titleText.text = "Title"
        rightButton.setOnClickListener {
            Toast.makeText(context, "Hello World", Toast.LENGTH_SHORT).show()
        }
    }
}

activity_main.xml

<LinearLayout>
    <com.example.TitleLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
<LinearLayout/>

三、扩展已有的控件

四、完全自定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值