2012-12-11 14 views
6
Ben herhangi bir yardım bulamadık bir sorum var

:Erişim <beyan-styleable> kaynaklar programlama yoluyla

o kaynak kimlikleri olmadan programlama yoluyla int [] gibi bir tarafından tutuluyor almak mümkün mü kaynak sınıfı R'ye atıfta bulunuyorsunuz?

int id = context.getResources().getIdentifier("com_facebook_login_view", "declare-styleable", context.getPackageName()); 
int[] resourceIDs = context.getResources().getIntArray(id); 

konusunda fikrin büyük takdir: 0x00 daima döndürülür -

<declare-styleable name="com_facebook_login_view"> 
    <attr name="confirm_logout" format="boolean"/> 
    <attr name="fetch_user_info" format="boolean"/> 
    <attr name="login_text" format="string"/> 
    <attr name="logout_text" format="string"/> 
</declare-styleable> 

Sorun tanımlanan 'ilan-styleable' özelliğinin kimliğini çözmek değil ki! :)

Şimdiden teşekkürler! İşte Christopher

+2

. R.styleable sınıfındaki yansımayı denedin mi? – njzk2

+0

Hayır, bundan bahsetmedim - ipucu için teşekkürler - Yansımayı kullanarak onu deneyeceğim :) Yani bir declare-styleable'a dinamik olarak erişmenin bir yolu yok mu? getContext() yöntemine göre kullanırdım. GetStyledAttributes (AttributeSet set, int [] attrs); Yardımlarınız için teşekkürler! –

+2

Çözüldü. Ama benim itibarım kendi soruyu cevaplamak için çok düşük :( Ben unutulmayacaksa sekiz saat içinde yayınlayacağım.) –

cevap

15

çocuk için programlama yoluyla kaynak kimliklerini teslim çözümdür - Bir etiket için tanımlanmış etiketler:

/********************************************************************************* 
* Returns the resource-IDs for all attributes specified in the 
* given <declare-styleable>-resource tag as an int array. 
* 
* @param context  The current application context. 
* @param name  The name of the <declare-styleable>-resource-tag to pick. 
* @return    All resource-IDs of the child-attributes for the given 
*      <declare-styleable>-resource or <code>null</code> if 
*      this tag could not be found or an error occured. 
*********************************************************************************/ 
public static final int[] getResourceDeclareStyleableIntArray(Context context, String name) 
{ 
    try 
    { 
     //use reflection to access the resource class 
     Field[] fields2 = Class.forName(context.getPackageName() + ".R$styleable").getFields(); 

     //browse all fields 
     for (Field f : fields2) 
     { 
      //pick matching field 
      if (f.getName().equals(name)) 
      { 
       //return as int array 
       int[] ret = (int[])f.get(null); 
       return ret; 
      } 
     } 
    } 
    catch (Throwable t) 
    { 
    } 

    return null; 
} 

Belki bu birileri bir gün yardımcı olabilir. :)

Selamlar

Christopher

+0

Ve telaş bloğu için njzk2 tekrar teşekkürler :) –

+1

Büyük cevap .. Teşekkürler – Arunkumar

+1

% 100 R.styleable bağımsız bir çözüm sağladığı için kabul edilen cevap olmalıdır. –

1

Biraz daha verimli çözüm:

bir beyan-styleable değil, bir tanımlayıcı olduğu için var
public static final int[] getResourceDeclareStyleableIntArray(String name) { 
     Field[] allFields = R.styleable.class.getFields(); 
     for (Field field : allFields) { 
      if (name.equals(field.getName())) { 
       try { 
        return (int[]) field.get(R.styleable.class); 
       } catch (IllegalAccessException ignore) {} 
      } 
     } 

     return null; 
    } 
İlgili konular