把String字符串转化为drawable设置成TextView的drawableRight

本文介绍如何在Android中为TextView设置左侧图标,并提供一种将字符串转换为Drawable的方法,便于实现文字与图标结合的显示效果。

设置TextView的drawable:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Drawable drawableleft = getResources().getDrawable(  
  2.         R.drawable.icon_qq_gray);  
  3. drawableleft.setBounds(00, drawableleft.getMinimumWidth(),  
  4.         drawableleft.getMinimumHeight());  
  5.   
  6. txt_bind_qq.setCompoundDrawables(drawableleft, null,  
  7.         TextToDrawable(R.string.bound), null);  

把字符串转化为drawable:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public Drawable TextToDrawable(int id) {  
  2.     Bitmap bitmap = Bitmap.createBitmap(200250, Config.ARGB_8888);  
  3.     Canvas canvas = new Canvas(bitmap);  
  4.     Paint paint = new Paint();  
  5.     paint.setTextSize(65);  
  6.     paint.setTextAlign(Align.LEFT);  
  7.     paint.setColor(Color.GRAY);  
  8.     String s = getResources().getString(id);  
  9.     FontMetrics fm = paint.getFontMetrics();  
  10.     canvas.drawText(s, 0145 + fm.top - fm.ascent, paint);  
  11.     canvas.save();  
  12.     Drawable drawableright = new BitmapDrawable(bitmap);  
  13.     drawableright.setBounds(00, drawableright.getMinimumWidth(),  
  14.             drawableright.getMinimumHeight());  
  15.     return drawableright;  
  16. }  
<think>首先,用户查询是:“我想查找将Android XML字符串转换Drawable的方法 请问How to convert Android XML string to Drawable”。这是一个关于Android开发的问题,涉及到将XML字符串(可能是从string.xml中获取)转换Drawable对象。 回顾系统级指令: - 所有行内数学表达式必须用$...$格式。 - 独立公式必须用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 引用的段落末尾自然地添加引用标识。 用户查询中提到了引用: - 引用[1]:关于string.xml文件的使用。 - 引用[2]:关于获取资源文件中的值,包括颜色、尺寸、drawable等。 - 引用[3]:关于string.xml中使用总结。 但这些引用不是用户的真正需求。我需要参考用户上一次的问题和我的回答。在对话历史中,这是第一条消息,所以没有上一次的交互。用户说“上述引用仅供参考”,所以我应该基于核心问题回答。 核心问题:如何将Android XML字符串转换Drawable。 理解问题:"Android XML字符串"可能指的是string.xml文件中定义的字符串资源。但用户想要转换DrawableDrawable通常是从drawable资源或其它方式获取的。 澄清:在Android中,字符串资源是文本,而Drawable是图形资源。所以,"XML字符串"可能是一个误解。可能用户的意思是: - 从string.xml获取一个字符串,该字符串代表一个drawable资源名。 - 或者,用户错误地将drawable资源称为"XML字符串",因为drawable资源也是XML定义的。 回顾引用: - 引用[1]提到string.xml存储字符串。 - 引用[2]提到获取drawable值:`ContextCompat.getColor()`和drawable相关。 - 引用[3]提到string.xml格式化。 可能用户指的是:有一个字符串string.xml中,该字符串drawable资源的名称(如"ic_launcher"),如何将其转换Drawable对象。 在Android中,常见的方法是使用资源ID来获取Drawable字符串资源通常用于文本,但你可以存储resource name作为字符串。 步骤: 1. 在string.xml中定义一个字符串,包含drawable资源的名称(例如:`<string name="drawable_name">my_drawable</string>`)。 2. 在代码中,获取这个字符串资源的值。 3. 然后,使用这个字符串获取drawable资源ID或直接获取Drawable。 标准方法是使用`Resources.getIdentifier()` 来获取资源ID,然后使用`Resources.getDrawable()`。 例如: - 在string.xml: `<string name="drawable_ref">ic_launcher</string>` - 在代码中: ```java String drawableName = getString(R.string.drawable_ref); int resourceId = getResources().getIdentifier(drawableName, "drawable", getPackageName()); Drawable drawable = ContextCompat.getDrawable(this, resourceId); ``` 或者,直接从资源ID获取Drawable,如果drawable资源ID是固定的。 但用户说“XML字符串转换Drawable”,所以可能需要解释如何从字符串资源获取Drawable。 另一个可能性:用户可能误解了"XML字符串",意思是XML定义的drawable(如shape或vector drawable),但那是直接作为drawable资源使用。 在回答中,我需要明确: - 解释string.xml是用来存储文本字符串的。 - 要获取Drawable,通常是从drawable资源中直接获取。 - 如果字符串包含drawable资源名,则可以使用`getIdentifier()`方法。 现在,构建回答结构: - 使用中文回答。 - 结构清晰:一步步解决问题。 - 生成相关问题。 - 添加引用标识:引用提供的参考信息。 引用标识:[^1], [^2], [^3] 对应提供的引用。 在我的回答中,如果需要引用这些信息,就添加。 例如: - 引用[1]关于string.xml:[^1] - 引用[2]关于获取资源值:[^2] - 引用[3]关于格式化:[^3] 核心回答: 1. 解释string.xml的角色:用于存储文本字符串,与代码分离。[^1] 2. 要获取Drawable,通常直接从drawable资源获取,使用`ContextCompat.getDrawable()`或类似方法。[^2] 3. 如果字符串资源包含drawable名称,则使用`Resources.getIdentifier()`获取ID,然后获取Drawable。 4. 给出代码示例。 代码示例:用Java或Kotlin?用户没有指定,但Android常用Kotlin或Java。我会用Java示例,因为引用中是Java。 确保回答真实可靠: - 在Android开发中,确实有这样的做法。 - ContextCompat是支持库的一部分,用于向后兼容。 最后,生成相关问题: - 基于主题,生成2-3个相关问题。 完整回答结构: - 引言:解释问题。 - 步骤:如何实现。 - 代码示例。 - 注意事项。 - 相关问题。 数学表达式:可能不需要,因为这是编程问题。但如果提到比如资源ID计算,可以用行内数学。例如,资源ID是一个整数$id$等。但可能不需要,保持简单。 现在,草拟回答。 </think>### 如何将 Android XML 字符串转换Drawable 在 Android 开发中,您提到的“XML字符串”通常指的是在 `string.xml` 文件中定义的字符串资源(如应用程序标签或文本)。而 Drawable 是用于图形元素的资源(如图标或背景)。直接将字符串内容转换Drawable 并不常见,因为这涉及文本到图形的转换,Android SDK 并没有内置方法支持这样的操作。相反,**常见场景是:字符串资源存储的是一个 Drawable 资源的名称(如 “ic_launcher”),然后您需要根据这个名称获取对应的 Drawable 对象**。下面我将一步步解释正确的方法,确保代码可靠且易于实现。[^1] #### 步骤 1: 定义字符串资源和 Drawable 资源 在您的 `res/values/string.xml` 文件中,定义一个字符串资源,其值指向一个 Drawable 资源的名称(Drawable 资源必须在 `res/drawable` 目录下定义,例如 `ic_launcher.xml` 或 PNG 文件)。例如: ```xml <string name="drawable_name">ic_launcher</string> <!-- 存储 Drawable 资源的名称 ic_launcher --> ``` 同时,确保在 `res/drawable` 目录下存在对应的 Drawable 资源文件(如 `ic_launcher.xml` 定义 Vector Drawable)。这种方式将字符串Drawable 分离,便于本地化和维护。[^1][^3] #### 步骤 2: 在 Java/Kotlin 代码中获取字符串转换Drawable 在您的 Activity 或 Fragment 中,使用以下代码: 1. 获取字符串资源中的 Drawable 名称。 2. 使用 `Resources.getIdentifier()` 获取 Drawable 资源的 ID。 3. 使用 `ContextCompat.getDrawable()` 安全地获取 Drawable 对象(避免兼容性问题)。 以下是 Java 代码示例: ```java // 获取字符串资源中的 Drawable 名称 String drawableRef = getString(R.string.drawable_name); // 从 string.xml 获取字符串 "ic_launcher" // 获取资源管理器 Resources res = getResources(); // 获取 Drawable 资源的 ID int drawableId = res.getIdentifier(drawableRef, "drawable", getPackageName()); // 参数:字符串名称、资源类型、包名 // 检查资源 ID 是否有效 if (drawableId != 0) { // 使用 ContextCompat 安全获取 Drawable 对象 Drawable drawable = ContextCompat.getDrawable(this, drawableId); if (drawable != null) { // 成功获取 Drawable,可用于设置 ImageView 等 imageView.setImageDrawable(drawable); } else { Log.e("DrawableConvert", "Drawable 资源不存在或加载失败"); } } else { Log.e("DrawableConvert", "未找到匹配的 Drawable 资源,请检查名称是否正确"); } ``` 如果是 Kotlin 代码: ```kotlin val drawableRef = getString(R.string.drawable_name) // 获取字符串资源 val drawableId = resources.getIdentifier(drawableRef, "drawable", packageName) if (drawableId != 0) { ContextCompat.getDrawable(this, drawableId)?.let { drawable -> imageView.setImageDrawable(drawable) } ?: Log.e("DrawableConvert", "Drawable 加载失败") } else { Log.e("DrawableConvert", "资源名称无效") } ``` #### 关键注意事项 - **安全性**:使用 `ContextCompat.getDrawable()` 而不是已弃用的 `getDrawable()` 方法,以确保向后兼容(如支持旧版 Android)。[^2] - **错误处理**:始终检查 `getIdentifier()` 返回的 ID 是否为 0(无效),并在日志中输出错误,避免应用崩溃。 - **性能**:`getIdentifier()` 涉及反射,可能轻微影响性能。如果 Drawable 资源固定,建议直接使用资源 ID(如 `R.drawable.ic_launcher`)。 - **格式化问题**:如果字符串包含特殊字符(如 `%`),在 `string.xml` 中添加 `formatted="false"` 属性避免解析错误。[^3] - **常见误区**:不要尝试将任意文本字符串(如 "hello")直接转换为图形 Drawable;Android 不支持这种转换。此方法仅适用于字符串存储 Drawable 资源名称的场景。[^1] 如果您需要将文本动态渲染为图形(如自定义 View),可能需要使用 Canvas 绘制,但这超出了本问题的范围。基于引用内容,以上方法是最佳实践。[^1][^2][^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值