2009-12-31 71 views
53

我以爲我會很優雅,並使用string.xml文件來定義一些像異常消息的常量字符串。在strings.xml中,我點擊Add,選擇「String」選項(不是'String Array'),然後給它一個名稱和值。我很驚訝地看到,這個代碼不工作:Eclipse/Java - R.string中的值*返回int?

throw new Exception(R.string.MyExceptionMessage); 

而失敗,因爲R.string.MyExceptionMessage實際上是int類型的。我可以通過查看R.java來驗證該類型。我錯過了什麼?

回答

100

R類中的所有內容都是參考,因此它只是定義爲int

如果你的代碼中—運行或訪問—一個Android Context,你可以調用context.getString(R.string.my_exception_message)以獲得實際String值。

或者,對於像不需要翻譯的異常字符串之類的東西,因此不需要在Android資源.xml文件中定義,您可以將字符串作爲常量存儲在某種類型的StringConstants接口。這樣,您可以從實用程序類中引用可能無法訪問Context的字符串。

+8

Chris在兩個賬戶上都是正確的。 Context.getString加載你的字符串資源。但要小心把非本地化的東西放在那裏,因爲它會混淆你的字符串進行翻譯。我不認爲它很優雅,但必須將你的用戶界面字符串放在XML文件中而不是在代碼中。在某個時候,您會希望將您的應用分發到其他國家,並且將它們從代碼中移除將需要付出很大的努力。現在就做,並保存頭痛。我有一個在中國的分銷商,我只是把她的strings.xml發給翻譯,沒有任何努力。問候,Ari – BeMeCollective 2009-12-31 08:51:07

5

克里斯是對的。但是如果你想本地化Exception字符串呢。例如,你拋出一個異常,當你捕獲它時,你想向用戶顯示異常消息。我想將它們放在strings.xml中,但在同一時間,我不想因爲我認爲,如果你有一個例外可能是你不想使用此代碼

throw new Exception(context.getString(R.string.my_exception_message)) 

,你可以」 t使用一些額外的代碼來獲取異常消息。

我認爲唯一的解決辦法是宣佈此消息的靜態字符串在您的主要活動,並儘快將其初始化地(例如在onCreate()方法)是這樣的:

private static String my_exception_message; 

public onCreate() 
{ 
    my_exception_message = context.getString(R.string.my_exception_message); 
} 

所以當你拋出異常時,你已經準備好了本地化的消息。 你的想法是什麼?你可以想一些其他解決方案?

29

使用「getResources()。getString(id)」方法。

getResources().getString(R.string.title_activity) 

和繁榮,你有你的字符串。確保將該字符串存儲在values文件夾中的string.xml文件中。

+1

getResources()方法並不總是可用。 – 2017-06-08 00:02:25

+0

「無法解析方法getResources」 – moonvader 2017-07-22 16:15:01