【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资源。

相关推荐
ace望世界2 小时前
android的Parcelable
android
顾林海2 小时前
Android编译插桩之AspectJ:让代码像特工一样悄悄干活
android·面试·性能优化
叽哥3 小时前
Flutter Riverpod上手指南
android·flutter·ios
循环不息优化不止3 小时前
安卓开发设计模式全解析
android
诺诺Okami3 小时前
Android Framework-WMS-层级结构树
android
alexhilton14 小时前
面向开发者的系统设计:像建筑师一样思考
android·kotlin·android jetpack
CYRUS_STUDIO1 天前
用 Frida 控制 Android 线程:kill 命令、挂起与恢复全解析
android·linux·逆向
CYRUS_STUDIO1 天前
Frida 实战:Android JNI 数组 (jobjectArray) 操作全流程解析
android·逆向
用户091 天前
Gradle Cache Entries 深度探索
android·java·kotlin
循环不息优化不止1 天前
安卓 View 绘制机制深度解析
android