2013-09-16 5 views
17

Voglio che sia il mio ViewA che ViewB abbiano il tag "title". Ma non posso mettere questo in attrs.xml:Come dichiarare diversi attributi stylable con lo stesso nome per tag diversi?

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="ViewA"> 
     <attr name="title" format="string" /> 
    </declare-styleable> 
    <declare-styleable name="ViewB"> 
     <attr name="title" format="string" /> 
     <attr name="max" format="integer" /> 
    </declare-styleable> 
</resources> 

a causa del "titolo" errore attributo è già stato definito. Another question illustra questa soluzione:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <attr name="title" format="string" /> 
    <declare-styleable name="ViewB"> 
     <attr name="max" format="integer" /> 
    </declare-styleable> 
</resources> 

ma in tal caso, R.styleable.ViewA_title e R.styleable.ViewB_title non vengono generati. Ho bisogno di loro per la lettura degli attributi da AttributeSet utilizzando il seguente codice:

TypedArray a=getContext().obtainStyledAttributes(as, R.styleable.ViewA); 
String title = a.getString(R.styleable.ViewA_title); 

Come posso risolvere questo?

+0

simile a http://stackoverflow.com/questions/4434327/same-named-attributes-in-attrs-xml-for-custom-view – Suragch

risposta

32

Il link che hai postato non dare la risposta corretta. Questo è ciò che suggerisce che fate:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <attr name="title" format="string" /> 
    <declare-styleable name="ViewA"> 
     <attr name="title" /> 
    </declare-styleable> 
    <declare-styleable name="ViewB"> 
     <attr name="title" /> 
     <attr name="max" format="integer" /> 
    </declare-styleable> 
</resources> 

Ora, R.styleable.ViewA_title e R.styleable.ViewB_title sono entrambi accessibili.

Se si ha la possibilità, leggere questa risposta: Link. Preventivo rilevante:

È possibile definire gli attributi nell'elemento superiore o all'interno di un elemento. Se userò un attr in più di un posto, lo inserisco nell'elemento root.

+0

Questo non sembra essere più vero (o almeno quando si utilizza Android Studio 2.3).Quando definisco gli attributi nella radice, viene visualizzato un errore che indica che tali risorse non possono essere risolte. Penso che sia necessario definire un genitore con qualsiasi attributo condiviso. – BioeJD

+0

Ora non funziona su Android Studio. – user3269713

+0

la risposta corretta a partire dal 2018-2 è https://stackoverflow.com/a/43635002/1963973 – marianosimone

3

è necessario utilizzare l'ereditarietà

<resources> 
    <declare-styleable name="ViewA"> 
     <attr name="title" format="string" /> 
    </declare-styleable> 

    <declare-styleable name="ViewB" parent="ViewA"> // inherit from ViewA 
     <attr name="min" format="integer" /> 
     <attr name="max" format="integer" /> 
    </declare-styleable> 
</resources> 

Nel codice Java

String namespace = "http://schemas.android.com/apk/res/" + getContext().getPackageName(); 
int title_resource = attrs.getAttributeResourceValue(namespace, "title", 0); 
String title = ""; 
if(title_resource!=0){ 
    title = getContext().getString(title_resource); 
} 

int min = attrs.getAttributeResourceValue(namespace, "min", 0); // read int value 
int max = attrs.getAttributeResourceValue(namespace, "max", 0); 
+0

Questo non funziona. Non genera ViewB_title. ViewA_title non può essere utilizzato per gli elementi ViewB poiché il suo ID si scontrerebbe con ViewB_min. – Andreas

2

Effettuare questa operazione. No parent tag necessaria

<resources> 
    <declare-styleable name="ViewA"> 
     <attr name="title" format="string" /> 
    </declare-styleable> 

    <declare-styleable name="ViewB" > 
     <attr name="title" /> 
     <attr name="min" format="integer" /> 
     <attr name="max" format="integer" /> 
    </declare-styleable> 
</resources> 

Questo perché una volta title è dichiarata in ViewA, non ha bisogno (e anche non può) essere dichiarati nuovamente in un altro declare-styleable

1
<resources> 
<declare-styleable name="ViewA"> 
    <attr name="title" format="string" /> 
</declare-styleable> 

<declare-styleable name="ViewB" parent="ViewA"> // inherit from ViewA 
    <attr name="min" format="integer" /> 
    <attr name="max" format="integer" /> 
</declare-styleable> 

Questo non funziona.

<resources> 
<attr name="title" format="string" /> 
<declare-styleable name="ViewA"> 
    <attr name="title" /> 
</declare-styleable> 
<declare-styleable name="ViewB"> 
    <attr name="title" /> 
    <attr name="max" format="integer" /> 
</declare-styleable> 

Anche questo non funziona.

<resources> 
<declare-styleable name="ViewA"> 
    <attr name="title" format="string" /> 
</declare-styleable> 

<declare-styleable name="ViewB" > 
    <attr name="title" /> 
    <attr name="min" format="integer" /> 
    <attr name="max" format="integer" /> 
</declare-styleable> 

questo era ok !!