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)
모두에 사용할 수 있습니다 .Activity
Fragment
- 메소드에
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 버전에 추가되었다고 생각합니다. 역사를 알고있는 사람은 이것에 댓글을 달 수 있습니다.