Dize dizisi kaynağındaki bir dizeye xml ile başvurma


257

Menüde hangi öğelerin gösterileceğini etkinleştirebileceğiniz / devre dışı bırakabileceğiniz tercihlerim var. 17 ürün var. Bu 17 öğenin her biri için başlık ile değerleri / arrays.xml bir dize dizisi yaptım.

Tercihlerim dosyası için düzeni olan preferences.xml var ve başlık olarak kullanmak için dize dizisinden tek bir öğeye başvurmak istiyorum.

Bunu nasıl yapabilirim?

Android geliştirici başvurusunda, XML ile tek bir dizeye nasıl başvurabileceğimi görüyorum, ancak XML'deki bir dizi kaynağından bir dizeye nasıl başvurabileceğimi göremiyorum.

Yanıtlar:


332

Kısacası: Bence yapabilirsin, ancak geçici bir çözüm gibi görünüyor yoktur: .

Android Kaynağına buradan bakarsanız:

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

Dizi bölümünün (en azından dize dizisi) altında gördüğünüzden, "KAYNAK REFERANSI" (bir XML'den aldığınız gibi) tek tek öğeleri ele almanın bir yolunu belirtmez. XML'inizde "@ array / yourarrayhere" kullanmayı bile deneyebilirsiniz. Tasarım zamanında ilk öğeyi alacağınızı biliyorum. Ama kullanmak istiyorsanız bunun pratik bir faydası yok, diyelim ki ... elbette ikincisi.

ANCAK, yapabileceğiniz bir hile var. Buraya bakın:

XML Dizisindeki XML dizesine başvurma (Android)

Dizinin tanımının İÇİNDEKİ bağımsız dizeleri adresleyerek dizi tanımını "hile" (gerçekte değil) yapabilirsiniz. Örneğin, strings.xml dosyasında:

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

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

Bunu kullanarak, "android: metin" ve "android: title" XML alanlarınızda normalde "@ string / earth" ve "@ string / moon" kullanabilirsiniz, ancak diziyi kullanma yeteneğini kaybetmezsiniz. öncelikle amaçladığınız amaçlarla tanımlayın.

Burada tutulma üzerinde çalışıyor gibi görünüyor. Neden işe yarayıp yaramadığını söylemiyorsun? :-)


32
name<item> s ... * sigh * 'a etiket verebilirsek
Noob Student

2
Sadece denedim! Diziyi varsayılan olarak tanımladı, strings.xmlancak girmedi values-frve dizi hala Fransızca sürümle güncellendi. Çok yanlış .. ama serin çalışıyor!
Blundell

1
Herkese hızlı ipucu: "Dünya" yı çift tıkladığınızda dünya vurgulanacaktır. @ String / moon'da aya çift tıklamak sadece ayı vurgulayacaktır. Böylece, dizinizi oluştururken ilk öğeyi birkaç kez çoğaltırsanız, tek tek dizeleriniz ve dize dizisi arasında oldukça kolay bir şekilde kopyalayıp yapıştırabilirsiniz. Dize dizinizin oluşturulmasını hızlandırma konusunda yardımcı olabilir :)
ArtOfWarfare

2
Sadece bu yaklaşım dizeleri oldukları gibi ancak başvuruları kullanarak ilan daha kötü performans neden olup olmadığını bilmek ister misiniz?
Alex Bonel

1
@AlexBonel ilginç bir soru ve dürüstçe bilmiyorum. Olsa bile, bu tür bir mikro optimizasyonu derleyiciye bırakmamız gerektiğini düşünüyorum. Her neyse, yolun aşağısında bir yerde eğimli değiller mi? Tahmin ederlerdi, ama emin değilim. En azından Android zincirinde daha yüksek bir seviyede, bir APK'yı apktool ile tamamen parçalara ayırabileceğinizi biliyorum ve dize anahtarlarının orijinal adlarını kurtaracak, bu da yukarıdaki gibi referansların tutulduğu anlamına geliyor. Ama şu anda bu alanla pek ilgilenmiyorum, bu yüzden sorunuzu cevaplayamıyorum. Yine de iyi bir soru.
davidcsb

217

Belki bu yardımcı olabilir:

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

Böylece dizi listesini String [] olarak alırsınız ve sonra herhangi bir i, some_array [i] seçersiniz.


10
Dizi kaynağını nasıl alacağımı anlıyorum. Bu, bir xml düzeninde diziden öğeye başvurmama izin vermiyor.
Jorsher

1
Ah Üzgünüm. Yanlış anlamışım. Peki, xml düzeninde olması gerekiyor mu? Başlık kullanıcı seçimi ile değişirse, neden sadece .java dosyasında yapmıyorsunuz? Örn .setText (bir_dizi [i]).

2
Çünkü tercih düzeni xml biçimindedir. Java, menüyü tercihlerde "etkin" öğelerle yükler. Tercihler için 17 denetim yazdığınızda ve onu liste görünümüne eklemek için sonraki kod bana gereksiz ve özensiz görünüyor.
Jorsher

Bu, değerler klasörümdeki bir xml dizisinden bir arrayadapter oluştururken kullanışlıdır
EHarpham

Bir tercih alırken varsayılan bir değere ihtiyaç duyulduğunda bunu yararlı buldum: String myPref = preferences.getString(context.getResources().getString(R.string.my_pref), some_array [0]);burada my_pref daha önce bazı değerlere ayarlanmış some_array [x]
Al Lelopath

67

Daha iyi bir seçenek, yalnızca kaynak döndürülen diziyi bir dizi olarak kullanmaktır, yani:

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

Bu, yukarıda zikredilen yaklaşımların kısayol yaklaşımıdır, ancak istediğiniz şekilde çalışma yapar. Aksi takdirde android xml tabanlı diziler için doğrudan XML indekslemesi sağlamaz.


1
@ Benjiko99 Hatayı tespit ettiğiniz için teşekkürler, buna göre değişti.
Amitesh

Bunu yapmanın en kısa yolu budur. 1!
suomi35

1
bu daha özlü görünebilir, ancak birisi veya çevirmen dizeler dosyasındaki dizinin sırasını değiştirirse, yanlış dize kullanırsınız.
newDeveloper

9

Ne yazık ki:

  • XML ile value / arrays.xml içindeki bir diziden tek bir öğeye başvuramayacağınız anlaşılıyor. Tabii ki Java ile yapabilirsiniz, ancak XML değil. Android geliştirici referansında bunu yapma hakkında hiçbir bilgi yok ve başka hiçbir yerde bulamadım.

  • Tercihler düzeninde bir diziyi anahtar olarak kullanamayacağınız anlaşılıyor. Her anahtarın kendi anahtar adı ile tek bir değer olması gerekir.

Ne başarmak istiyorum: 17 tercihleri ​​arasında döngü, öğenin işaretli olup olmadığını kontrol etmek ve eğer öyleyse, o tercih adı için dize dizesinden dize yüklemek istiyorum.

İşte bu görevi tamamlamak umuyordum kod:

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

Ben ne yaptım:

  • Öğelerin her biri için tek bir dize ayarladım ve. Tercihler düzeni onay kutusu başlıkları ve benim döngü için dizi için tek dize başvurusu kullanın.

  • Tercihler arasında dolaşmak için, key1, key2, key3 gibi anahtarları adlandırdım. Bir dize ile bir tuşa başvurduğunuzdan, anahtar adını çalışma zamanında "oluşturma" seçeneğiniz vardır.

İşte yeni kod:

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

1

Bunu yapmanın başka bir yolu, strings.xml dosyasında aşağıdaki gibi bir kaynak dizisi tanımlamaktır.

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

ve sonra yukarıdaki kaynakları kullanarak bir dize dizisi tanımlama

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

DRY'yi olduğu gibi bırakarak aynı dizeyi diğer xmls'lere de yönlendirebilirsiniz. Gördüğüm avantaj, tek bir değer değişikliği ile koddaki tüm referansları etkileyecek olmasıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.