写点什么

Android 之使用 Assets 目录中的 xml 布局、网页、音乐等资源

用户头像
Android架构
关注
发布于: 2021 年 11 月 05 日

1.当我们兴高采烈的写好 demo,实机运行时,会遇到第一个坑:


程序抛出了 FileNotFoundException 的异常


java.io.FileNotFoundException: activity_main.xml


通过查阅资料后你发


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


现原来要在文件名的前面加上"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 显示的字符发生了改变:



入坑指南




  1. java.io.FileNotFoundException: activity_main.xml xml 布局文件名需加前缀"assets/"

  2. java.io.FileNotFoundException: Corrupt XML binary file xml 布局文件需要放入编译后的 xml,如果只是普通的 xml 文件,则不需要

  3. 在 xml 中对子 View 设置 tag,通过 ViewGroup 的 findViewWithTag(tag)方法即可获取到子 View

  4. 使用 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


}


/**

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android之使用Assets目录中的xml布局、网页、音乐等资源