2012-08-24 18 views
5

Sto costruendo la mia app in modo che possa beneficiare di più temi.Creazione di un'app personalizzata per arresti anomali dello stile

Sono arrivato allo stadio in cui desidero aggiungere elementi personalizzati, ad es.

<style name="My.Theme.Default"> 
... 
    <item name="borderColorDialog">@color/red</item> 
... 
</style> 

<style name="My.Theme.Blue"> 
... 
    <item name="borderColorDialog">@color/blue</item> 
... 
</style> 

Così ho aggiunto l'attributo borderColorDialog al mio file attr come segue:

<attr name="borderColorDialog" format="color" /> 

Ora voglio provarlo. Ho un disegnabile come segue:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list 
    xmlns:android="http://schemas.android.com/apk/res/android" > 

    <item> 

     <shape 
      android:shape="rectangle" > 

      <solid 
       android:color="?borderColorDialog" /> 

     </shape> 

    </item> 

    <item 
     android:bottom="2dp"> 

     <shape 
      android:shape="rectangle" > 

      <solid 
       android:color="@color/black" /> 

     </shape> 

    </item> 
</layer-list> 

Tutto questo appare logicamente suonerà per me, tuttavia il riferimento ?borderColorDialog blocca l'emulatore:

E/AndroidRuntime(1461): FATAL EXCEPTION: main 
E/AndroidRuntime(1461): java.lang.RuntimeException: Unable to start activity ComponentInfo{.MainActivity}: android.view.InflateException: Binary XML file line #26: Error inflating class com.android.internal.widget.ActionBarContainer 
E/AndroidRuntime(1461):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
E/AndroidRuntime(1461):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
E/AndroidRuntime(1461):  at android.app.ActivityThread.access$600(ActivityThread.java:130) 
E/AndroidRuntime(1461):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
E/AndroidRuntime(1461):  at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(1461):  at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime(1461):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
E/AndroidRuntime(1461):  at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(1461):  at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime(1461):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
E/AndroidRuntime(1461):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
E/AndroidRuntime(1461):  at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(1461): Caused by: android.view.InflateException: Binary XML file line #26: Error inflating class com.android.internal.widget.ActionBarContainer 
E/AndroidRuntime(1461):  at android.view.LayoutInflater.createView(LayoutInflater.java:613) 
E/AndroidRuntime(1461):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687) 
E/AndroidRuntime(1461):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 
E/AndroidRuntime(1461):  at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
E/AndroidRuntime(1461):  at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
E/AndroidRuntime(1461):  at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
E/AndroidRuntime(1461):  at com.android.internal.policy.impl.PhoneWindow.generateLayout(PhoneWindow.java:2784) 
E/AndroidRuntime(1461):  at com.android.internal.policy.impl.PhoneWindow.installDecor(PhoneWindow.java:2844) 
E/AndroidRuntime(1461):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:252) 
E/AndroidRuntime(1461):  at android.app.Activity.setContentView(Activity.java:1867) 
E/AndroidRuntime(1461):  at .MainActivity.onCreate(MainActivity.java:30) 
E/AndroidRuntime(1461):  at android.app.Activity.performCreate(Activity.java:5008) 
E/AndroidRuntime(1461):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
E/AndroidRuntime(1461):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
E/AndroidRuntime(1461):  ... 11 more 
E/AndroidRuntime(1461): Caused by: java.lang.reflect.InvocationTargetException 
E/AndroidRuntime(1461):  at java.lang.reflect.Constructor.constructNative(Native Method) 
E/AndroidRuntime(1461):  at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
E/AndroidRuntime(1461):  at android.view.LayoutInflater.createView(LayoutInflater.java:587) 
E/AndroidRuntime(1461):  ... 24 more 
E/AndroidRuntime(1461): Caused by: android.content.res.Resources$NotFoundException: File res/drawable/actionbar_background.xml from drawable resource ID #0x7f020001 
E/AndroidRuntime(1461):  at android.content.res.Resources.loadDrawable(Resources.java:1918) 
E/AndroidRuntime(1461):  at android.content.res.TypedArray.getDrawable(TypedArray.java:601) 
E/AndroidRuntime(1461):  at android.view.View.<init>(View.java:3336) 
E/AndroidRuntime(1461):  at android.view.ViewGroup.<init>(ViewGroup.java:427) 
E/AndroidRuntime(1461):  at android.widget.FrameLayout.<init>(FrameLayout.java:101) 
E/AndroidRuntime(1461):  at android.widget.FrameLayout.<init>(FrameLayout.java:97) 
E/AndroidRuntime(1461):  at com.android.internal.widget.ActionBarContainer.<init>(ActionBarContainer.java:52) 
E/AndroidRuntime(1461):  ... 27 more 
E/AndroidRuntime(1461): Caused by: java.lang.UnsupportedOperationException: Can't convert to color: type=0x2 
E/AndroidRuntime(1461):  at android.content.res.TypedArray.getColor(TypedArray.java:326) 
E/AndroidRuntime(1461):  at android.graphics.drawable.GradientDrawable.inflate(GradientDrawable.java:951) 
E/AndroidRuntime(1461):  at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:881) 
E/AndroidRuntime(1461):  at android.graphics.drawable.LayerDrawable.inflate(LayerDrawable.java:165) 
E/AndroidRuntime(1461):  at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:881) 
E/AndroidRuntime(1461):  at android.graphics.drawable.Drawable.createFromXml(Drawable.java:818) 
E/AndroidRuntime(1461):  at android.content.res.Resources.loadDrawable(Resources.java:1915) 
E/AndroidRuntime(1461):  ... 33 more 

L'errore va avanti e avanti. Fondamentalmente riferimento all'XML.

Il ritorno a @color/red funziona correttamente.

Come posso risolvere questo?

+0

si può mostrare l'intero errore? Solo quel componente non è abbastanza. – Eric

+0

@Eric Che ne pensi di questo. – HGPB

+1

Mmmh ... sì, non sono sicuro che questo possa essere fatto nel modo desiderato. Voglio dire, puoi impostare una risorsa colore invece di un attributo, ma non è ottimale per i temi. Potresti provare a farlo [tramite codice] (http://stackoverflow.com/questions/7896615/android-how-to-get-value-of-an-attribute-in-code), ma non sei l'unico uno per avere questo problema ([1] (http://stackoverflow.com/questions/8041537/how-to-reference-style-attributes-from-a-drawable), [2] (http://stackoverflow.com)/questions/7529574/how-to-reference-from-drawable-to-style)) ... quindi penso che questa sia solo una limitazione del sistema operativo Android. – Eric

risposta

2

Android non consente nella mia esperienza di fare riferimento a un colore con un attributo in un disegno. Ho risolto il problema con una soluzione alternativa creando una forma per tema. Ho pubblicato una descrizione come una risposta ad una precedente interrogazione qui:

https://stackoverflow.com/a/13471695/891479

Problemi correlati