2010-05-10 18 views
11

Diğer birkaç kişiyle birlikte Android için bir uygulama üzerinde çalışıyorum ve birincil içerik tasarımcılarımız tarafından belirli bir dosya biçiminde metin dosyaları olarak belirtiliyor ve ardından ayrıştırılıyoruz , süreç ve uygulamada servis yapın. Şu anda onları res/raw'da saklıyoruz.Res/raw programlı içeriğinin içeriğine erişilmesi (Android)

Bu, tasarımcıları harika kılar çünkü içerik eklemek istediklerinde, res/raw dosyasına bir dosya eklerler. Bu, geliştiriciler için can sıkıcı bir durumdur, ancak geliştiricilerin, başlangıçta hangi dosyaların işleneceğini belirten bir diziye R.raw.the_new_file eklemesi gerektiğinden.

res/raw numaralı kaynak koduna programlı olarak erişmenin bir yolu var mı? İdeal olarak, uygulama başladığında, hangi dosyaların res/raw olduğunu görebilmemiz için bir çağrı yapabiliriz, hepsini işleme, böylece res/raw'un içeriğini kodumuzdaki diziyle eşleştirerek küçük ek yükü ortadan kaldırabiliriz.

gördüğüm en umut verici yol beni AssetManager üzerinde list(String) diyelim ediyorum Resources den getAssets, ama sorun doğrudan filepath "res/raw" diyemezsin, özellikle de bu işe alma yaşadım denedim zaman (ya da en azından, işe yaradı değil.

Öneriler? Teşekkür

cevap

15

Yansımayı kullanabilirsiniz.


ArrayList<Integer> list = new ArrayList<Integer>(); 
Field[] fields = R.raw.class.getFields(); 
for(Field f : fields) 
try { 
     list.add(f.getInt(null)); 
    } catch (IllegalArgumentException e) { 
    } catch (IllegalAccessException e) { } 

Bu listede, res/raw klasöründeki tüm kaynak kimlikleri bulunur. Kaynağın adına ihtiyacınız varsa ... f.getName() işlevi döndürür.

+0

Teşekkürler, kabul etmek için geç kaldım ama yapmadığımı unutmuştum. Bir çekicilik gibi çalıştı! –

1

uygun i almak için

Context.getResources().getIdentifier("filename", "raw", "packagename"); 

kullanabilirsiniz dentifier. Ancak, çözümünüzü neden bu kadar karmaşık yaptığınızı anlamıyorum. Tasarımcı için avantajlar nelerdir? Neden dosyaları sadece çekilebilir klasörlere koymazlar?

+0

Bu aslında grafikler için değil, bir oyundaki düzeyler içindir. Her seviye statik bir haritaya, değişken bir dinamik nesneye, bu nesneler için yerlere, seviyeye özel bildirimlere, bir dizi konfigürasyona, vs. sahiptir. Seviye tasarımcılarının kod tabanımızı doğrudan düzenlediğinden ziyade, Metin dosyalarında beyan düzeylerini belirtmek; ve onları res/raw'ye koymayı seçtik. Bahşiş için teşekkürler! Bir deneme yapacağım ve nasıl gideceğimi söyleyeyim^_^ –

5

Bu yanıt biraz gecikmiş olabilir, bunun yerine varlıklar klasörünü kullanmalısınız. Burada bir klasör hiyerarşisine sahip olabilir ve bir dosya sistemi olarak okuyabilirsiniz.

Bilgileriniz için getAssets, "res/raw" içinde değil, Android projenizin "öğeler" klasöründeki dosyalar için bir yönetici döndürür. "res/raw", "R" Java Paketine gider. assets.list(path) Verilen klasördeki varlıklar klasörünüze göre bir dizi dosya döndürür. Varlığın klasörü de geleneksel bir klasör değil, ancak Android bunu normal bir dosya gibi “hissettiriyor” diye özetliyor. JNI yapıyor ve varlıklarınızı c/C++ 'dan okumak istiyorsanız, bu daha önemli hale gelir.