1. 程式人生 > >Android 依據變數來獲得資源R中的id值

Android 依據變數來獲得資源R中的id值

Android 根據變數來獲得資源R中的id值
我們平時獲取資源是通過 findViewById 方法進行的,比如我們常在onCreate方法中使用這樣的語句:

  btnChecked=(ImageView)findViewById(R.id.imgCheck);


findViewById是我們獲取layout中各種View 物件比如按鈕、標籤、ListView和ImageView的便利方法。顧名思義,它需要一個int引數:資源id。

資源id非常有用。Android回自動為每個位於res目錄下的資源分配id,包括各種圖片檔案、xml文中的”@+id”物件。res的子目錄幾乎總是固定的,比如每次都能見到的:drawable-xxxx、layout、values,以及不常見的:anim、xml、row、color。


Android教科書上告訴你:

res/drawable/用來存放圖片檔案;
res/layout/用來存放佈局定義檔案;
res/values/用來存放一些變數、引數等檔案。

這都是我們已經知道的。此外,Android會為res目錄下的所有資源分配id,其主要的分配原則是:

drawable中的圖片檔案總是每個檔案一個資源id。
Xml檔案中每個使用android:id=”@+id/xxx”的view都會被分配一個未用的資源id。

其他更復雜的規則也許每個人都會補充一些。

在 ADK 的API 中,有許多方法其實都會使用資源id作為引數,比如 getDrawable 方法 :

  getResources().getDrawable(R.drawable.sendsms_bk));


從字面上看,getResouces方法返回一個android.content.res.Resources物件。

getDrawalbe方法返回一個Drawable物件,我們知道這就是一張圖片。

getDrawable方法使用的引數就是資源id。

但是,這些int型的資源id到底是些什麼數字?或者它們都放在哪裡。如果你夠細心,你可以在gen目錄的R.java檔案中找到它們。每個16進位制整型id都有一個很O-O 的屬性名字,它們都是public static final的,建議你不要手動去修改它們。這些資源id位於不同類層次結構中,你仔細看一看,會發現其中的一些規律,比如,drawable類中包含資源id其實代表了res/drawable目錄中的圖片檔案;layout類中包含的資源id其實是代表了在res/layout目錄中的xml檔案 ;id類中包含的資源id其實是代表了佈局xml檔案中使用了 android:id=”@+id/xxx”的widget物件——當然如果你使用的是”@+Tyre/xxx”,則Android編譯時會在R.java 中建立一個叫做 Tyre 的類。


通過上面的瞭解,我們發現資源id就是以“R.”開頭的變數或屬性——因為它都定義在R類中——這個類跟android.R不是同一個R,它們不在同一個包層次中。前者是定義了android框架自己的資源,比如:android.R.layout.simple_expandable_list_item_1、android.R.layout.simple_expandable_list_item_2。這些資源你使用過嗎?有時間不妨試試。而另一個R就是我們自己的R了,定義了我們自己的資源id。我們可以用面向物件的R.xxx.yyy的方式使用資源id,當然也可以直接用16進位制數來使用它們。

資源id在Android中是如此重要,因此我們只要獲得了資源id,即可獲得資源。因為某些情況下,我們不能使用某個常量作為資源id(因為我們想用一個變數代替它),所以只能採用兩種方式動態獲取資源id:

1、反射

java的反射是如此強大,以至於我們在走投無路時總是想起它。我們來看一段程式碼:

  try{ Field field=R.drawable.class.getField(type); int i= field.getInt(new R.drawable()); Log.d(tag,i+""); return i; }catch(Exception e){ Log.e(tag,e.toString()); return R.drawable.unknow; }


type是一個變數,他的可能值會是“close”、“edit”、“icon”等。我們通過java的反射類Field 去訪問 R.drawable 類下面的某個欄位。實際上,我們知道在R.drawable 下的欄位就是 res.drawable-xxxx 目錄下的圖片檔案的資源id。因此執行上面的這段程式碼,其實就是通過一個字串去獲取對應圖片檔案的資源id。比如,當 type 的值為“icon”時,上面的程式碼會獲得res.drawable-xxxx目錄下的 icon.png 圖片檔案的資源id並返回給我們。我們通過資源 id 來把圖片顯示在ImageView中就是順理成章的事了。

2、使用Resources 類的 getIdentifier方法

使用反射畢竟還是麻煩。如果同樣的事情用 android.content.res.Resources 類來幹,就是兩句話而已:

  Resources res=getResources(); return res.getIdentifier(type,"drawable",getPackageName());


getResources方法是來自於contenxt(也就是Activity類),它直接可以返回一個Resouces物件。而Resouces的getIdentifier方法可以返回R.java中的任何資源id,當然,你必須指定3個引數:欄位名,類名,包名。包名指定了的 全限定名的包名部分,如果R 的全限定名為 android.R 或者 com.company.R,則包名在這裡就是“android”或“com.company”。getPackageName其實是this.getPackageName(),它直接返回本類的包名。

類名則是資源所屬的類。比如我們知道的,在R.java 類中的幾個固定的類:drawable、id、string、layout等,在它們下邊又定義了許多資源id。

欄位名則是資源id的名字。比如這個資源id定義: public static final int del=0x7f020002;

del就是一個資源id的名字,0x7f020002則是它的16進位制值。

通過3個引數,getIdentifier 方法就可以通過比較動態的方式獲得資源id。

相關推薦

Android 依據變數獲得資源Rid

Android 根據變數來獲得資源R中的id值我們平時獲取資源是通過 findViewById 方法進行的,比如我們常在onCreate方法中使用這樣的語句:   btnChecked=(ImageView)findViewById(R.id.imgCheck); find

R異常檢測

data1=complete.cases(selectdata) #布林判斷 # true代表1,false代表0 sum(complete.cases(selectdata)) #完整資料200條 sum(!complete.cases(selectdata)) #不完整資料1條 m

使用Android DocumentType處理Strings.xml資源,實現xml內拼接

Use Android DocumentType  to handle String resources問題是這樣的:兩個string,string a是“賬號郵箱”,string b是“賬號郵箱:”,有沒有方法可以,直接在xml中,把string a和“:”拼接起來組成b。

利用typename使用模板型別引數定義模板型別的型別的變數

直接上程式碼。 #include <iostream> template<typename T> void PrintStlContainer(T const& co

Android如何修改編譯的資源ID(預設是0x7F...可以隨意改成0x02~0x7E)

一、技術準備今天我們來看一下如何修改Android中編譯時的資源Id的值,在講解這內容之前,我們需要先了解一下Android中的資源編譯之後的結構和編譯過程,這裡就不多說了,具體可以檢視這篇文章:這篇文章中,介紹瞭如何解析Android中編譯之後的resource.arsc檔

arm處理器a5 a8 a9,v6 v7,arm7 arm9 arm11都是依據什麼分類的

ARM處理器發展這麼多年,有很多架構,很多不同的核心 架構有armv1 v2 v3 v4 v5 v6 v7 核心太多了,比如armv1對應的是arm1,armv5對應的arm9,armv6對應的arm11,armv7對應的cortex(比如A8 A9都屬於cortex架構)

android獲得字串陣列出現次數最多的字串

public static String findMaxString(String[] arr) { Map<Integer, String> map = new H

Android使用全域性變數傳遞資料

在Android裡最通用的方式是通過全域性物件來傳遞資料。除非是Android應用清除記憶體,否則全域性物件一直可以訪問。通過getApplication()這個方法。   1.先建立一個共享類,繼承Application   2.配置AndroidManifest.xml檔案

HTMLimg標籤src路徑的需要設定成一個變數表示

在Java開發中,有時候會遇到在顯示圖片時不需要給圖片的src路徑設定成固定的,而是需要寫入從後臺資料庫傳入的路徑變數,下面給出瞭解決此問題的方法。<script> var pictureUrl = data.url;//後臺傳入的圖片路徑,url指的是資料

Android Studio專案打包AAR,以及專案嵌入AAR檔案,過程出現R檔案報錯的坑

這幾天接到新需求,將ec專案嵌入到公司as總專案中,第一次搞,弄了好久,才搞定,入正題. 首先將ec專案匯入as中,解決各種報錯,比如png圖片,.9圖,以及各種不規範的log,吐死之類的,不細說,這個不難. 將專案遷移到AS中,成功執行,OK,開始打包AAR,打包AAR不

android通過反射獲得資源資料

import android.content.Context; import android.content.res.Resources; import com.zlongame.utils.LogUtils.PDLog; /** * 在不能使用id的

在C# 不使用 第三方變數 交換兩個變數

1) 算術運算 簡單來說,就是通過普通的+和-運算來實現。程式碼如下: int a,b; a=10;b=12; a=b-a; //a=2;b=12 b=b-a; //a=2;b=10 a=b+a; //a=10;b=10 通過以上運算,a和b中的值就進行了交換。表面上看起來

jenkins使用指令碼節省資源空間和使用shell提取檔名或目錄名的方法

環境 Linux:5.5 jenkins:2.5 場景 由於公司的專案不斷增多,導致jenkins拉取的專案也就越來越多,專案的程式碼、jar包、資原始檔,佔用了很多磁碟空間;而且有些資源是重複的! 比如專案的jar包就是重複的。 當專案部署到j

JS小技巧 前臺JS程式碼獲得後臺頁面變數

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="test"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//

EclipseAndroid專案編譯後沒有生成R檔案的兩種原因

筆者在用Eclipse寫Android專案,時常發生R檔案錯誤。 對此筆者總結了兩種原因:一種是res目錄下的檔案有Eclipse檢查不出的錯誤,但不能通過編譯,因此沒有生成R檔案。還有一種情況是已經

Android 通過resource名稱或者layout定義的id name 去獲取R.javaid,得到控制元件

private int getIdFromR(String strId, String type, String packageName) {         Resources resources

Android為什麼R.string.Id 在setText顯示的是一串數字

在TextView中經常使用setText()通過ID的方式來顯示字串,比如: setText(R.string.hello_world); 在我們編寫Android程式的時候,很有可能會使用如下程

Java泛型 通過反射獲得方法引數變數類名和泛型

通過反射獲得方法引數中的變數類名和泛型 package test; import java.lang.reflect.Method; import java.lang.reflect.Paramet

變數獲得實體類一個不確定名稱的

UserInfo _UserInfo = new UserInfo(); var property = _UserInfo.GetType().GetProperty(變數名稱); var oldvalue = property.GetValue(_UserInfo, nu

Android 當打開“開發人員模式”的“不保留活動”後,程序應當怎麽保持正常執行

京東 java 天才 以及 click get message 查看源 create Android 當打開“開發人員模式”中的“不保留活動”後,程序應當怎麽保持正常執行咧。。? 在這幾天,我一直在糾結這個問題。從發現,程序出現這個問題,是由於“開發人員模式”中的“不保