当前位置: 首页 > news >正文

诡异错误 Unresolved reference: styleable

开发了一个自定义Android UI控件,继承自View,然后想要在布局XML里像原生控件一样随意配置属性,怎么做呢?分三步:

第一步:在res/values目录下创建attrs.xml,然后声明自定义属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="PointCaptureView">
        <attr name="pcv_curve_color" format="color|reference"/>
    </declare-styleable>
</resources>

上面示例中,declare-styleable节点的name即为控件名字,下面的子节点就是自定义属性,可以声明多个,依次添加即可。这里我们定义了一个名为pcv_curve_color的属性,其类型为一个颜色值。

第二步:在自定义控件类的构造函数中读取自定义属性值

class PointCaptureView : View {

constructor(context: Context, attr: AttributeSet?, @AttrRes defStyleAttr: Int) : super(context, attr, defStyleAttr) {
        val a = context.obtainStyledAttributes(attr, R.styleable.PointCaptureView, defStyleAttr, 0)
        canvasPaintColor = a.getColor(R.styleable.PointCaptureView_pcv_curve_color, Color.YELLOW)
        a.recycle() // 别忘了这一句

        // 其他初始化代码
        // ...
}
}

第三步:在布局XML中配置自定义属性

<com.example.testbedandroid.widgets.PointCaptureView
        android:id="@+id/hapticView"
        android:layout_width="match_parent"
        android:layout_height="120dp"
        app:pcv_curve_color="@color/green"/>

大功告成!但问题也来了:编译出错:Unresolved reference: styleable。这是怎么回事呢?参考了GitHub上的其他示例,没发现有啥毛病呀!百思不得其解……

不卖关子了!注意那条警告信息:Don't include `android.R` here; use a fully qualified name for each usage instead,问题就在这儿啦!写代码过程中碰到无法解析的符号时,按Alt + Enter太顺了——当有多个解析来源时,一不小心就会搞错。回到我们的例子中,这个R应该解析为 {你的包名}.R 而不是 android.R ,赶紧在源文件头部把import android.R删了,然后在构造函数编译错误处重新按下Alt + Enter,欧拉~

相关文章:

  • exception错误处理库学习
  • 蔚来、小鹏、吉利走到了跨界分叉口
  • 神卓互联SDWAN技术实现异地组网办公(无需硬件)
  • Redis分布式锁(下篇)
  • Vue--整合SVG Icon图标--方法/实例
  • STC15单片机-整合代码,完成软件设计
  • 直流有刷电机调速原理及Matlab/Simulink仿真
  • 基于bootstrap+Java+MySQL的高校成绩管理系统
  • java基于ssm+vue+elementui的旅游线路分享管理系统
  • 最近公共祖先 LCA
  • Deterministic Policy Gradient Algorithms
  • Java8时间日期库DateTime API及示例
  • np.random.seed(), torch.manual_seed(args.seed)
  • 真真正正的九面阿里才定级 P6+ 支持背调,还不来看?(建议收藏)
  • Fedora 24 Beta 版发布下载!
  • @jsonView过滤属性
  • 【前端学习】-粗谈选择器
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Java 23种设计模式 之单例模式 7种实现方式
  • Linux gpio口使用方法
  • node学习系列之简单文件上传
  • Sublime text 3 3103 注册码
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • Vue组件定义
  • 编写高质量JavaScript代码之并发
  • 力扣(LeetCode)965
  • 如何合理的规划jvm性能调优
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • Android开发者必备:推荐一款助力开发的开源APP
  • 阿里云API、SDK和CLI应用实践方案
  • 阿里云服务器如何修改远程端口?
  • 如何在招聘中考核.NET架构师
  • ​如何在iOS手机上查看应用日志
  • "无招胜有招"nbsp;史上最全的互…
  • # C++之functional库用法整理
  • (70min)字节暑假实习二面(已挂)
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .NET Core中Emit的使用
  • .NET Micro Framework初体验
  • .NET项目中存在多个web.config文件时的加载顺序
  • .NET中winform传递参数至Url并获得返回值或文件
  • .sys文件乱码_python vscode输出乱码
  • :O)修改linux硬件时间
  • @Bean, @Component, @Configuration简析
  • @RequestBody与@ModelAttribute
  • []sim300 GPRS数据收发程序
  • [2021 蓝帽杯] One Pointer PHP
  • [Angular] 笔记 6:ngStyle
  • [Asp.net mvc]国际化
  • [c]扫雷