java将属性练成字符串,Java中通过属性字符串名取属性内容
在Android開(kāi)發(fā)當(dāng)中資源的獲取其實(shí)是間接通過(guò)R文件進(jìn)行的,這個(gè)R文件就相當(dāng)于是一個(gè)地址列表,存放著每個(gè)資源的地址
那么如何快速高效的獲取就是這篇文章要分析的問(wèn)題
假設(shè)我們有一個(gè)圖片資源叫btn_bg
那么將一個(gè)按鈕背景設(shè)置為這個(gè)圖片的方式就是
btn.setBackgroundResource(R.drawable.btn_bg);
這里的R.drawable.btn_bg就是獲取圖片
但問(wèn)題來(lái)了,這個(gè)獲取圖片的方式是通過(guò)對(duì)象名獲取的,獲取一兩個(gè)可以這么處理
那么如果是多個(gè)圖片要設(shè)置到多個(gè)按鈕的話
例如按鈕的id分別是btn_0,btn_1,btn_2,btn_3,btn_4
圖片是btn_bg_0,btn_bg_1,btn_bg_2,btn_bg_4,btn_bg_4
很容易可以想到就是把按鈕和圖片都弄成List,然后循環(huán)
但是問(wèn)題又來(lái)了,這個(gè)按鈕要弄成List,就得每一個(gè)都findViewById
首先要聲明兩個(gè)List
List btns = new ArrayList(){ {
add((Button) findViewById(R.id.btn_0));
add((Button) findViewById(R.id.btn_1));
add((Button) findViewById(R.id.btn_2));
add((Button) findViewById(R.id.btn_3));
add((Button) findViewById(R.id.btn_4));
}};
List btn_bgs = new ArrayList(){ {
add(R.drawable.btn_bg_0);
add(R.drawable.btn_bg_1);
add(R.drawable.btn_bg_2);
add(R.drawable.btn_bg_3);
add(R.drawable.btn_bg_4);
}};
然后用的時(shí)候這樣用
for (int i = 0; i < 5; i ++) btns.get(i).setBackgroundResource(btn_bgs.get(i));
看似已經(jīng)很方便了,可是這里只有5個(gè)而且還是固定的內(nèi)容,如果是數(shù)量一多的話,再內(nèi)容如果是變化的,不是事先確定好的那該如何實(shí)現(xiàn)
看到這里可能有人會(huì)想了,這里的R.id.和R.drawable.是固定的,如果能否用字符串的"R.id.btn_0"去獲取靜態(tài)對(duì)象的R.id.btn_0,那可玩性就高多了
所以本文章的重點(diǎn)就在于如何用String去獲取Object
看我寫(xiě)法
List btns = new ArrayList(){ {
try {
for (int i = 0; i < 5; i ++)
add((Button) findViewById((int) R.id.class.getDeclaredField("btn_" + i).get(R.id.class)));
} catch (Exception e) {
// TODO: handle exception
Log.i("MainActivity", e.toString());
}
}};
List btn_bgs = new ArrayList(){ {
try {
for (int i = 0; i < 5; i ++)
add((int) R.drawable.class.getDeclaredField("btn_bg_" + i).get(R.drawable.class));
} catch (Exception e) {
// TODO: handle exception
Log.i("MainActivity", e.toString());
}
}};
使用上還是一樣,就是聲明的時(shí)候變化了,注意這里用了一句關(guān)鍵代碼
(int) R.id.class.getDeclaredField("btn_" + i).get(R.id.class))
在使用這句話的時(shí)候需要加入異常, 因?yàn)橛肧tring變量去找對(duì)象的屬性有可能會(huì)出現(xiàn)找不到的情況,只要發(fā)現(xiàn)報(bào)錯(cuò)信息是java.lang.NoSuchFieldException: xxx一看就知道是找不到名為xxx的屬性
那這句關(guān)鍵代碼該如何靈活變換呢,其實(shí)很簡(jiǎn)單,這里出現(xiàn)兩次的R.id.class,根據(jù)你要獲取的對(duì)象換成對(duì)應(yīng)的類(lèi)即可
再一個(gè)就是getDeclaredField方法里面的內(nèi)容,這里面的內(nèi)容位String類(lèi)型,上面的例子是有規(guī)律的01234,所以很容易循環(huán)出來(lái)
有人會(huì)問(wèn)了,如果是不規(guī)律的情況怎么辦,如果不規(guī)律的話那就直接用一個(gè)String[]數(shù)組把變量放進(jìn)去,然后循環(huán),以后如果有變化只要改變數(shù)組即可,一勞永逸
也可以把這里面的內(nèi)容通過(guò)參數(shù)傳進(jìn)來(lái),傳什么進(jìn)來(lái)他就可以獲取什么,只要能獲取得到的話,這里可發(fā)揮的空間就很大了,對(duì)應(yīng)的最前面要加上強(qiáng)制類(lèi)型轉(zhuǎn)換
整個(gè)思路大概就這樣,主要一個(gè)思想就是只要是通過(guò)字符串去獲取屬性的情況都可以采用這個(gè)方法獲取.
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的java将属性练成字符串,Java中通过属性字符串名取属性内容的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oracle关联分组查询,oracle中
- 下一篇: java美元兑换,(Java实现) 美元