Android加载Assets目录中Xml布局文件
最近由于项目开发使用到了动态布局,因为打包sdk,sdk这块activity需要一些layout文件。而做过sdk开发的小伙伴应该知道,layout文件是不能打包到jar中的。当然了aar除外。由于项目使用的还是jar包,所以怎么解决layout文件是个问题,一开始想到的办法就是把layout文件发给客户。但是这种方法显然不太合适后来就发现了Android其实提供了一个方法可以加载xml布局文件,就是使用inflate(XmlPullParserparser,ViewGrouproot)这个方法,网上找了大批的文章,其中还是找到了两篇简单描写了下这个解析的过程但是在使用过程中还是出现了几个问题:
1如何拿到XmlPullParser对象
拿到这个对象倒是不难我们通过AssetsManger就可以轻易获取XmlResourceParseropenXmlResourceParser(StringfileName)
但是注意这里有个问题就是filename要加上”assets\”前缀不然会报FileNotFound异常
2发现解析不了xml布局文件
openxmlresourceparser方法报错,为什么呢。查到资料是因为这个方法只能解析编译后的xml文件,那么什么事编译后的xml文件,就是生成的apk解压后拿到的xml就是编译后的。所以我们放在assets中的xml都要是编译后的文件。目前还没有找到Android有别的工具可以专门编译xml文件
3解析到了view如何拿到里面的子view通过id不行啊
这是肯定的不是在layout文件夹下的不会有id索引所以你不能通过id来find。那么如何拿到子view,后来发现了有人解决这个问题就是通过findViewWithTag这个方法可以通过xmlview下配置的tag来获取
以上问题解决后就完美拿到了xml的布局view文件可以动态设置给activity了。下面我把源码贴上来需要的朋友可以参考下。
importandroid.content.Context; importandroid.content.res.AssetManager; importandroid.content.res.XmlResourceParser; importandroid.graphics.Bitmap; importandroid.graphics.BitmapFactory; importandroid.view.LayoutInflater; importandroid.view.View; importjava.io.IOException; importjava.io.InputStream; /** *Createdbyyugeon2017/11/8. */ publicclassAssetsViewHelper{ privatestaticContextmcontext; privatestaticAssetsViewHelperassetsViewHelper; /** *assets目录前缀 */ privatestaticStringassetsFile="assets/"; privateAssetsViewHelper(){ } publicstaticAssetsViewHelperwidth(Contextcontext){ mcontext=context.getApplicationContext(); if(assetsViewHelper==null){ synchronized(AssetsViewHelper.class){ if(assetsViewHelper==null){ assetsViewHelper=newAssetsViewHelper(); } } } returnassetsViewHelper; } /** *获取layout方法 *@paramfilename *@return */ publicViewgetAssetsLayout(Stringfilename){ AssetManageram=mcontext.getResources().getAssets(); try{ XmlResourceParserparser=am.openXmlResourceParser(assetsFile+"activity_main.xml"); LayoutInflaterinflater=(LayoutInflater)mcontext.getSystemService(mcontext.LAYOUT_INFLATER_SERVICE); Viewinflate=inflater.inflate(parser,null); returninflate; }catch(IOExceptione){ e.printStackTrace(); returnnull; } } /** *根据tag获取view对象 *@paramviewGroup父容器也就是activity的根布局 *@paramtag *@return */ publicViewgetViewByTag(ViewviewGroup,Objecttag){ returnviewGroup.findViewWithTag(object); } /** *获取assets中图片的方法 *@paramfileName *@return */ BitmapgetImageFromAssetsFile(StringfileName) { Bitmapimage=null; AssetManageram=mcontext.getResources().getAssets(); try { InputStreamis=am.open(assetsFile+fileName); image=BitmapFactory.decodeStream(is); is.close(); } catch(IOExceptione) { e.printStackTrace(); } returnimage; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。