Android加载Assets目录中Xml布局文件
作者:ImTryCatchException 发布时间:2021-06-19 14:59:53
最近由于项目开发使用到了动态布局,因为打包sdk ,sdk 这块activity 需要一些layout 文件 。而做过sdk 开发的小伙伴应该知道,layout 文件是不能打包到jar 中的。当然了aar 除外。由于项目使用的还是jar包,所以怎么解决layout文件是个问题,一开始想到的办法就是把layout 文件发给客户。但是这种方法显然不太合适后来就发现了Android 其实提供了一个方法可以加载xml布局文件,就是使用inflate(XmlPullParser parser, ViewGroup root)这个方法,网上找了大批的文章,其中还是找到了两篇简单描写了下这个解析的过程但是在使用过程中还是出现了几个问题 :
1 如何拿到XmlPullParser 对象
拿到这个对象倒是不难我们通过 AssetsManger 就可以轻易获取XmlResourceParser openXmlResourceParser(String fileName)
但是注意这里有个问题就是filename 要加上”assets\”前缀不然会报 FileNotFound异常
2 发现解析不了xml 布局文件
openxmlresourceparser 方法报错,为什么呢。查到资料是因为这个方法只能解析编译后的xml文件,那么什么事编译后的xml文件,就是生成的apk 解压后 拿到的xml就是编译后的。所以我们放在assets 中的xml 都要是编译后的文件。目前还没有找到Android有别的工具可以专门编译xml 文件
3 解析到了view 如何拿到里面的子view 通过id 不行啊
这是肯定的不是在layout文件夹下的不会有id 索引所以你不能通过id 来find 。那么如何拿到子view ,后来发现了有人解决这个问题就是通过findViewWithTag 这个方法可以通过xml view 下配置的tag 来获取
以上问题解决后就完美拿到了xml 的布局view 文件 可以动态设置给activity了。下面我把源码贴上来需要的朋友可以参考下。
import android.content.Context;
import android.content.res.AssetManager;
import android.content.res.XmlResourceParser;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import java.io.IOException;
import java.io.InputStream;
/**
* Created by yuge on 2017/11/8.
*/
public class AssetsViewHelper {
private static Context mcontext;
private static AssetsViewHelper assetsViewHelper;
/**
* assets 目录前缀
*/
private static String assetsFile="assets/";
private AssetsViewHelper(){
}
public static AssetsViewHelper width(Context context){
mcontext=context.getApplicationContext();
if(assetsViewHelper==null){
synchronized (AssetsViewHelper.class){
if(assetsViewHelper==null){
assetsViewHelper=new AssetsViewHelper();
}
}
}
return assetsViewHelper;
}
/**
* 获取layout方法
* @param filename
* @return
*/
public View getAssetsLayout(String filename) {
AssetManager am = mcontext.getResources().getAssets();
try {
XmlResourceParser parser = am.openXmlResourceParser(assetsFile + "activity_main.xml");
LayoutInflater inflater = (LayoutInflater) mcontext.getSystemService(mcontext.LAYOUT_INFLATER_SERVICE);
View inflate = inflater.inflate(parser, null);
return inflate;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
/**
* 根据 tag 获取 view 对象
* @param viewGroup 父容器也就是activity的根布局
* @param tag
* @return
*/
public View getViewByTag(View viewGroup,Object tag){
return viewGroup.findViewWithTag(object);
}
/**
* 获取assets 中图片的方法
* @param fileName
* @return
*/
Bitmap getImageFromAssetsFile(String fileName)
{
Bitmap image = null;
AssetManager am = mcontext.getResources().getAssets();
try
{
InputStream is = am.open(assetsFile+fileName);
image = BitmapFactory.decodeStream(is);
is.close();
}
catch (IOException e)
{
e.printStackTrace();
}
return image;
}
}
来源:https://blog.csdn.net/ImTryCatchException/article/details/78486675


猜你喜欢
- 简介switch的新特性可是源远流长,早在JDK 12就以预览功能被引入了,最终在JDK 14成为了正式版本的功能:JEP 361: Swi
- 扫码抢实现读取二维码信息,本地扫码枪是外接写入设备,本质是监控读写输入,下面介绍下扫码设备读取支付二维码。1.引入扫码设备辅助类public
- 在C#中,数组由于是固定长度的,所以常常不能满足我们开发的需求。由于这种限制不方便,所以出现了ArrayList。ArrayList、Lis
- 本文所述为C#实现根据指定容器和控件名字获得控件的方法,在进行C#应用程序设计时有一定的借鉴价值。分享给大家供大家参考借鉴。具体实现方法如下
- Mybatis表现关联关系比hibernate简单,没有分那么细致one-to-many、many-to-one、one-to-one。而是
- spring配置不扫描service层原因我将contoller给springmvc进行扫描,然后其余所有交给spring扫描然后发现ser
- 一、 四种修饰符的说明public修饰符表示 公有 。此修饰符的范围最大。当不声明任何修饰符时,系统会默认使用此修饰符。internal修饰
- 一般项目做到后期,在测试的时候,需要在测试版本和正式版本之间进行频繁的切换,怎么办呢?土豪的话可以考虑使用两台机器,同时测试,然而为了方便测
- 使用python和java实现数独游戏,有比较才有收获哦。1、Python版#--coding:utf-8--import ra
- 前言作为 Android 开发者,想必多多少少要接触启动速度优化相关的事情,当用户越来越多,产品的功能也随着迭代越来越多,App 逐渐变得臃
- 我在5月份的时候就申请了洞态IAST企业版内测,算是比较早的一批用户了。聊聊几个我比较在意的问题,比如API接口覆盖率、第三方开源组件检测以
- 好久没有做web了,JSON目前比较流行,闲得没事,所以动手试试将对象序列化为JSON字符(尽管DotNet Framework
- 学习内容:1.普通参数2.pojo参数3.嵌套pojo4.数组参数5.集合参数6.解决中文乱码7.json数据传递参数案例分析:1.pom.
- 本文实例讲述了android动态布局之动态加入TextView和ListView的方法。分享给大家供大家参考。具体实现方法如下:packag
- 一、前言问题阐述:在某一场景下,我们的代码在 Service 实现相同,但却在 Controller 层访问时却希望不同的前缀可以访问。如下
- 一、Android Color设置1、在xml文件中想设置颜色直接设置background的属性或者其他的color属性。随便设置一个颜色如
- 杨辉三角的规律:1.每行的数据个数和在第几行一样。2.每行第一个数和最后一个数都是1.3.每行除了第一个数据和最后一个数据 其他数据的值等于
- 前言哎呀,妈呀,又出异常了!俗话说:“代码虐我千百遍,我待代码如初恋”。小Alan最近一直在忙着工作,已经很久没有写写东西来加深自己的理解了
- 在开发过程中有时需要将图片显示成圆角图片,一般我们可以通过在xml中设置drawable shape即可,但今天我给出另一种方法,用java
- 本文实例为大家分享了Android点击缩略图放大效果的具体代码,供大家参考,具体内容如下import android.animation.A