Android 之使用 Assets 目录中的 xml 布局、网页、音乐等资源
1.当我们兴高采烈的写好 demo,实机运行时,会遇到第一个坑:
程序抛出了 FileNotFoundException 的异常
java.io.FileNotFoundException: activity_main.xml
通过查阅资料后你发
现原来要在文件名的前面加上"assets/"的前缀
2.这时你修改了你的代码,要对文件前缀进行判断
fun getView(ctx: Context, filename: String): View? {
var name = filename
if(!filename.startsWith("assets/")){
name = "assets/$filename"
}
return LayoutInflater.from(ctx).inflate(am.openXmlResourceParser(name), null)
}
修改完代码后,你紧接着开始了第二波测试,却发现程序又抛出了异常:
java.io.FileNotFoundException: Corrupt XML binary file
这个错误则代表这你的 xml 布局文件格式不对,放入到 assets 目录下的 xml 文件应该是编译后的文件(即 apk 中 xml 文件)如下图:
3.于是你将你的 apk 中的 layout/activity_main.xml 拷贝到工程的 assets 目录下,开始了第三波测试:
这时你发现 APK 运行正常,但是你冥冥中发现了一丝不对劲,你发现你即使能拿到该布局所对应的 ViewGroup,却发现并不能通过 findViewById(id)方法来获取到子 View,于是你开始查看 ViewGroup 的源码,机智的你发现了如下方法:
public final <T extends View> T findViewWithTag(Object tag) {
if (tag == null) {
return null;
}
return findViewWithTagTraversal(tag);
}
该方法可以通过设置的 tag,来获取到对应的子 View
4.于是你在 xml 中为子 View 设置好 tag 后,写好代码,开始了第四波测试
这时候你查看手机上的 APP,发现 textView 显示的字符发生了改变:
入坑指南
java.io.FileNotFoundException: activity_main.xml xml 布局文件名需加前缀"assets/"
java.io.FileNotFoundException: Corrupt XML binary file xml 布局文件需要放入编译后的 xml,如果只是普通的 xml 文件,则不需要
在 xml 中对子 View 设置 tag,通过 ViewGroup 的 findViewWithTag(tag)方法即可获取到子 View
使用 html 网页 "file:///android_asset/$filename" filename 为 assets 目录下的文件路径
工具类源码:
package com.coding.am_demo
import android.content.Context
import android.content.res.AssetManager
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.view.LayoutInflater
import android.view.View
import java.io.IOException
/**
@author: Coding.He
@date: 2020/10/9
@emil: 229101253@qq.com
@des:获取 assets 目录下资源的工具类
*/
object AssetsTools {
private lateinit var am: AssetManager
private lateinit var appCtx: Context
/**
初始化 AssetsTools,使用前必须初始化
*/
fun init(ctx: Context) {
this.appCtx = ctx.applicationContext
am = ctx.applicationContext.assets
}
/**
评论