为什么自定义控件无法显示

前言

由于 Android 提供的控件并不多(其实已经很多了),但介于产品经理们的奇思妙想以及我们程序猿们为了不重复造轮子(其实是为了偷懒),或者仅仅是为了去探索下未知的领域,总之,一句话:我们需要自定义控件!!不过自定义控件的坑其实也是很大的,很多时候我们都不得不仰天长叹,为毛你(自定义控件)还TM不显示,老子已经为你花费了比陪女朋友还多的时间了(话说你有女朋友吗。。。);这次我们来梳理下为什么自定义控件(主要是组合控件,原谅楼主功力比较渣)不显示的各种原因。

原因

  1. 忘记在初始化内部元素之后进行 addView() 操作,这个问题是我经常犯的错误,因为没有将子控件添加到父控件上,所以导致自定义控件无法显示子控件
  2. 忘记设置子控件 LayoutParams 宽高,举个栗子:我们在new 一个 TextView 的时候,需要设置它的宽和高,我们可以通过以下方式来设置 TextView 的宽高:

    RelativeLayout.LayoutParams lp = RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

    这里需要注意一点,就是LayoutParams有很多种,每个布局类型都有一个,例如:RelativeLayout.LayoutParams, LinearLayout.LayoutParams…另外还有一个ViewGroup.LayoutParams,要使用哪一个LayoutParams要看你当前编写的子控件的父控件是什么,如果它(父控件)是一个LinearLayout,那么这个子空间就应该使用LinearLayout.LayoutParams,如果父控件不属于五大布局类型,那么就使用ViewGroup.LayoutParams。

  3. 子控件被其它控件所遮盖,如果我们在自定义组合控件的时候使用inflate引入外部layout布局,那么我们应该很少出现这种问题,但有时候我们需要使用代码初始化子控件,进行布局,这时候由于没有直观的显示,我们可能误操作将某些子控件的宽高设置不到位,进而影响它自身或周边控件的显示
  4. 子控件背景色和父控件背景色一样,这个时候其实我已经成功的编写好了自定义控件,但是我有一个自定义属性可以引入Drawable来设置我的自定义控件中的子控件,由于我引入的Drawable是一个白色图案,我的自定义控件背景色也是白色的,所以看起来会以为是自定义控件除了问题(没想到这种情况都让我遇到 -_-||)

以上就是我总结的一些可能导致自定义控件无法显示的原因,如果你有什么意见和建议,欢迎来留言讨论~

异常

在编写自定义控件的过程中,我也遇到过很多异常,这里谈一下还记得一些异常Exception:

at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:6081)

出现这个异常其实是自定义控件在初始化过程中错误的添加了自身:addView(this), 我们需要将子控件进行addView添加操作,但是对自定义控件自身进行addView操作是错误的。

最后想起一件事情,那就是我们在 Android Studio 和 Eclipse 中的layout布局中使用自定义控件的时候,有的时候是可以预览layout布局的,正常显示自定义控件,但有的时候就不会显示或者显示旧版本的,这是因为,layout预览调用的时编译好的 Class 类,而我们刚刚编写或者修改的时候,其实并没有将自定义控件编译进去,这时候我们只要Build运行一下项目即可正常使用预览了。

参考链接

http://zhidao.baidu.com/link?url=tl1U-TWUbCIeGJOoGHK1pdiOu90D-G6GLwaEsq825gXTbbxn6wRyq4f_WPFhN37vfON3VOKEzGUa95zz8aTgEa

时间: 2024-11-10 08:38:42

为什么自定义控件无法显示的相关文章

手机卫士11_ 自定义控件_缓存清理_病毒库更新

拷贝安卓源码中的逻辑,可以考虑先创建一个小项目实现以下效果 1,病毒数据库的自动更新(连接网络,然后获取特征码保存到数据库?) ①工程师发现病毒apk,获取到它的特征码发布到服务器上 通过 MD5 或者ASH1获取特征码 ②客户端杀毒软件下载特征码(可能是 JSON串)到本地客户端 (在打开软件的时候还是打开查杀界面的时候?其实都不适合,应该开启一个服务去定期更新数据库,访问病毒更新特征码地址) 定期更新,timer和timertask,一般一个小时更新一次(测试的时候写短一点) 连接服务器:U

博客园客户端UAP开发随笔--自定义控件的左膀右臂

前言 我们上一次说到了App的精灵:自定义控件.这一次,我们接着这一话题,说说自定义控件的两个得力助手: 选择器 - TemplateSelector 转换器 – Converter 这两个东西能帮助自定义控件更为简单方便地被使用,所以必须掌握. 数值转换器 Converter 这个大家可能不陌生,因为在MSDN里,介绍到Data Binding时,总会顺带着介绍一下数据转换,比如这个网页: http://msdn.microsoft.com/library/windows/apps/xaml/

简单的实现QQ通信功能(二)

第二部分:功能需求以及大体思路 一:功能需求: 1. 角色:登录用户. 2. 登录: (1)检查用户名和密码是否正确,正确登录成功,否则提醒用户名或密码错误. (2)登录时可以选择登录状态,送入数据库. (3)记录登录时间,送入数据库. 3. 登录成功之后显示所有的好友信息: (1)分类列出所有好友的信息(带头像). (2)如果有未读的信息,则给提示. (3)来新消息提醒. 4. 主界面功能: (1)显示登录者自己的信息. (2)可以修改自己的状态. (3)最小化之后在右下角显示小图标,双击小图

自定义View控件(2—手写实例代码)

1. 步骤: + 1.自定义一个类继承于UIView + 2.在initWithFrame方法中添加子控件 + 3.在layoutSubviews中设置子控件的位置 + 4.提供一个属性保存外界传入的数据(模型对象), 重写setter方法设置子控件的数据 - 类工厂方法(便利构造器) + 按照苹果的风格和规范, 一般情况一个用于创建对象的对象方法会对应一个类方法 + 可以通过类工厂方法, 快速的根据数据创建一个对象 - 注意点: + 返回值一定要使用instancetype, 不要使用id +

项目准备(view)

管理员登陆界面-manage-admin 1 <!DOCTYPE html> 2 <html lang="zh-cn"> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta name=&

自定义View控件(手写,xib)须知

 1. 目的 :提高代码的复用性,屏蔽内部的实现细节 2. 步骤 :    * 1> 自定义一个类继承于UIView   * 2> 在initWithFrame方法中添加子控件   * 3> 在layoutSubviews中设置子控件的位置   * 4> 提供一个属性保存外界传入的数据(模型对象), 重写setter方法设置子控件的数据 3. 类工厂方法(便利构造器):   * 按照苹果的风格和规范, 一般情况一个用于创建对象的对象方法会对应一个类方法   * 可以通过类工厂方法,

WPF 体系结构

本主题提供 Windows Presentation Foundation (WPF) 类层次结构的指导教程, 涵盖了 WPF 的大部分主要子系统,并描述它们是如何交互的. 本主题还详细介绍了 WPF 架构师所做的一些选择. 本主题包括下列各节. System.Object System.Threading.DispatcherObject System.Windows.DependencyObject System.Windows.Media.Visual System.Windows.UIE

背水一战 Windows 10 (26) - XAML: x:DeferLoadStrategy, x:Null

原文:背水一战 Windows 10 (26) - XAML: x:DeferLoadStrategy, x:Null [源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 XAML x:DeferLoadStrategy="Lazy" - 用于指定一个 UIElement 为一个延迟加载元素 x:Null - null 示例1.x:DeferLoadStrategy 通过 FindName 加载Xaml/DeferLoadStrategy/Demo1.xaml

Android业务组件化之子模块SubModule的拆分以及它们之间的路由Router实现

前言: 前面分析了APP的现状以及业务组件化的一些探讨(Android业务组件化之现状分析与探讨),以及通信的桥梁Schema的使用(Android业务组件化之URL Schema使用),今天重点来聊下子模块SubModule的拆分以及它们之间的路由Router实现.本篇涉及的相关知识比较多,阅读本篇之间需要大致了解一下Java的注解(Java学习之注解Annotation实现原理).Java的动态代理机制(Java设计模式之代理模式(Proxy))等.业务组件化是一个循序渐进的过程,一开始很难