Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to declare several stylable attributes with the same name for different tags?

I want both my ViewA and ViewB to have the "title" tag. But I can't put this in attrs.xml:

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

because of the error Attribute "title" has already been defined. Another question shows this solution:

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

but in that case, R.styleable.ViewA_title and R.styleable.ViewB_title are not generated. I need them for reading the attributes from the AttributeSet using the following code:

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

How can I solve this?

like image 871
Andreas Avatar asked Sep 16 '13 12:09

Andreas


2 Answers

The link you have posted does give you the correct answer. This is what it suggests you do:

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

Now, R.styleable.ViewA_titleand R.styleable.ViewB_titleare both accessible.

If you get a chance, read through this answer: Link. Relevant quote:

You can define attributes in the top element or inside of a element. If I'm going to use an attr in more than one place I put it in the root element.

like image 191
Vikram Avatar answered Sep 22 '22 13:09

Vikram


Do this instead. No parent tag needed

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

This is because once title is declared in ViewA, it doesn't need (and also can't) to be declared in again in another declare-styleable

like image 34
Elye Avatar answered Sep 21 '22 13:09

Elye