Android中實(shí)現(xiàn)自動(dòng)生成布局View的初始化代碼方法
在android開(kāi)發(fā)過(guò)程中,界面布局是及其重要的,但同時(shí)也是復(fù)雜。有的時(shí)候我們急于實(shí)際運(yùn)行查看布局效果。但是android的編譯速度我實(shí)在不想吐槽啥,尤其在布局越來(lái)越復(fù)雜,項(xiàng)目越來(lái)越大,資源文件越來(lái)越多的情況下。
尤其是是android的view的初始化,findViewbyId 完全是體力活,我們完全可以根據(jù)布局文件自動(dòng)生成View的初始化代碼。
首先聲明:
1.這是及其容易做到的,實(shí)用性性一般,但是在復(fù)雜布局和首次寫(xiě)初始化View代碼的時(shí)候及其好用。
2.只能生成有id標(biāo)簽的view的初始化代碼。
思路
其實(shí)很簡(jiǎn)單,就是解析layout 布局文件,把有id屬性的標(biāo)簽的一些信息(標(biāo)簽類型,id名稱等)存起來(lái),然后根據(jù)這些信息生成固定的代碼。
實(shí)現(xiàn)
直接上代碼,首先是對(duì)layout文件的解析,把解析出來(lái)的信息放在一個(gè)list中
public class SaxHander extends DefaultHandler {
private List<IdNamePair> map = new ArrayList<IdNamePair>();
@Override
public void startDocument() throws SAXException {
super.startDocument();
map.clear();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
// System.out.println("-------------------------------------");
String tempid = attributes.getValue("id");
String id = null;
if (tempid != null) {
String[] ss = tempid.split("/");
if (ss != null && ss.length == 2) {
id = ss[1];
}
}
if (id != null) {
map.add(new IdNamePair(id, qName));
}
// System.out.println(id);
// System.out.println(qName);
}
public List<IdNamePair> getRes() {
return map;
}
}
public class IdNamePair {
private String id;
private String name;
/**
* @param id
* @param name
*/
public IdNamePair(String id, String name) {
super();
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后一點(diǎn)點(diǎn)的拼接代碼
public class ViewCodeUtil {
static SAXParserFactory saxfac = SAXParserFactory.newInstance();
static SaxHander mySax = new SaxHander();
public static String getCode(String resFileName){
File f = new File(resFileName);
if (!f.exists()) {
return null;
}
try {
saxfac.newSAXParser().parse(f,mySax);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
List<IdNamePair> res = mySax.getRes();
StringBuilder sb = new StringBuilder();
StringBuilder sb1 = new StringBuilder();
sb.append("http://---------- 開(kāi)始定義域--------------\n");
sb1.append("http://----------開(kāi)始initView方法------------------\n");
sb1.append("public void initView() { \n");
for (IdNamePair idNamePair : res) {
sb.append(" private "+idNamePair.getName()+" "+ idNamePair.getId()+idNamePair.getName()+";\n");
sb1.append(" "+idNamePair.getId()+idNamePair.getName()+" = ("+idNamePair.getName()+")findViewById(R.id."+idNamePair.getId()+");\n");
}
sb1.append("}\n");
// System.out.println(sb.toString());
// System.out.println(sb1.toString());
return sb.append(sb1.toString()).toString();
}
最后是測(cè)試類main方法。
public class Test {
private static final String[] layoutFiles ={"./res/g_ruler.xml","./res/report.xml"};
public static void main(String[] args) {
if (args!=null) {
for (int i = 0; i < args.length; i++) {
System.out.println("");
System.out.println("---------"+args[i]+"----------");
System.out.println(ViewCodeUtil.getCode(args[i]));
}
}
for (int i = 0; i < layoutFiles.length; i++) {
System.out.println("");
System.out.println("http://---------"+layoutFiles[i]+"----------");
System.out.println(ViewCodeUtil.getCode(layoutFiles[i]));
}
}
}
- Android 利用反射+try catch實(shí)現(xiàn)sdk按需引入依賴庫(kù)的方法
- 解決Android Studio sdk emulator directory is missing問(wèn)題
- Android Studio下載、安裝和配置+SDK+tools下載(無(wú)敵超級(jí)詳細(xì)版本)
- Android Studio報(bào)錯(cuò)unable to access android sdk add-on list解決方案
- Android Studio設(shè)置或修改Android SDK路徑方法
- Android4.X中SIM卡信息初始化過(guò)程詳解
- Android使用ContentProvider初始化SDK庫(kù)方案小結(jié)
相關(guān)文章
Android ViewPager相冊(cè)橫向移動(dòng)的實(shí)現(xiàn)方法
本篇文章小編為大家介紹,Android ViewPager相冊(cè)橫向移動(dòng)的實(shí)現(xiàn)方法。需要的朋友參考下2013-04-04Android開(kāi)發(fā)之時(shí)間日期組件用法實(shí)例
這篇文章主要介紹了Android開(kāi)發(fā)之時(shí)間日期組件用法,主要介紹了TimePicker和DatePicker組件,對(duì)于Android程序開(kāi)發(fā)有不錯(cuò)的借鑒價(jià)值,需要的朋友可以參考下2014-08-08Android 實(shí)現(xiàn)手機(jī)接通電話后振動(dòng)提示的功能
本文主要介紹Android 實(shí)現(xiàn)手機(jī)接通電話后振動(dòng)提示的功能,這里整理了詳細(xì)的相關(guān)資料,并附有示例代碼,有需要的朋友可以參考下2016-08-08Android開(kāi)發(fā)實(shí)現(xiàn)標(biāo)題隨scrollview滑動(dòng)變色的方法詳解
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)標(biāo)題隨scrollview滑動(dòng)變色的方法,涉及Android針對(duì)滑動(dòng)事件的響應(yīng)、界面布局、屬性動(dòng)態(tài)變換等相關(guān)操作技巧,需要的朋友可以參考下2017-11-11Android 破解視頻App去除廣告功能詳解及解決辦法總結(jié)
這篇文章主要介紹了Android 破解視頻App去除廣告功能詳解及解決辦法總結(jié)的相關(guān)資料,這里對(duì)視頻播放原理及破解去除廣告幾種方法進(jìn)行了總結(jié),需要的朋友可以參考下2016-12-12Android模擬器對(duì)應(yīng)的電腦快捷鍵說(shuō)明
Android模擬器對(duì)應(yīng)的電腦快捷鍵說(shuō)明,需要的朋友可以參考一下2013-06-06Android?RecyclerView實(shí)現(xiàn)九宮格效果
這篇文章主要為大家詳細(xì)介紹了Android?RecyclerView實(shí)現(xiàn)九宮格效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06Android實(shí)現(xiàn)截屏方式整理(總結(jié))
本篇文章主要介紹了Android 截屏方式整理(總結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07Android FrameWork之SytemServer進(jìn)程fork示例
這篇文章主要為大家介紹了Android FrameWork之SytemServer進(jìn)程fork示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07