首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我能把可绘制的id放在string.xml中吗?

在Android开发中,string.xml文件主要用于存储应用的字符串资源,以便于多语言支持和统一管理。通常情况下,你不应该将可绘制的ID(例如,指向Drawable资源的ID)直接放在string.xml文件中。

基础概念

  • string.xml: 这是Android项目中用于定义字符串资源的XML文件。
  • Drawable资源: 这些是图形资源,如图片、图标等,它们有自己的命名空间和ID。

为什么不应该这样做

  1. 类型安全: string.xml是为文本资源设计的,而Drawable资源是图形资源。将图形资源的ID放在文本资源文件中会破坏类型安全。
  2. 维护困难: 如果将来需要更改Drawable资源,开发者可能会忘记检查string.xml中的引用,导致潜在的错误。
  3. 混淆风险: 在构建过程中,资源ID可能会发生变化,如果硬编码在string.xml中,可能会导致运行时错误。

如何正确引用Drawable资源

你应该在布局文件(如activity_main.xml)或代码中直接引用Drawable资源。例如,在XML布局文件中,你可以这样引用一个图片资源:

代码语言:txt
复制
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/my_image" />

在Java或Kotlin代码中,你可以这样引用:

代码语言:txt
复制
ImageView imageView = findViewById(R.id.my_image_view);
imageView.setImageResource(R.drawable.my_image);

应用场景

如果你需要在字符串中包含一些图形元素,通常的做法是使用HTML格式的字符串并在其中嵌入图像标签。例如:

代码语言:txt
复制
<string name="welcome_message"><![CDATA[<p>Welcome to our app!</p><img src="drawable/my_image" />]]></string>

然后在TextView中使用Html.fromHtml()方法来解析这个字符串:

代码语言:txt
复制
String message = getString(R.string.welcome_message);
textView.setText(Html.fromHtml(message, Html.FROM_HTML_MODE_LEGACY));

解决问题的方法

如果你遇到了需要在string.xml中引用Drawable资源的问题,你应该重新考虑你的设计决策。通常,最好的做法是将图形资源和文本资源分开管理,并在需要的地方直接引用它们。

总之,保持资源类型的清晰分离有助于提高代码的可维护性和可读性。避免将Drawable资源的ID放在string.xml文件中,而是应该在布局或代码中直接引用这些资源。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

浅谈Android编码规范及命名规范

文件   在我看来,当一个文本信息出现的次数大于一次的时候就必须要使用string.xml   比如一个保存按钮 , 不规范写法:       <Button android:id...文件中: 保存   这种写法,往后需要修改,只需要在string.xml文件中修改一行代码 便实现了整个APP的该文本内容修改。   ...我们都知道,一个Activity中有基本都有的操作:     ①、初始化变量     ②、初始化控件     ③、设置监听事件     ④、加载网络数据并显示   那么就可以将以上的代码分门别类的放在这几个方法中...的互相传值不大会,这里推荐一个解决方案:Android项目实战(十三):浅谈EventBus , 对我来说是项目必备,但是也要合理运用   6、Activity中尽量不要使用内部类     这里以RecyclerView...不规范做法:部分同学图省事(当然放在一个Activity中确实方便数据传输和item点击事件操作),把它们都写在一个Activity中,这样是不可取的,因为大大的增加了单个Activity的代码量,对维护来说很不方便

1.4K70
  • 【答疑释惑】Android多国语言实现原理

    网友们问的问题是android中布局文件中android:text="hello_world"和 android:text="@string/hello_world"的区别。...我的解答是: Android中都会提供多套资源来进行屏幕的适配和语言适配,来看一下Google源码下一个APP的资源目录: 首先在要知道每次在string.xml文件中添加字符串的时候都会生成一个字符串...ID,ID是一个int值,比如上面的是R.string.hello_world,这个是编译器自动生成的,如现在string.xml文件添加hello_world,如下: 然后就会自动在R.java文件中生成对应的资源...ID。...这个资源ID:hello_world对应着不同value包下string.xml文件中的字符串资源hello_world,在进行语言切换的时候Android系统会自动寻找当前语言对应的资源包中的资源,完成语言切换

    960100

    Android Vector曲折的兼容之路

    Android Vector曲折的兼容之路 两年前写书的时候,就在研究Android L提出的Vector,可研究下来发现,完全不具备兼容性,相信这也是它没有被广泛使用的一个原因,经过Google的不懈努力...中的图像换成了Vector图像而已,接下来,在Button中使用这个Selector即可: <Button android:id="@+id/btn" android:layout_width...抽取string兼容问题 开发者有时候为了代码简洁可能会把Vector图像中的pathData放到string.xml中,然后在Vector图像中引用string。...但这种方式如果通过生成png来兼容5.0以下机型的话,会报pathData错误,编译器不会去读取string.xml,只能把pathData写到Vector图像中,动画文件中也是一样,这也是为了兼容做出的牺牲吗...其实很简单,就是一个图像的截取,设置一个比例即可,即当前绘制多少比例的图像,其余部分不绘制,Start和End分别就是从PathData的Start和End开始算,大家参考几个例子就能理解了。

    1.8K30

    Zxing二维码扫描和那些坑

    Google的zxing来实现二维码扫描我相信很多人都用过。但是实现的过程遇到了很多的坑,也是因为这些坑在网上没有具体的解决方案,今天就把我的实现过程分享给大家。...↑  然后在color.xml中添加以上颜色值。 ? ↑  在ids.xml中添加以上id属性值。 ? ↑ 在string.xml中添加显示的提示字符。可自己随意修改。...所以,顾名思义,我们绘制肯定是在onDraw方法中了。ok,直接定位到onDraw方法,剩下的就是你自己发挥想象力,去定制啦!(比如:四个角,扫描线,等等。。)...3.填坑 本篇文章在开始的时候,我就说了坑坑坑!所以,单凭以上2个部分是满足不了大家的,那么,我们下面来看几个问题: (1)你是否遇到了,取景框太小,以至于离二维码很远才可以扫到?...有问题的童靴欢迎给我留言,我将尽快回复! 注:最近有朋友说近距离扫描二维码扫描不出,需要远一点才可以。

    1.7K10

    《Android编程权威指南》之Android开发初体验

    地址:https://jaeger.itscoder.com/android/2016/02/14/android-studio-tips.html 绘制 UI 组件是用户界面的构造模块,可以显示文字或图像...创建字符串资源推荐把字符串都定义在app/res/values/string.xml文件 预览界面布局 写完布局文件,旁边可以预览效果 截图 从布局 XML 到视图对象 java目录是项目全部Java...activity子类的实例被创建后,onCreate(Bundle)方法被调用,并通过调用setContentView()方法获取管理属于自己的用户界面,根据传入的布局资源ID,生成指定布局视图并将其放置在屏幕上...布局是一种资源(包括像文件、音频文件以及XML文件等)放在目录app/res的子目录下。 R.java文件在Android项目编译过程中自动生成,不要随意修改。...组件的实际应用 主要就在讲如何在代码中获得布局文件中的组件,为之设置监听器等内容,现在很多项目都用一些注解类框架来简化这个过程,比如说ButterKnife,还有ViewBinding(AS3.6 才支持

    1.2K20

    Android6.0源码分析之View(一)

    想要对view先有个整体的了解,我建议大家参考view.java中的类的注释,注释中交代了view所涉及到的所有知识。...example,如下图,在xml中添加了我自定义的button,但是因为在自定义button时我的构造方法中传入的为null,则导致button的xml中定义的属性没有被解析) ?...(在运行时期添加),借助viewgroup特有的addView(View)方法添加view,添加view可借助只含有Context构造参数的构造方法 可以在xml中静态添加(在编译期添加),在xml中添加...Chapter Ten Tags(标签) 与id不同,tags不是用来标识view的,tags本质上是与view相关联的一些额外的信息,tags通常来用存储一些与view相关的一些数据,而不是把他们放在单独的结构中...首先你需要在string.xml文件中定义一个标签,格式如下 。。。。。

    93480

    《Android编程权威指南》之Android与MVC篇

    ,编译器会自动的从主构造函数中根据所有声明的属性提取以下函数: equals() / hashCode() toString() 格式如 "User(name=John, age=42)" componentN...V —— 视图对象知道如何在屏幕上绘制自己以及如何响应用户的输入。比如说layout中的xml文件,也可以自定义控件,反正是看得见的对象,就是视图对象。...例如,如果某张图片在 mdpi 屏幕上的大小为 100px x 100px,那么它在 tvdpi 屏幕上的大小应该为 133px x 133px。 将应用图标放在 mipmap 目录中!...dp 是一个虚拟像素单位,1 dp 约等于中密度屏幕(160dpi;“基准”密度)上的 1 像素。对于其他每个密度,Android 会将此值转换为相应的实际像素数。...在定义文本大小时,您应改用可缩放像素 (sp) 作为单位(但切勿将 sp 用于布局尺寸)。默认情况下,sp 单位与 dp 大小相同,但它会根据用户的首选文本大小来调整大小。

    1.1K31

    『安卓』安卓开发基础--基本控件

    <TextView //控件id android:id = "@+id/xxx" @+id/xxx表示新增控件命名为xxx //我们可以在Java代码中通过findViewById()的方法获取到该对象..." //在名字叫text1的控件的上边 android:layout_above="@id/text1" 在Activity中的简单用法 public class MainActivity extends..." //在名字叫text1的控件的上边 android:layout_above="@id/text1" 我们需要在Activity中为Button的点击事件注册一个监听器,以下介绍两种方式来实现按钮监听事件...,显示在视图的上部分位置 //android:scaleType="matrix" 用矩阵来绘制 //图片来源,需要将图片复制放到res/drawable文件夹里面,引用的时候不需要写图片的后缀 android...,显示在视图的上部分位置 //android:scaleType="matrix" 用矩阵来绘制 //图片来源,需要将图片复制放到res/drawable文件夹里面,引用的时候不需要写图片的后缀 android

    7K20

    增强分析可读性-Pandas教程

    在那之后,我可以把结果放在微软的PowerPoint上,并在一天结束前附上一些基本的脚注,然后把它们发给我的主管,让他们演示并做出重要的决定。...那太好了,不是吗? As-is 下面让我们看一下我为这个示例生成的数据帧。这是公司需要的收入额。如你所见,这是pandas数据帧返回的默认结果。没有任何配置。 ?...我经常从我的主管或首席执行官那里得到的一个评论是。 你能让它更易读,更容易比较吗?” 解决办法可能是把这个数字除以一百万,然后把单位放在表的上方。你要记住的一点是,在你的演讲中应该保持一致。...你会减少花在这上面的时间,然后把注意力放在内容的有效性上。 如何改进? 可读格式 我收到的最常见的评论是,你能把数字四舍五入,并使用符号,如M表示百万或K表示千?...如果你使用pandas库进行数据分析,我认为matplotlib将是你绘制图形的首选。 ?

    97740

    【Go 语言社区】HTML5 canvas验证码识别

    canvas 的历史这个 HTML 元素是为了客户端矢量图形而设计的。它自己没有行为,但却把一个绘图 API 展现给客户端 JavaScript 以使脚本能够把想绘制的东西都绘制到一块画布上。...],x表示横坐标纵向上比较简单,y坐标的范围是恒定的,9px到14px.图像处理首先,我并没有专业的图像处理知识,所以下面说的专业词汇肯定是有问题的,以理解为主.由于数字和背景都是随机颜色的,那么我们生成的模板字符串岂不是每次都会变吗...0.11,灰度值的范围是0~255,我这里把128看成临界点,也就是把0~128看成是暗,用0表示,128~255看成是明,用1表示,我把明暗简写为ld(Light and Dark).也就是公式,ld...1:0.为什么通过明暗值能把数字和背景色区分开来呢,因为这种验证码在进行灰度化以后,背景明显是属于亮的,偏白色,而数字是属于暗的,偏黑色.所以能够区分.通过photoshop灰度化的效果 再进行50%...阀值 生成模板既然每个数字的形状和位置都是一定的,那我们就能把0-9这10个数字的像素信息存储下来作为模板,在识别验证码时,取出验证码图片中的数字依次对比.如果相等说明就是这个数字.下面是我写的生成模板的代码

    1.7K40

    AI 绘制版《漠河舞厅》MV 火了,网友:感觉 AI 读懂了歌词

    1 AI为我画了一个瑰丽的世界 2019年12月,民谣歌手柳爽在漠河采风时,在当地的一家舞厅遇到了一名独自跳舞的老人,简单地交谈过后,柳爽得知了老人的妻子在1987年大兴安岭“五·六”特大森林火灾事故中遇难...前一句歌词,AI画出了一位泪眼婆娑的银发老人的肖像图,后一句歌词,画面呈现的是一名白发苍苍老妇朝着一个垂首沉思的老夫微微倾着身子,好像在呼唤“如果我的时间没有定格在三十年前,我应该和你一样容颜迟暮,你能看见我现在的样子吗...接着歌词唱回到,“灯光底,抖落了晨曦,在1980的漠河舞厅。” AI绘制了刚刚升起的太阳、漠河舞厅落地窗上的人形剪影,以及上世纪80年代人声鼎沸、五光十色的,“有你、也有我”的漠河舞厅。...不得不说,Up主“拯救世界的狗子”和AI共同创造了令人惊叹的作品,不仅人物风格有着相同的延续,不同场景色彩鲜亮且构图精巧,尤其是红日、日光和舞厅人形剪影那张,AI居然能把这些元素如此合理地放在一张图上,...正如《 漠河舞厅》AI绘制版本MV创作者“拯救世界的狗子”回应的,(不是AI读懂了歌词)“而是我读懂了歌词,用蹩脚的英文给AI描述的。”

    21820

    不怕搞事,自定义View云扩散效果

    这里我就找来了一张铁塔的简笔画~ 转换之后,就可以得到SVG文件了~ 其次,需要用到一个工具类,用于把SVG转换成Path.这里我直接拿了GAStudio哥的一个工具类:SvgPathParser...接下来,我们把拿到的SVG保存在String.xml文件中待用~ 接下来使用PathMeasure 来进行SVG转换后Path的绘制,具体的细节,请看源码~这里不过多阐述。...铁塔完毕后,有点单调~ 我们来给他绘制一些云彩~ 每个云彩都是一个Path,所以画云彩只是绘制一些Path. ? 最后,加上动画~ 让他不生硬。...好的,有了思路就很好继续了。我只需要让两个图片使用Xfermode搞基一番,并且在过程中让这个View逐渐透明,遮罩图片逐渐放大即可。...同时第一个View设置gone来避免过度绘制,第二个View绘制的实际上是两个bitmap,并且开启硬离屏缓存来实现Xfermode的正确效果。 ?

    74620
    领券