java将属性练成字符串,Java中通过属性字符串名取属性内容
在Android開發當中資源的獲取其實是間接通過R文件進行的,這個R文件就相當于是一個地址列表,存放著每個資源的地址
那么如何快速高效的獲取就是這篇文章要分析的問題
假設我們有一個圖片資源叫btn_bg
那么將一個按鈕背景設置為這個圖片的方式就是
btn.setBackgroundResource(R.drawable.btn_bg);
這里的R.drawable.btn_bg就是獲取圖片
但問題來了,這個獲取圖片的方式是通過對象名獲取的,獲取一兩個可以這么處理
那么如果是多個圖片要設置到多個按鈕的話
例如按鈕的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,然后循環
但是問題又來了,這個按鈕要弄成List,就得每一個都findViewById
首先要聲明兩個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);
}};
然后用的時候這樣用
for (int i = 0; i < 5; i ++) btns.get(i).setBackgroundResource(btn_bgs.get(i));
看似已經很方便了,可是這里只有5個而且還是固定的內容,如果是數量一多的話,再內容如果是變化的,不是事先確定好的那該如何實現
看到這里可能有人會想了,這里的R.id.和R.drawable.是固定的,如果能否用字符串的"R.id.btn_0"去獲取靜態對象的R.id.btn_0,那可玩性就高多了
所以本文章的重點就在于如何用String去獲取Object
看我寫法
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());
}
}};
使用上還是一樣,就是聲明的時候變化了,注意這里用了一句關鍵代碼
(int) R.id.class.getDeclaredField("btn_" + i).get(R.id.class))
在使用這句話的時候需要加入異常, 因為用String變量去找對象的屬性有可能會出現找不到的情況,只要發現報錯信息是java.lang.NoSuchFieldException: xxx一看就知道是找不到名為xxx的屬性
那這句關鍵代碼該如何靈活變換呢,其實很簡單,這里出現兩次的R.id.class,根據你要獲取的對象換成對應的類即可
再一個就是getDeclaredField方法里面的內容,這里面的內容位String類型,上面的例子是有規律的01234,所以很容易循環出來
有人會問了,如果是不規律的情況怎么辦,如果不規律的話那就直接用一個String[]數組把變量放進去,然后循環,以后如果有變化只要改變數組即可,一勞永逸
也可以把這里面的內容通過參數傳進來,傳什么進來他就可以獲取什么,只要能獲取得到的話,這里可發揮的空間就很大了,對應的最前面要加上強制類型轉換
整個思路大概就這樣,主要一個思想就是只要是通過字符串去獲取屬性的情況都可以采用這個方法獲取.
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java将属性练成字符串,Java中通过属性字符串名取属性内容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle关联分组查询,oracle中
- 下一篇: python基本对象类型