Android加載Assets目錄中Xml布局文件
最近由于項(xiàng)目開發(fā)使用到了動(dòng)態(tài)布局,因?yàn)榇虬黶dk ,sdk 這塊activity 需要一些layout 文件 。而做過sdk 開發(fā)的小伙伴應(yīng)該知道,layout 文件是不能打包到j(luò)ar 中的。當(dāng)然了aar 除外。由于項(xiàng)目使用的還是jar包,所以怎么解決layout文件是個(gè)問題,一開始想到的辦法就是把layout 文件發(fā)給客戶。但是這種方法顯然不太合適后來就發(fā)現(xiàn)了Android 其實(shí)提供了一個(gè)方法可以加載xml布局文件,就是使用inflate(XmlPullParser parser, ViewGroup root)這個(gè)方法,網(wǎng)上找了大批的文章,其中還是找到了兩篇簡(jiǎn)單描寫了下這個(gè)解析的過程但是在使用過程中還是出現(xiàn)了幾個(gè)問題 :
1 如何拿到XmlPullParser 對(duì)象
拿到這個(gè)對(duì)象倒是不難我們通過 AssetsManger 就可以輕易獲取XmlResourceParser openXmlResourceParser(String fileName)
但是注意這里有個(gè)問題就是filename 要加上”assets\”前綴不然會(huì)報(bào) FileNotFound異常
2 發(fā)現(xiàn)解析不了xml 布局文件
openxmlresourceparser 方法報(bào)錯(cuò),為什么呢。查到資料是因?yàn)檫@個(gè)方法只能解析編譯后的xml文件,那么什么事編譯后的xml文件,就是生成的apk 解壓后 拿到的xml就是編譯后的。所以我們放在assets 中的xml 都要是編譯后的文件。目前還沒有找到Android有別的工具可以專門編譯xml 文件
3 解析到了view 如何拿到里面的子view 通過id 不行啊
這是肯定的不是在layout文件夾下的不會(huì)有id 索引所以你不能通過id 來find 。那么如何拿到子view ,后來發(fā)現(xiàn)了有人解決這個(gè)問題就是通過findViewWithTag 這個(gè)方法可以通過xml view 下配置的tag 來獲取
以上問題解決后就完美拿到了xml 的布局view 文件 可以動(dòng)態(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 對(duì)象
* @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;
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android復(fù)制assets文件到SD卡
- Android實(shí)現(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ā)實(shí)現(xiàn)讀取Assets下文件及文件寫入存儲(chǔ)卡的方法
- android讀取assets中Excel表格并顯示
- Android獲取其他應(yīng)用中的assets資源
相關(guān)文章
Kotlin協(xié)程低級(jí)api startCoroutine與ContinuationInterceptor
這篇文章主要為大家介紹了Kotlin協(xié)程低級(jí)api startCoroutine與ContinuationInterceptor示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Android開發(fā)實(shí)現(xiàn)根據(jù)包名判斷App運(yùn)行狀態(tài)的方法
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)根據(jù)包名判斷App運(yùn)行狀態(tài)的方法,結(jié)合實(shí)例形式分析了Android結(jié)合包名判斷app運(yùn)行狀態(tài)的方法,需要的朋友可以參考下2017-11-11
舉例講解Android應(yīng)用開發(fā)中OTTO框架的基本使用
這篇文章主要介紹了Android應(yīng)用開發(fā)中OTTO框架的基本使用講解,文中舉了創(chuàng)建一個(gè)單例模式的應(yīng)用例子,需要的朋友可以參考下2016-02-02
Android 中SwipeRefreshLayout與ViewPager滑動(dòng)事件沖突解決方法
這篇文章主要介紹了Android 中SwipeRefreshLayout與ViewPager滑動(dòng)事件沖突解決方法的相關(guān)資料,需要的朋友可以參考下2017-04-04
Android RadioGroup 設(shè)置某一個(gè)選中或者不可選中的方法
下面小編就為大家?guī)硪黄狝ndroid RadioGroup 設(shè)置某一個(gè)選中或者不可選中的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
Kotlin?掛起函數(shù)CPS轉(zhuǎn)換原理解析
這篇文章主要為大家介紹了Kotlin?掛起函數(shù)CPS轉(zhuǎn)換原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
AndroidStuio插件開發(fā)適用于jetbrains全家桶
這篇文章主要介紹了AndroidStuio插件開發(fā)適用于jetbrains全家桶,本文通過實(shí)例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
Android開發(fā)實(shí)現(xiàn)刪除聯(lián)系人通話記錄的方法
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)刪除聯(lián)系人通話記錄的方法,較為詳細(xì)的分析了Android刪除通話記錄的原理、步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-10-10

