2010-08-23 19 views
7

Oluşturulan R dosyasındaki tüm alanlar arasında yineleme yapabilmek istiyorum. gibiAndroid: Program aracılığıyla yineleyin Kaynak kimlikleri

şey:

for(int id : R.id.getAllFields()){ 
//Do something with id, like create a view for each image 
} 

Ben yansıma denedim ama R sınıfının içinde bulunan ediyor belirli iç sınıf yüklemek gibi olamaz. Ben R sınıfının kendisini yansıtabilir

Class c = Class.forName("packageName.R.id") 

ama id sınıf içindeki alanları gerekir: Yani, örneğin, bu benim için işe yaramaz.

Ayrıca Kaynaklar sınıfına bakmayı denedim, ancak orada hiçbir şey bulamadım. Bu durumda, bir resourceID alabilir ve bu kimliğin dize adını alabilir veya bir dize adı alabilir ve ilgili resourceID'yi alabilirsiniz. Ben şu gibi bir şey bulamadım: Bu yanlış anlıyorum belki de ben bu yanlış gidiyorum. Ya da belki bu yaklaşım benim UI tasarımcı ile çalışırken kadar esnek olmama dezavantajı var .:

int[] myIds = {R.id.firstResource, R.id.secondResource} 

elle hepsini yazarak örneğin kavga etmemeli. XML dosyasına yeni bir kaynak eklediğinde, kodu güncellemeliyim. Açıkçası çok acı verici değil, ama yine de sahip olmak güzel olurdu ve yapılabilir olması gerektiği gibi görünüyor.

DÜZENLEME: ViewGroup.getChildCount()/ViewGroup.getChildAt() çalışıyor yaklaşık aşağıda

cevap. Ancak, XML ViewGroup/Layout'umu örneklendirmenin bir yolunu bulmak zorundaydım. Sen bir iç sınıfına yansıma kullanabilirsiniz

LayoutInflater li = MyActivity.getLayoutInflater(); 
ViewGroup vg = (ViewGroup) li.inflate(R.layout.main, null); 
+0

bu snarky olmak için söylemiyorum ama IMHO gerçeği size bu soruyu muhtemelen yapıyoruz demektir sormak gerekir hissediyorum Ters giden birşey mi var. Bunu yapmak için kullanım durumunuz hakkında ayrıntılı bilgi verebilir misiniz? Tüm uygulamam boyunca tanımlanan tüm kimliklere erişmek istediğim için herhangi bir sebep düşünemiyorum. – Qberticus

+1

Tüm kimliklere erişmek istemiyorum, bunun yerine, tüm kaynak kimlikleri belirli bir adın altında (ör., R.imageViewIds). Bu şekilde, kodumda, bir olay dinleyicisi ekleyebilirim ya da her birine bir döngü için ekleyebilirim.UI'mn tümü olaylara yanıt verecek çok sayıda ImageView'a sahip olacak ve bu ImageView'ların her birine adlarına göre kodlama yapmadan erişebilseydim (örn. IView1.setListener (myListener); IView2.setListener (myListener));) Ayrıca, UI tasarımcım XML dosyasındaki şeyleri yeniden adlandırmaya karar verirse kodumu yeniden düzenlemem gerekmeyecek. –

cevap

5

Yorumuma verdiğiniz yanıt, ne yapmaya çalıştığınız konusunda daha iyi bir fikir sahibi olmamı sağladı.

Muhtemelen görünümü hiyerarşisinde çeşitli ViewGroup s döngü ViewGroup#getChildAt ve ViewGroup#getChildCount kullanıp iade View s üzerinde instanceof sınamalar yapabilirsiniz. Ardından, çocuk görünümlerinin türüne ve hiyerarşinizde nerede olduklarına bağlı olarak istediğinizi yapabilirsiniz.

+0

Bu bilet gibi görünüyor! Açıklama netleşmesine sevindim. Düzenimdeki çocukların görüşlerine erişmek için aklımdan geçmemişti. Anlayış için bir demet teşekkürler. –

+0

bir kod örneği: http://stackoverflow.com/questions/4184889/android-refer-to-custom-views-in-a-loop/4185818#4185818 –

2

ancak sözdizimi packagename.R $ id: Bunu yapmak için, gibi bir şey deneyin. Yansıma çok yavaş olabileceğini ve GERÇEKTEN kullanmaman gerektiğini GEREKİR.

+0

O yansıma sadece bazı öğeleri-kodu el zorunda değil rahatlığı için çok pahalı ve değmez olabileceğini düşünüyordum. Yeterince yaygın bir senaryo gibi göründüğünden, bu kimliklere erişmek için bazı yerleşik, relfection-bazlı olmayan bir yol olduğunu umuyorum. sayesinde en azından, iç sınıflar yansıtarak üzerinde sözdizimi için. Bunu bilmek faydalı. –

5

"Class.forName (getPackageName() +". R $ string ");" dize kaynaklarına erişebilir ve id, çizilebilir, exc için de çalışmalıdır.

Sonra bu gibi Bulunan sınıfını kullanın:


import java.lang.reflect.Field; 

import android.util.Log; 

public class ResourceUtil { 

    /** 
    * Finds the resource ID for the current application's resources. 
    * @param Rclass Resource class to find resource in. 
    * Example: R.string.class, R.layout.class, R.drawable.class 
    * @param name Name of the resource to search for. 
    * @return The id of the resource or -1 if not found. 
    */ 
    public static int getResourceByName(Class<?> Rclass, String name) { 
     int id = -1; 
     try { 
      if (Rclass != null) { 
       final Field field = Rclass.getField(name); 
       if (field != null) 
        id = field.getInt(null); 
      } 
     } catch (final Exception e) { 
      Log.e("GET_RESOURCE_BY_NAME: ", e.toString()); 
      e.printStackTrace(); 
     } 
     return id; 
    } 
} 
İlgili konular