Android加載Assets目錄中Xml布局文件
最近由于項目開發(fā)使用到了動態(tài)布局,因為打包sdk ,sdk 這塊activity 需要一些layout 文件 。而做過sdk 開發(fā)的小伙伴應(yīng)該知道,layout 文件是不能打包到j(luò)ar 中的。當(dāng)然了aar 除外。由于項目使用的還是jar包,所以怎么解決layout文件是個問題,一開始想到的辦法就是把layout 文件發(fā)給客戶。但是這種方法顯然不太合適后來就發(fā)現(xiàn)了Android 其實提供了一個方法可以加載xml布局文件,就是使用inflate(XmlPullParser parser, ViewGroup root)這個方法,網(wǎng)上找了大批的文章,其中還是找到了兩篇簡單描寫了下這個解析的過程但是在使用過程中還是出現(xiàn)了幾個問題 :
1 如何拿到XmlPullParser 對象
拿到這個對象倒是不難我們通過 AssetsManger 就可以輕易獲取XmlResourceParser openXmlResourceParser(String fileName)
但是注意這里有個問題就是filename 要加上”assets\”前綴不然會報 FileNotFound異常
2 發(fā)現(xiàn)解析不了xml 布局文件
openxmlresourceparser 方法報錯,為什么呢。查到資料是因為這個方法只能解析編譯后的xml文件,那么什么事編譯后的xml文件,就是生成的apk 解壓后 拿到的xml就是編譯后的。所以我們放在assets 中的xml 都要是編譯后的文件。目前還沒有找到Android有別的工具可以專門編譯xml 文件
3 解析到了view 如何拿到里面的子view 通過id 不行啊
這是肯定的不是在layout文件夾下的不會有id 索引所以你不能通過id 來find 。那么如何拿到子view ,后來發(fā)現(xiàn)了有人解決這個問題就是通過findViewWithTag 這個方法可以通過xml view 下配置的tag 來獲取
以上問題解決后就完美拿到了xml 的布局view 文件 可以動態(tài)設(shè)置給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;
}
}
/**
* 根據(jù) 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;
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android復(fù)制assets文件到SD卡
- Android實現(xiàn)復(fù)制Assets文件到SD卡
- 詳解vue2.0 資源文件assets和static的區(qū)別
- iOS開發(fā)之AssetsLibrary框架使用詳解
- Android studio 添加assets文件夾的方法
- 詳解Vue-cli中的靜態(tài)資源管理(src/assets和static/的區(qū)別)
- vue2.0 資源文件assets和static的區(qū)別詳解
- Android開發(fā)實現(xiàn)讀取Assets下文件及文件寫入存儲卡的方法
- android讀取assets中Excel表格并顯示
- Android獲取其他應(yīng)用中的assets資源
相關(guān)文章
Windows下搭建Flutter開發(fā)環(huán)境
這篇文章介紹了Windows下搭建Flutter開發(fā)環(huán)境的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-11-11
怎么發(fā)布打包并發(fā)布自己的Android應(yīng)用(APP)
前面我為大家講的都是關(guān)于Android開發(fā)方面的知識點和技術(shù),不少朋友可能會感到疑惑--究竟我該怎么打包、發(fā)布自己開發(fā)的APP,怎樣將我的APP放到網(wǎng)上工別人下載,怎樣保證我的APP安全及版權(quán)問題呢2013-11-11
Android編程圖片加載類ImageLoader定義與用法實例分析
這篇文章主要介紹了Android編程圖片加載類ImageLoader定義與用法,結(jié)合實例形式分析了Android圖片加載類ImageLoader的功能、定義、使用方法及相關(guān)操作注意事項,代碼中備有較為詳盡的注釋便于理解,需要的朋友可以參考下2017-12-12
Flutter 包管理器和資源管理使用學(xué)習(xí)
這篇文章主要為大家介紹了Flutter 包管理器和資源管理使用學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
詳解Android?Flutter如何使用相機實現(xiàn)拍攝照片
在app中使用相機肯定是再平常不過的一項事情了,相機肯定涉及到了底層原生代碼的調(diào)用,那么在flutter中如何快速簡單的使用上相機的功能呢?一起來看看吧2023-04-04
Android性能優(yōu)化之利用Rxlifecycle解決RxJava內(nèi)存泄漏詳解
RxJava作為一種響應(yīng)式編程框架,是目前編程界網(wǎng)紅,可謂是家喻戶曉,其簡潔的編碼風(fēng)格、易用易讀的鏈式方法調(diào)用、強大的異步支持等使得RxJava被廣泛使用。2017-01-01

