全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android 自定义View的构造函数详细介绍

 Android自定义View的构造函数

自定义View是Android中一个常见的需求,每个自定义的View都需要实现三个基本的构造函数,而这三个构造函数又有两种常见的写法。

第一种

每个构造函数分别调用基类的构造函数,再调用一个公共的初始化方法做额外初始化。

public class MyView extends ListView {
  public MyView(Context context) {
    super(context);
    sharedConstructor();
  }

  public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
    sharedConstructor();
  }

  public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    sharedConstructor();
  }
  
  private void sharedConstructor() {
    // Do some initialize work.
  }
}

第二种

级联式调用,每一个构造函数调用比它多一个参数的构造函数,最后一个构造函数调用基类的构造函数,最后在做一些额外的初始化工作。

public class MyView extends ListView {
  public MyView(Context context) {
    this(context, null);
  }

  public MyView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    
    // Other initialize work.
  }
}

那么问题来了,我们该使用哪一种方式呢?

结论是:最好使用第一种,因为第二种方法在某些情况下会有问题,比如你自定义的View继承自ListView或者TextView的时候,ListView或者TextView内部的构造函数会有一个默认的defStyle, 第二种方法调用时defStyle会传入0,这将覆盖基类中默认的defStyle,进而导致一系列问题。以ListView为例,看看它的构造函数。

public ListView(Context context) {
    this(context, null);
  }

  public ListView(Context context, AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.listViewStyle);
  }

  public ListView(Context context, AttributeSet attrs, int defStyleAttr) {
    this(context, attrs, defStyleAttr, 0);
  }

  public ListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    // Other works.
  }

可以看到ListView的第二个构造函数代码中传入了一个com.android.internal.R.attr.listViewStyle,使用第二种方法(级联式)调用时,我们传入的是0,将会覆盖这个默认值。但是第一种方法中调用了super(context, attrs); 进而调用了基类的 this(context, attrs, com.android.internal.R.attr.listViewStyle);就不会产生问题。

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Android  # 自定义View  # 构造函数对比  # 自定义View构造函数详解  # Android studio 运行main 函数的方法  # 详解Android应用main函数的调用  # Android Studio生成函数注释的实现方法  # Android自定义View的三个构造函数  # Android编程计算函数时间戳的相关方法总结  # Android自定义view 你所需要知道的基本函数总结  # Android编程之匿名内部类与回调函数用法分析  # Android自定义View构造函数详解  # Android Chronometer控件实现计时器函数详解  # Android nativePollOnce函数解析  # 自定义  # 种方法  # 会有  # 第一种  # 的是  # 级联  # 来了  # 将会  # 两种  # 又有  # 希望能  # 第二个  # 可以看到  # 为例  # 而这  # 谢谢大家  # 这将  # 哪一种  # 第二种  # 如你 


相关文章: 建站之星CMS五站合一模板配置与SEO优化指南  如何在建站之星绑定自定义域名?  c# 在高并发场景下,委托和接口调用的性能对比  网站制作需要会哪些技术,建立一个网站要花费多少?  潮流网站制作头像软件下载,适合母子的网名有哪些?  大同网页,大同瑞慈医院官网?  如何实现建站之星域名转发设置?  深圳网站制作案例,网页的相关名词有哪些?  制作电商网页,电商供应链怎么做?  Android使用GridView实现日历的简单功能  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  制作网站的公司有哪些,做一个公司网站要多少钱?  如何用虚拟主机快速搭建网站?详细步骤解析  建站ABC备案流程中有哪些关键注意事项?  动图在线制作网站有哪些,滑动动图图集怎么做?  如何选择最佳自助建站系统?快速指南解析优劣  如何通过网站建站时间优化SEO与用户体验?  建站主机核心功能解析:服务器选择与网站搭建流程指南  如何生成腾讯云建站专用兑换码?  微信推文制作网站有哪些,怎么做微信推文,急?  成都网站制作报价公司,成都工业用气开户费用?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  h5网站制作工具有哪些,h5页面制作工具有哪些?  宝塔面板如何快速创建新站点?  如何通过可视化优化提升建站效果?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  高性价比服务器租赁——企业级配置与24小时运维服务  如何通过.red域名打造高辨识度品牌网站?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  如何快速搭建虚拟主机网站?新手必看指南  利用JavaScript实现拖拽改变元素大小  建站主机解析:虚拟主机配置与服务器选择指南  孙琪峥织梦建站教程如何优化数据库安全?  建站之星免费版是否永久可用?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  ,网站推广常用方法?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  制作公司内部网站有哪些,内网如何建网站?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  活动邀请函制作网站有哪些,活动邀请函文案?  如何在VPS电脑上快速搭建网站?  常州企业建站如何选择最佳模板?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  深圳网站制作的公司有哪些,dido官方网站?  如何安全更换建站之星模板并保留数据?  ,巨量百应是干嘛的?  网站制作的步骤包括,正确网址格式怎么写? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。