2011-09-21 17 views
385

benim kaynak dosyasında res\values\strings.xml onlar için UI ve ayrı dize değerleri için 2 dil var istiyorum:Android: İsmini kullanarak kaynaklardan nasıl dize alabilirim?

<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> 

Şimdi dinamik olarak bu değerleri almak gerekir benim app:

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

Sorunum şu ki i = 0 .

Neden benim durumumda çalışmıyor?

+1

Central.lang'ın ya "tr" ya da "ru" olduğundan emin misiniz? –

+0

Daha fazla bilgi kodunuzu incelemek için gereklidir. ben almadan önce her varlığın durumu nedir? Her neyse, işleri basitleştirmek için Android'deki varsayılan yerelleştirme desteğini kullanmalısınız. – Alin

cevap

786

Gönderdiğiniz bağlantı, çalışma zamanında oluşturulan dizelerle çalışıyor gibi görünüyor. Strings.xml dizeleri çalışma zamanında oluşturulmaz. Sen

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

getResources() aracılığıyla onları alabilirsiniz Context sınıfın bir yöntemdir. Bir Activity veya Service (İçeriği genişleten) içinde bulunuyorsanız, bu parçacığa benzer şekilde kullanabilirsiniz.

Ayrıca tüm dil bağımlılığının android framework tarafından halledilebileceğini unutmayın. Her dil için farklı klasörler oluşturun. İngilizce varsayılan dilinizse, ingilizce dizgileri res/values/strings.xml'a yerleştirin. Sonra yeni bir klasör oluşturun values-ru ve aynı dizeleri ile rus dizeleri res/values-ru/strings.xml içine koyun. Bu noktada android, getString() numaralı telefonu aradığınızda ya da XML'deki dizeleri @string/mystring aracılığıyla başvuruda bulunduğunuzda, aygıt yerel ayarına bağlı olarak doğru olanı seçer. res/values/strings.xml'dan olanlar, geri dönen kullanıcılardır; kullanıcılar yerel ayarı kapsayan bir klasörünüz yoksa, bu varsayılan değerler olarak kullanılır. Daha fazla bilgi için Localization ve Providing Resources numaralı telefon numaralarına bakın.

+7

'android.support.v4.app.Fragment' içinde iseniz, doğrudan getString (R.string.mystring)' yi çağırabilirsiniz. – JaKXz

+1

Sadece gülüyordum. Neden bu kadar karmaşık bir şekilde (google tarafından) yapılır? Önce mystring'in sayısal kimliğini (R nesnesinden) alın ve daha sonra bu ID ile dizgiyi alınıyor mu? Ve "ID-of-mystring => actualValue" çifti nerede bulunuyor? Bildiğim kadarıyla mystring => ID-of-mystring, R.java'dadır, ama bu, bu –

+0

"R" nin, projenizin R'sinin değil, R'nin varsayılan android olduğunu unutmayın. – ralphgabb

247

Aynı sorunu yaşıyorum. Ama bu kod benim için çalışıyor: packageName'in doğru olup olmadığını doğrulayın. Android uygulamanızın kök paketine başvurmanız gerekir.

private String getStringResourceByName(String aString) { 
     String packageName = getPackageName(); 
     int resId = getResources().getIdentifier(aString, "string", packageName); 
     return getString(resId); 
    } 
+4

olması gereken @leonvian ... 'dan gelen yanıtı kullanın. Birisinin bunu yapmak için iyi bir nedeni varsa (örneğin, veri dosyaları hangi kaynağa karar veren özel bir dize içeriyorsa) dize görüntülenmeli veya bu dize internetten alınacaksa) - o zaman bu çözümün doğru olduğuna işaret etmek isterim. Özellikle kaynak türünün "string" olduğu ve "dizgiler" olmadığı kısmı düzeltin. Çünkü bu mantıklı (Android'in geri kalanı gibi). Bunun için teşekkürler (ve daha fazlası), @leonvian. :-) –

+0

ve dizi nasıl okunur? – Sameer

+2

@Sameer Strings tarafından bir dizi almak için sadece kullanın: res.getStringArray (R.array.planets_array); Bu bağlantıya bir göz atın: http://developer.android.com/guide/topics/resources/string-resource.html#StringArray – leonvian

25

bir ihtimal dize kaynakları arasında bulunmazsa (dönüş değeri 0, bu geçerli bir kaynak kodu değil) bu yüzden, işlev şey döndürebilir, leonvian çözümüne şey eklemek istiyorum:

private String getStringResourceByName(String aString) { 
    String packageName = getPackageName(); 
    int resId = getResources() 
      .getIdentifier(aString, "string", packageName); 
    if (resId == 0) { 
     return aString; 
    } else { 
     return getString(resId); 
    } 
} 
36
getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName())) 
2

Dize kaynak kimliğini almanın basit bir yolu. Burada resourceName, XML dosyasında da yer alan çizilebilir klasördeki ImageView kaynağının adıdır. Sadece faaliyetlerinden

int resID = getResources().getIdentifier(resourceName, "id", getPackageName()); 
    ImageView im = (ImageView) findViewById(resID); 
    Context context = im.getContext(); 
    int id = context.getResources().getIdentifier(resourceName, "drawable", 
    context.getPackageName()); 
    im.setImageResource(id); 
50

Değil:

public static String byIdName(Context context, String name) { 
     Resources res = context.getResources(); 
     return res.getString(res.getIdentifier(name, "string", context.getPackageName())); 
    } 
7

Bir Etkinlik referansı yoksa, bu şekilde bağlamını kullanabilirsiniz:

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

aynı zamanda bir dizi var önceden tanımlanmış Android dizgileri "Ok", "İptal" ve diğerleri gibi önceden tanımlanmış olduğundan, hepsini bildirmeniz gerekmez. Sadece şu şekilde kullanılabilirler:

getString(android.R.string.ok) 

(Bu durumda, "Ok" dizesi). BTW ayrıca, örneğin simgeler vb. Gibi başka Android kaynakları da vardır.

İlgili konular