안드로이드 : 이름을 사용하여 리소스에서 문자열을 얻는 방법은 무엇입니까? name=”tab_Quotes_ru”>Цитаты</string> <string name=”tab_Questions_ru”>Вопросы</string> <string name=”tab_Notes_ru”>Заметки</string> <string name=”tab_Bookmarks_ru”>Закладки</string> 이제 앱에서 이러한 값을

UI에 2 가지 언어를 사용하고 리소스 파일에 별도의 문자열 값을 지정하고 싶습니다 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.

내 경우에는 왜 작동하지 않습니까?



답변

언급 한 링크는 런타임에 생성 된 문자열로 작동하는 것 같습니다. strings.xml의 문자열은 런타임에 작성되지 않습니다. 당신은 그들을 통해 얻을 수 있습니다

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

getResources()Context클래스 의 방법입니다 . ( Activity또는 Service컨텍스트를 확장 하는) 내부에있는 경우이 코드 조각과 같이 사용할 수 있습니다.

또한 전체 언어 종속성은 android 프레임 워크에서 처리 할 수 ​​있습니다 . 언어마다 다른 폴더를 만들면됩니다. 영어가 기본 언어 인 경우 영어 문자열을에 넣으십시오 res/values/strings.xml. 그런 다음 새 폴더를 만들고 values-ru이름이 같은 러시아어 문자열을에 넣습니다 res/values-ru/strings.xml. 이 시점에서 안드로이드는 전화를 걸 getString()거나 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 getStringByIdName(Context context, String idName) {
        Resources res = context.getResources();
        return res.getString(res.getIdentifier(idName, "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);
    }
}


답변

최고의 접근법

App.getRes().getString(R.string.some_id)

어디에서나 작동합니다 (유틸리티, 모델도).

모든 답변을 읽었으며 모든 답변을 통해 업무를 수행 할 수 있습니다.

  • 또는 getString(R.string.some_string_id)모두에 사용할 수 있습니다 .ActivityFragment
  • 메소드에 Context.getString(R.string.some_string_id)직접 액세스 할 수없는 곳에서 사용할 수 있습니다 getString(). 처럼 Dialog.

문제

당신이없는 Context액세스를 당신의 방법처럼 Util클래스입니다.

컨텍스트가없는 아래 메소드를 가정하십시오.

public void someMethod(){
    ...
    // can't use getResource() or getString() without Context.
}

이제이 Context방법에서 매개 변수로 전달 하고getString().

public void someMethod(Context context){
    ...
    context.getString(R.string.some_id);
}

내가하는 일은

public void someMethod(){
    ...
    App.getAppResources().getString(R.string.some_id)
}

뭐? 앱 어디에서나 사용하는 것은 매우 간단합니다!

다음은 어디에서나 리소스에 액세스 할 수 있는 솔루션Util class 입니다.

import android.app.Application;
import android.content.res.Resources;

public class App extends Application {
    private static Resources resources;

    @Override
    public void onCreate() {
        super.onCreate();

        resources = getResources();
    }

    public static Resources getAppResources() {
        return resources;
    }

}

manifest.xml <application태그에 이름 필드를 추가하십시오 .

<application
        android:name=".App"
        ...
        >
        ...
    </application>

이제 잘 가십시오. App.getAppResources().getString(R.string.some_id)앱의 어느 곳에서나 사용하십시오 .


답변

더 쉬운 방법은 getString()활동 내에서 기능 을 사용 하는 것입니다.

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

참조 : http://developer.android.com/guide/topics/resources/string-resource.html

나는이 기능이 최신 Android 버전에 추가되었다고 생각합니다. 역사를 알고있는 사람은 이것에 댓글을 달 수 있습니다.