development

안드로이드 : 이름을 사용하여 리소스에서 문자열을 얻는 방법은 무엇입니까?

big-blog 2020. 2. 11. 22:32
반응형

안드로이드 : 이름을 사용하여 리소스에서 문자열을 얻는 방법은 무엇입니까?


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 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);
    }
}

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

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

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

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


리소스 문자열을 문자열에서 TextView로 가져 오는 간단한 방법. 여기 resourceName은 자원의 이름입니다

int resID = getResources().getIdentifier(resourceName, "string", getPackageName());
textview.setText(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)앱 어디에서나 사용하십시오 .


활동 참조가없는 경우 다음과 같은 방식으로 컨텍스트를 사용할 수 있습니다.

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

"Ok", "Cancel"등과 같은 미리 정의 된 Android 문자열 세트도 있으므로 모두 선언 할 필요가 없습니다. 다음과 같이 간단하게 사용할 수 있습니다.

getString(android.R.string.ok)

(이 경우 "Ok"문자열). BTW에는 아이콘 이미지 등과 같은 다른 Android 리소스도 있습니다.


문자열 myString = getString (R.string.mystring);

쉬운 방법


안전을 위해 다음을 추가해야합니다. mContext.getResources (). getString (R.string.your_string);

mContext는 Fragment의 onAttach () 또는 Activity의 context 일 수 있습니다.


당신은 활동에서 이것을 시도 할 수 있습니다 :

getResources().getString(R.string.your string name);

조각과 같은 다른 상황에서는 ... 사용

getContext().getResources().getString(R.string.your string name);

참고 URL : https://stackoverflow.com/questions/7493287/android-how-do-i-get-string-from-resources-using-its-name



반응형