2012-08-24 20 views
5

Estoy compilando mi aplicación para que pueda beneficiarse de múltiples temas.Creación de aplicaciones personalizadas de clics de estilo

Llegué al punto en el que deseo agregar elementos personalizados, p.

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

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

Así que hemos añadido el atributo borderColorDialog a mi archivo attr de la siguiente manera:

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

Ahora quiero probarlo. Tengo un estirable de la siguiente manera:

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

Todo esto aparece lógicamente sonar a mí, sin embargo la referencia ?borderColorDialog bloquea el emulador:

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 

El error sigue y sigue. Básicamente se refiere al XML.

Volviendo a @color/red funciona bien.

¿Cómo puedo solucionar esto?

+0

puedo mostrar todo el error? Solo ese componente realmente no es suficiente. – Eric

+0

@Eric ¿Qué tal eso? – HGPB

+1

Mmmh ... sí, no estoy seguro de que esto pueda hacerse de la manera que desee. Quiero decir, puede configurar un recurso de color en lugar de un atributo, pero eso no es óptimo para los temas. Podrías intentar hacerlo [a través del código] (http://stackoverflow.com/questions/7896615/android-how-to-get-value-of-an-attribute-in-code), pero no eres el único uno para tener este 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)) ... así que estoy pensando que esto es solo una restricción del sistema operativo Android. – Eric

Respuesta

2

Android no permite en mi experiencia hacer referencia a un color con un atributo en un dibujable. Resolví el problema con una solución alternativa que creaba una forma por tema. He publicado una descripción como una respuesta a una pregunta anterior aquí:

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

Cuestiones relacionadas