【Android】TypedArray的使用

介绍

看电池电量组件BatteryMeterView的时候看到的。

Array是个数组,所有TypedArray也是个容器,基本是用于自定义View里面的(至少我目前见过的全部都在自定义View里面)。

使用

1.自定义View

html 复制代码
public class RoundSeekbarView extends View {
    public RoundSeekbarView(Context context) {
        super(context);
    }

    public RoundSeekbarView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
}

2.添加资源

在res/valus/attrs中添加资源,没有attrs文件就创建一个。使用declare-styleable,这里有一点要注意,那就是name一定要跟自定义的View的类名一致,例如我在第一步自定义的View的类名是RoundSeekbarView,这里的declare-styleable的name也一定要是RoundSeekbarView。

html 复制代码
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="RoundSeekbarView">
        <attr name="frameColor" format="color"/>
        <attr name="textAppearance" format="reference"/>
    </declare-styleable>
</resources>

format是这个属性的类型,有以下类型:

|-----------|---------|
| reference | 引用某一资源值 |
| string | 字符串 |
| color | 颜色 |
| dimension | 尺寸 |
| boolean | 布尔值 |
| integer | int整数类型 |
| float | 浮点数 |
| fraction | 百分数 |
| enum | 枚举 |
| flag | 位运算 |

3.在布局文件中使用自定义的View

html 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".CanvasActivity">
    <com.example.sim.view.RoundSeekbarView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:frameColor="#908899ff"/>
</LinearLayout>

这里的app:xxx取决于你在第二部给这个属性起的名字,如果你起的是barColor,那么当你在布局文件中给RoundSeekbarView添加属性时就会弹出barColor的提示,这就是declare-styleable的name也一定要是RoundSeekbarView的意义。

4.TypedArray的使用

上面三步都是使用TypedArray的准备工作,接下来就到了TypedArray的使用了。

它是这样子用的,首先通过context.obtainStyledAttributes方法获取TypedArray实例

java 复制代码
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundSeekbarView);

然后通过对应的get方法获取资源,例如获取format是颜色的资源使用getColor

java 复制代码
int frameColor = typedArray.getColor(R.styleable.RoundSeekbarView_frameColor, Color.BLUE);

获取资源的使用getResourceId

java 复制代码
int textAppearance=typedArray.getResourceId(R.styleable.RoundSeekbarView_textAppearance,0);

其他的资源也有对应的get方法

注意,获取完资源之后要使用

java 复制代码
typedArray.recycle();

回收typedArray资源。

相关推荐
雨白13 小时前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk13 小时前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING14 小时前
RN容器启动优化实践
android·react native
恋猫de小郭16 小时前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Kapaseker21 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴21 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭1 天前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab1 天前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe2 天前
Now in Android 架构模式全面分析
android·android jetpack
二流小码农2 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos