#### Typed Array(数组资源)
- 有时候我们会在Java 代码中定义了两个数组, Android 并不推荐在Java 代码中定义数组,因为Android 允许通过资源文件来定义数组资源。
- Typed Array 代表一个通用类型的数组, 该类提供了getXxx(int index)方法来获取指定索引处的数组元素。
- Android 采用位于/res/values 目录下的arrays. xrnl 文件来定义数组资源,定义数组时XML资源文件的根元素也是<resources... />,该元素内可包含如下三种子元素。
- <array... ./>子元素: 定义普通类型的数组, 例如Drawable 数组
- <string-array... ./>子元素: 定义字符串数组。
- <integer-array... ./>子元素: 定义整型数组。
- 目前官网已经将integer-array独立出来了,如下定义资源文件`res/values/integers.xml`,
~~~
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer-array name="bits">
<item>4</item>
<item>8</item>
<item>16</item>
<item>32</item>
</integer-array>
</resources>
~~~
java代码中可以这样引用
~~~
Resources res = getResources();
int[] bits = res.getIntArray(R.array.bits);
~~~
而在xml文件中这样引用In XML: `@[package:]array.bits`
- 为了能在Java 程序中访问到实际数组, Resources 提供了如下方法。
- String[] getStringArray(int id): 根据资源文件中字符串数组资源的名称来获取实际的字符串数组。
- int[] getlntArray(int id): 根据资源文件中整型数组资源的名称来获取实际的整型数组。
- TypedArray obtainTypedArray(int id): 根据资源文件中普通数组资源的名称来获取实际的普通数组。
- 示例如下
~~~
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 定义一个Drawable数组 -->
<array name="plain_arr">
<item>@color/c1</item>
<item>@color/c2</item>
<item>@color/c3</item>
<item>@color/c4</item>
<item>@color/c5</item>
<item>@color/c6</item>
<item>@color/c7</item>
<item>@color/c8</item>
<item>@color/c9</item>
</array>
<!-- 定义字符串数组 -->
<string-array name="string_arr">
<item>@string/c1</item>
<item>@string/c2</item>
<item>@string/c3</item>
<item>@string/c4</item>
<item>@string/c5</item>
<item>@string/c6</item>
<item>@string/c7</item>
<item>@string/c8</item>
<item>@string/c9</item>
</string-array>
<!-- 定义字符串数组 -->
<string-array name="books">
<item>疯狂Java讲义</item>
<item>疯狂Ajax讲义</item>
<item>疯狂Android讲义</item>
</string-array>
</resources>
~~~
可以在xml文件中做如下引用,例如,如下界面布局文件中定义了一个ListView 数组, 并将android:entries
属性值指定为一个数组。界面布局文件代码如下。
~~~
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<!-- 省略其他组件-->
<!-- 定义ListView组件,使用了数组资源 -->
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/books"/>
</LinearLayout>
~~~
在Java代码就可以做如下操作
~~~
public class MainActivity extends Activity
{
// 获取系统定义的数组资源
String[] texts;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
texts = getResources().getStringArray(R.array.string_arr);
// 创建一个BaseAdapter对象
BaseAdapter ba = new BaseAdapter()
{
@Override
public int getCount()
{
// 指定一共包含9个选项
return texts.length;
}
@Override
public Object getItem(int position)
{
// 返回指定位置的文本
return texts[position];
}
@Override
public long getItemId(int position)
{
return position;
}
// 重写该方法,该方法返回的View将作为的GridView的每个格子
@Override
public View getView(int position
, View convertView, ViewGroup parent)
{
TextView text = new TextView(MainActivity.this);
Resources res = MainActivity.this.getResources();
// 使用尺度资源来设置文本框的高度、宽度
text.setWidth((int) res.getDimension(R.dimen.cell_width));
text.setHeight((int) res.getDimension(R.dimen.cell_height));
// 使用字符串资源设置文本框的内容
text.setText(texts[position]);
TypedArray icons = res.obtainTypedArray(R.array.plain_arr);
// 使用颜色资源来设置文本框的背景色
text.setBackground(icons.getDrawable(position));
text.setTextSize(20);
return text;
}
};
GridView grid = (GridView) findViewById(R.id.grid01);
// 为GridView设置Adapter
grid.setAdapter(ba);
}
}
~~~
- 前言
- Android系统的体系结构
- Dalvik VM 和 JVM 的比较
- Android 打包应用程序并安装的过程
- Android ADB工具
- Android应用开发
- Android UI相关知识总结
- Android 中window 、view、 Activity的关系
- Android应用界面
- Android中的drawable和bitmap
- AndroidUI组件adapterView及其子类和Adapter的关系
- Android四大组件
- Android 数据存储
- SharedPreference
- Android应用的资源
- 数组资源
- 使用Drawable资源
- Material Design
- Android 进程和线程
- 进程
- 线程
- Android Application类的介绍
- 意图(Intent)
- Intent 和 Intent 过滤器(Google官网介绍)
- Android中关于任务栈的总结
- 任务和返回栈(官网译文)
- 总结
- Android应用安全现状与解决方案
- Android 安全开发
- HTTPS
- 安卓 代码混淆与打包
- 动态注入技术(hook技术)
- 一、什么是hook技术
- 二、常用的Hook 工具
- Xposed源码剖析——概述
- Xposed源码剖析——app_process作用详解
- Xposed源码剖析——Xposed初始化
- Xposed源码剖析——hook具体实现
- 无需Root也能Hook?——Depoxsed框架演示
- 三、HookAndroid应用
- 四、Hook原生应用程序
- 五、Hook 检测/修复
- Android 应用的逆向与加固保护技术
- OpenCV在Android中的开发
- Android高级开发进阶
- 高级UI
- UI绘制流程及原理
- Android新布局ConstraintLayout约束布局
- 关键帧动画
- 帧动画共享元素变换
- Android异步消息处理机制完全解析,带你从源码的角度彻底理解
- Android中为什么主线程不会因为Looper.loop()里的死循环卡死?
- 为什么 Android 要采用 Binder 作为 IPC 机制?
- JVM 中一个线程的 Java 栈和寄存器中分别放的是什么?
- Android源码的Binder权限是如何控制?
- 如何详解 Activity 的生命周期?
- 为什么Android的Handler采用管道而不使用Binder?
- ThreadLocal,你真的懂了吗?
- Android屏幕刷新机制