Android:如何從資源中獲取字符串?


我想有兩種語言的用戶界面和單獨的字符串值為他們在我的資源文件res\values\strings.xml

<string name="tab_Books_en">Books</string>
<string name="tab_Quotes_en">Quotes</string>
<string name="tab_Questions_en">Questions</string>
<string name="tab_Notes_en">Notes</string>
<string name="tab_Bookmarks_en">Bookmarks</string>

<string name="tab_Books_ru">Книги</string>
<string name="tab_Quotes_ru">Цитаты</string>
<string name="tab_Questions_ru">Вопросы</string>
<string name="tab_Notes_ru">Заметки</string>
<string name="tab_Bookmarks_ru">Закладки</string>

現在我需要在我的應用程序中動態地檢索這些值:

spec.setContent(R.id.tabPage1);
String pack = getPackageName();
String id = "tab_Books_" + Central.lang;
int i = Central.Res.getIdentifier(id, "string", pack);
String str = Central.Res.getString(i);

我的問題是, i = 0 。 這個代碼是從這個鏈接

為什麼它不起作用?



Answers



您引用的鏈接似乎與在運行時生成的字符串一起工作。 strings.xml中的字符串不會在運行時創建。 你可以通過

String mystring = getResources().getString(R.string.mystring);

getResources()Context類的一個方法。 如果你在一個ActivityService (擴展上下文)內,你可以像這個片段一樣使用它。

還要注意整個語言的依賴關係可以由android框架來處理 。 只需為每種語言創建不同的文件夾。 如果英語是您的默認語言,只需將英文字符串放入res/values/strings.xml 。 然後創建一個新的文件夾values-ru ,並將具有相同名稱的俄語字符串放到res/values-ru/strings.xml 。 從這一點上,android選擇正確的一個取決於你的設備語言環境,無論是當你調用getString()或通過@string/mystring引用XML中的@string/mystring 。 來自res/values/strings.xml是後備文件,如果你沒有覆蓋用戶區域的文件夾,這個文件夾將被用作默認值。

請參閱本地化提供資源以獲取更多信息。




我也有同樣的問題。 但是下面的代碼適用於我:驗證你的packageName是否正確。 你必須參考你的Android應用程序的根包。

private String getStringResourceByName(String aString) {
      String packageName = getPackageName();
      int resId = getResources().getIdentifier(aString, "string", packageName);
      return getString(resId);
    }



不僅來自活動:

    public static String byIdName(Context context, String name) {
        Resources res = context.getResources();
        return res.getString(res.getIdentifier(name, "string", context.getPackageName()));
    }



getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName()))



我會添加一些東西給leonvian的解決方案,所以如果有任何機會在資源中找不到字符串(返回值0,這不是一個有效的資源代碼),該函數可能會返回一些東西:

private String getStringResourceByName(String aString) {
    String packageName = getPackageName();
    int resId = getResources()
            .getIdentifier(aString, "string", packageName);
    if (resId == 0) {
        return aString;
    } else {
        return getString(resId);
    }
}






如果你沒有一個活動引用,你可以這樣使用你的上下文:

getContext().getString(R.string.your_string_name);



還有一組預定義的Android字符串,比如“Ok”,“Cancel”等等 - 所以你不必聲明全部。 他們可以簡單地通過:

getString(android.R.string.ok)

(在這種情況下,“確定”字符串)。 順便說一句,還有其他的Android資源,例如圖標圖像等




Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);



從字符串獲取資源ID的簡單方法。 在這裡,resourceName是在XML文件中包含的可繪製文件夾中的資源ImageView的名稱。

int resID = getResources().getIdentifier(resourceName, "id", getPackageName());
    ImageView im = (ImageView) findViewById(resID);
    Context context = im.getContext();
    int id = context.getResources().getIdentifier(resourceName, "drawable",
    context.getPackageName());
    im.setImageResource(id);