xml을 사용하여 문자열 배열 리소스에서 문자열 참조


256

메뉴에 표시 할 항목을 활성화 / 비활성화 할 수있는 환경 설정이 있습니다. 17 건의 상품이 있습니다. 값 /arrays.xml에이 17 개 항목 각각에 제목이있는 문자열 배열을 만들었습니다.

환경 설정 파일의 레이아웃이있는 preferences.xml이 있으며 제목으로 사용할 문자열 배열에서 단일 항목을 참조하고 싶습니다.

어떻게해야합니까?

Android 개발자 참조에서 XML로 단일 문자열을 참조하는 방법을 알지만 XML의 배열 리소스에서 문자열을 참조하는 방법은 알 수 없습니다.

답변:


331

한마디로 : 나는 당신이 할 수 있다고 생각하지 않지만 해결 방법이있는 것 같습니다 : .

Android 리소스를 살펴 보려면 여기를 클릭하십시오.

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

배열 섹션 (최소한 문자열 배열)보다 "자원 참조"(XML에서 얻을 수 있음)가 개별 항목을 처리하는 방법을 지정하지 않습니다. XML에서 "@ array / yourarrayhere"를 사용하도록 시도 할 수도 있습니다. 나는 디자인 타임에 첫 번째 항목을 얻을 것이라는 것을 알고 있습니다. 그러나 당신이 사용하기를 원한다면 그것은 실용적이지 않습니다.

그러나 할 수있는 트릭이 있습니다. 여기를 보아라:

XML 배열에서 XML 문자열 참조 (Android)

배열 정의 내부에 독립 문자열을 지정하여 배열 정의를 "속임수"(실제 아님) 할 수 있습니다. 예를 들어, strings.xml에서

<string name="earth">Earth</string>
<string name="moon">Moon</string>

<string-array name="system">
    <item>@string/earth</item>
    <item>@string/moon</item>
</string-array>

이를 사용하면 "android : text"및 "android : title"XML 필드에서 일반적으로 "@ string / earth"및 "@ string / moon"을 사용할 수 있지만 배열을 사용할 수있는 기능을 잃지 않습니다. 처음부터 의도 한 모든 목적에 대한 정의.

내 Eclipse에서 작동하는 것 같습니다. 왜 작동하는지 알려주시겠습니까? :-)


32
name<item> s ... * sigh * 에만 태그를 줄 수 있다면
일부 멍청한 학생

2
그냥 해봐! 배열을 기본값으로 정의 strings.xml했지만 넣지 않았으며 values-fr배열은 여전히 ​​프랑스어 버전으로 업데이트되었습니다. 너무 잘못 ..하지만 멋진 작동합니다!
Blundell

1
누구에게 빠른 팁 : "지구"를 두 번 클릭하면 지구가 강조 표시됩니다. @ string / moon에서 달을 두 번 클릭하면 달만 강조 표시됩니다. 따라서 배열을 만들 때 첫 번째 항목을 여러 번 복제하면 개별 문자열과 문자열 배열 사이를 복사하고 붙여 넣을 수 있습니다. 문자열 배열의 생성 속도를 높이는 데 도움이 될 수 있습니다. :)
ArtOfWarfare

2
이 접근 방식이 문자열을 배열로 선언하지만 참조를 사용하지 않는 경우보다 성능이 저하되는지 알고 싶습니까?
Alex Bonel

1
@AlexBonel 흥미로운 질문이며 솔직히 모르겠습니다. 그래도 이런 종류의 마이크로 최적화를 컴파일러에 맡겨야한다고 생각합니다. 어쨌든, 그들은 길 어딘가에 인라인으로 끝나지 않습니까? 나는 그들이 할 것이라고 생각하지만 확실하지 않습니다. 적어도 안드로이드 체인의 상위 레벨에서는 apktool을 사용하여 APK를 완전히 분해 할 수 있으며 문자열 키의 원래 이름을 복구하므로 위의 선언과 같은 참조 선언이 유지됩니다. 하지만 지금은 그 분야에 관심이 많지 않으므로 귀하의 질문에 대답 할 수 없습니다. 그래도 좋은 질문입니다.
davidcsb

216

아마도 이것이 도움이 될 것입니다.

String[] some_array = getResources().getStringArray(R.array.your_string_array)

따라서 배열 목록을 String []으로 가져온 다음 i, some_array [i]를 선택하십시오.


10
배열 리소스를 얻는 방법을 이해합니다. 그래도 xml 레이아웃에서 배열의 항목을 참조 할 수 없습니다.
Jorsher

1
아 죄송합니다 나는 오해했다. 글쎄, 그것은 XML 레이아웃에 있어야합니까? 제목이 사용자 선택에 따라 바뀌면 .java 파일에서 제목을 변경하지 않는 이유는 무엇입니까? 예 : .setText (some_array [i]).

2
환경 설정 레이아웃은 xml에 있기 때문입니다. java는 환경 설정에서 "활성화 된"항목으로 메뉴를로드합니다. 17 가지를 입력하여 환경 설정을 확인하면 목록보기에 추가하는 후속 코드가 중복되고 느슨해 보입니다.
Jorsher

이것은 value 폴더의 xml 배열에서 arrayadapter를 만들 때 유용했습니다
EHarpham

선호 가져올 때 기본값을 필요로 할 때 나는이 유용한 발견 : String myPref = preferences.getString(context.getResources().getString(R.string.my_pref), some_array [0]);my_pref가 이전에 어떤 값 some_array로 설정 [을 X]
알 Lelopath

67

더 나은 옵션은 반환 된 리소스 배열을 배열로 사용하는 것입니다.

getResources().getStringArray(R.array.your_array)[position]

이것은 위에서 언급 한 접근 방식의 바로 가기 접근 방식이지만 원하는 방식으로 작동합니다. 그렇지 않으면 안드로이드는 XML 기반 배열에 대한 직접적인 XML 인덱싱을 제공하지 않습니다.


1
@ Benjiko99 오류를 찾아 주셔서 감사합니다. 따라서 변경했습니다.
Amitesh

이것이 가장 간결한 방법입니다. +1!
suomi35

1
이것은 더 간결한 것처럼 보일 수 있지만 누군가 또는 번역자가 문자열 파일에서 배열의 순서를 변경하면 잘못된 문자열을 사용하게됩니다.
newDeveloper 2011

9

운수 나쁘게:

  • XML을 사용하여 values ​​/ arrays.xml의 배열에서 단일 항목을 참조 할 수없는 것 같습니다. 물론 Java에서는 가능하지만 XML에서는 불가능합니다. Android 개발자 참조에는 그렇게하는 데 대한 정보가 없으며 다른 곳을 찾을 수 없습니다.

  • 환경 설정 레이아웃에서 배열을 키로 사용할 수없는 것 같습니다. 각 키는 고유 한 키 이름을 가진 단일 값이어야합니다.

내가 달성하고자하는 것 : 17 가지 기본 설정을 반복하고 항목이 확인되었는지 확인하고 해당 항목이 있으면 해당 기본 설정 이름의 문자열 배열에서 문자열을로드하고 싶습니다.

이 작업을 완료하기를 바랐던 코드는 다음과 같습니다.

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());  
ArrayAdapter<String> itemsArrayList = new ArrayAdapter<String>(getBaseContext(),   android.R.layout.simple_list_item_1);  
String[] itemNames = getResources().getStringArray(R.array.itemNames_array);  


for (int i = 0; i < 16; i++) {  
    if (prefs.getBoolean("itemKey[i]", true)) {  
        itemsArrayList.add(itemNames[i]);  
    }  
} 

제가 한:

  • 각 항목마다 단일 문자열을 설정하고의 단일 문자열을 참조했습니다. 기본 설정 레이아웃 확인란 제목에 단일 문자열 참조를 사용하고 루프에 대한 배열을 사용합니다.

  • 환경 설정을 반복하기 위해 방금 key1, key2, key3 등과 같은 키 이름을 지정했습니다. 문자열이있는 키를 참조하므로 런타임시 키 이름을 "빌드"하는 옵션이 있습니다.

새로운 코드는 다음과 같습니다.

for (int i = 0; i < 16; i++) {  
        if (prefs.getBoolean("itemKey" + String.valueOf(i), true)) {  
        itemsArrayList.add(itemNames[i]);  
    }  
}

1

이를 수행하는 또 다른 방법은 아래와 같이 strings.xml에 resources 배열을 정의하는 것입니다.

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE resources [
    <!ENTITY supportDefaultSelection "Choose your issue">
    <!ENTITY issueOption1 "Support">
    <!ENTITY issueOption2 "Feedback">
    <!ENTITY issueOption3 "Help">
    ]>

그런 다음 위의 리소스를 사용하여 문자열 배열을 정의하십시오.

<string-array name="support_issues_array">
        <item>&supportDefaultSelection;</item>
        <item>&issueOption1;</item>
        <item>&issueOption2;</item>
        <item>&issueOption3;</item>
    </string-array>

DRY는 그대로 유지하면서 동일한 문자열을 다른 XML로 참조 할 수 있습니다. 내가 보는 이점은 단일 값 변경으로 코드의 모든 참조에 영향을 미친다는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.