首页 > 其他分享 >android自定义控件无法显示的原因

android自定义控件无法显示的原因

时间:2022-10-07 19:01:25浏览次数:78  
标签:控件 scale 自定义 int float pxValue context android


android自定义控件无法显示的原因

​编者:李国帅​

时间:2020/8/1 

背景:

Android开发中经常会遇到时间选择,而且经常会被要求使用类似ios的滚轮风格。只是android并不是ios,没有滚轮的时间选择器,那就需要进行定制,网上也有不少的开源定制View。一次,我在使用的时候,不知道改动了哪个地方,控件怎么也显示不出。

前后比较:

原本应该是这样的:

android自定义控件无法显示的原因_android

 

可是被改动之后,怎么也显示不出来

 

android自定义控件无法显示的原因_ios_02

解决过程:

怎么回事呢?原来是好的,后来不行了,自己到底改动了什么?我的注意力被吸引在对比上,反反复复的比较原代码和新代码的差异,总是不觉得自己改了什么。

而且还有个问题,虽然不能显示控件,但是从logcat和console不能找到任何异常或错误日志,编译器也没有提示。

反复检测比较几次后搞得自己没脾气,这部分代码还是挺多的,难道自己有必要走读代码吗?

最后静下心,才发现,自己对出现的问题还是太急躁了,问题还是要从源头去分析。

问题的本质是控件的大小和可见性,时间段View的核心是WheelView,而WheelView被类WheelTime管理,WheelView中的数字TextView的字体大小在WheelView构造函数中定义,该字体大小又在TimePickerView构造函数中定义,继续向上追溯是由setContentSize函数定义。

错误的根源在于这么一句.setContentSize(px2sp(context, R.dimen.sp_17)),其中错误的使用了函数px2sp。

    public static int px2sp(Context context, float pxValue) {

        final float scale = context.getResources().getDisplayMetrics().scaledDensity;

        return (int) (pxValue / scale + 0.5f);

    }

而正确的函数应该是

   public static int px2sp(Context context, int id) {

        float pxValue = context.getResources().getDimension(id);

        final float scale = context.getResources().getDisplayMetrics().density;

        return (int) (pxValue / scale + 0.5f);

}

在java中这种隐式的类型转换很难被发现,而且即便是真的有隐患,使用try…catch,只要不打印出来,依然难以从logcat或console找到线索。

 

         这也是自己比较代码的时候,习惯性认为某些惯用函数是正确的,而忽视了某些非常见用法。而程序作为一个整体,单个函数的正确并不代表程序功能的正确。

总结:

解决后发现这个问题的本质并不复杂,但是花费了很长时间。

产生原因还是因为修改和移植没有注意细节。

解决时间过长是因为自己心中的执念。老是纠结于为什么原来可以现在怎么就不可以,而不是静下心来,聚焦于问题的源头,抓住问题的关键和本质。

 

我想,人生中还是有许多问题,并不是不能解决,而是自己愿不愿意下决心去解决。

与其纠结于那么多为什么,而不静下心一步步分析,一步步接近问题的真相,和我们期望的结果。

               

 

标签:控件,scale,自定义,int,float,pxValue,context,android
From: https://blog.51cto.com/u_15720208/5734881

相关文章

  • jira项目笔记17-自定义useArray
    2-1、要求自定义一个useArray的customhook。结合react-hook和typescript,实现对数组简单的增加、删除、清空的那个功能,并且对增加的对象类型有限制2-2、代码实现export......
  • 阿里云移动端热修复-Sophix(for Android)-问题解答
    前段时间了解了阿里云的热修复Sophix的基本使用,在使用过程中遇到很多问题,特此记录一下。 1、热修复可以发多个补丁么?答:补丁可以发好多次,但只能发布一个补丁。例如:我已......
  • 《Android底层接口与驱动开发技术详解》digest
    第一章:IDE:EclipseADTforjavadeveloper其它:ApacheAntJavaSEDevelopmentKit5或6Linux和Mac上使用ApacheAnt1.65+,Windows上使用1.7+版本;(单独的JRE是不可以的,必须......
  • Android(digest)
    Android开发者文档这么说的:Contentprovidersmanageaccesstoastructuredsetofdata.Theyencapsulatethedata,andprovidemechanismsfordefiningdatasecuri......
  • MyBatis框架:第八章:自定义结果集,一对一,一对多,延迟加载,赖加载
    13.1、自定义结果集介绍自定义结果集,可以给复杂的对象使用。也就是对象内又嵌套一个对象。或者一个集合。在这种情况下。前面学过的知识点,已经无法直接获取出对象内对象......
  • 【Vue3.x】自定义hooks
    Vue3hooksvue2里的mixins相似,但是mixins会组件的配置项覆盖。vue3使用了自定义hooks替代mixnins,hooks本质上是函数,引入调用。封装自定义的hooks将图片转化成base64im......
  • Android 自定义View - 柱状波形图 wave view
    前言柱状波形图是一种常见的图形。一个个柱子按顺序排列,构成一个波形图。柱子的高度由输入数据决定。如果输入的是音频的音量,则可得到一个声波图。在一些音频软件中,我们也可......
  • KAL1 LINUX 官方文档之虚拟机版本 --- 自定义 Kali Vagrant Vagrantfile(更新于2022)
    Vagrant在开始时有一个很棒的功能,您可以在其中创建一个对您尝试安装的盒子唯一的Vagrantfile。例如,Kali在启动KaliVagrant机器时有这个Vagrantfile:kali@kali:~$c......
  • nginx自定义时间格式
    在每个server中加入:if($time_iso8601~"^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})"){set$year$1;......
  • 【Vue3.x】自定义指令directive
    自定义指令directive不同于vue2指令bindinsertedupdatecomponentUpdatedunbind1.vue3指令中的钩子函数created元素初始化的时候beforeMount指令绑定到元素后......