Cómo crear un AttributeSet en Android?

Estoy tratando de escribir algún código en Android para establecer los parámetros en un archivo AttributeSet attrs.xml. Pero estoy recibiendo un error de "Recurso no encontrado".

Código Java

MainActivity.java

 package com.example.mycompoundbutton; import org.xmlpull.v1.XmlPullParser; import android.os.Bundle; import android.util.AttributeSet; import android.util.Xml; import android.app.Activity; import android.content.res.Resources; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Resources res = this.getResources(); XmlPullParser parser = res.getXml(R.attr.xyz); AttributeSet attrs = Xml.asAttributeSet(parser); MyCompound my = new MyCompound(this,attrs); my.MyTestFun(300,500); } } 

MyCompound.java

 package com.example.mycompoundbutton; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.widget.CompoundButton; public class MyCompound extends CompoundButton { public MyCompound(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MyCustomView, R.attr.xyz, 0); a.recycle(); } public void MyTestFun(int x,int y) { // Some Code to Execute }} 

Attrs.xml

 <resources> <declare-styleable name="MyCustomView"> <attr name="abc" format="integer"/> <attr name="pqr" format="integer" /> </declare-styleable> <attr name="xyz" format="integer"/> </resources> 

Error:

 05-11 07:29:27.345: E/AndroidRuntime(1919): FATAL EXCEPTION: main 05-11 07:29:27.345: E/AndroidRuntime(1919): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mycompoundbutton/com.example.mycompoundbutton.MainActivity}: android.content.res.Resources$NotFoundException: Resource ID #0x7f010000 05-11 07:29:27.345: E/AndroidRuntime(1919): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 05-11 07:29:27.345: E/AndroidRuntime(1919): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 05-11 07:29:27.345: E/AndroidRuntime(1919): at android.app.ActivityThread.access$600(ActivityThread.java:141) 05-11 07:29:27.345: E/AndroidRuntime(1919): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 05-11 07:29:27.345: E/AndroidRuntime(1919): at android.os.Handler.dispatchMessage(Handler.java:99) 05-11 07:29:27.345: E/AndroidRuntime(1919): at android.os.Looper.loop(Looper.java:137) 05-11 07:29:27.345: E/AndroidRuntime(1919): at android.app.ActivityThread.main(ActivityThread.java:5103) 05-11 07:29:27.345: E/AndroidRuntime(1919): at java.lang.reflect.Method.invokeNative(Native Method) 05-11 07:29:27.345: E/AndroidRuntime(1919): at java.lang.reflect.Method.invoke(Method.java:525) 05-11 07:29:27.345: E/AndroidRuntime(1919): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 05-11 07:29:27.345: E/AndroidRuntime(1919): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 05-11 07:29:27.345: E/AndroidRuntime(1919): at dalvik.system.NativeStart.main(Native Method) 05-11 07:29:27.345: E/AndroidRuntime(1919): Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f010000 05-11 07:29:27.345: E/AndroidRuntime(1919): at android.content.res.Resources.getValue(Resources.java:1118) 05-11 07:29:27.345: E/AndroidRuntime(1919): at android.content.res.Resources.loadXmlResourceParser(Resources.java:2304) 05-11 07:29:27.345: E/AndroidRuntime(1919): at android.content.res.Resources.getXml(Resources.java:983) 05-11 07:29:27.345: E/AndroidRuntime(1919): at com.example.mycompoundbutton.MainActivity.onCreate(MainActivity.java:24) 05-11 07:29:27.345: E/AndroidRuntime(1919): at android.app.Activity.performCreate(Activity.java:5133) 05-11 07:29:27.345: E/AndroidRuntime(1919): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 05-11 07:29:27.345: E/AndroidRuntime(1919): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 05-11 07:29:27.345: E/AndroidRuntime(1919): ... 11 more 

Por lo tanto, aquí está todo el código anterior y descripción del error. Quiero llamar a la clase MainActivity de MainActivity . Sé cómo hacerlo usando un archivo XML como

 <com.example.mycompoundbutton.MyCompound ... attributes here ... > </com.example.mycompoundbutton.MyCompound> 

Esta estructura anterior me ayudará a diseñar un diseño personalizado estático, pero no me ayudará a diseñar un diseño dinámico.

Entonces, ¿cómo puedo llamar a la clase MainActivity de MainActivity con un AttributeSet ?

Creo que su problema es escuchar

 TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MyCustomView, R.attr.xyz, 0); 

"R.attr.xyz" no es encontrado. Puede ver este clic Escuchar

Al volver a leer, uno de sus problemas residirá en el hecho de que el atributo xyz se declara fuera de CustomViewStyleable en attrs.xml .


En lugar de llamar al constructor de su vista personalizada directamente, puede permitir que el sistema lo manipule inflando su vista personalizada desde xml.

Cree un archivo de diseño xml que contenga sólo su vista personalizada, por ejemplo, view_my_compound.xml :

 <?xml version="1.0" encoding="utf-8"?> <com.example.mycompoundbutton.MyCompound xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" app:xyz="2" /> 

Luego, en su Actividad, sólo lo inflarán:

 // the view which will contain your MyCompoundButton View container = findViewById(R.id.XXXXXXXX); LayoutInflater inflater = getLayoutInflater(); MyCompound button = (MyCompound) inflater.inflate(R.layout.view_my_compound, container, true); 

De esta manera no es necesario considerar el atributo establecido aparte de dentro de su clase de vista; Android llamará al MyCompound(Context, AttributeSet) para usted, con los valores establecidos en el archivo de diseño XML.

Si necesita establecer el parámetro XYZ mediante programación, exponga un método público en MyCompound que le permite establecerlo.

Sugiero usar una etiqueta <com.example.mycompoundbutton.MyCompound> en activity_main.xml en lugar de intentar crear una instancia en su código Java. Esto permitirá que Android infle su vista cuando llama a setContentView() sin jugar con un inflador usted mismo. Puede aplicar todos los atributos estándar a esta etiqueta, incluido android:id . A continuación, puede hacer findViewById() para obtener una referencia a la vista de MyCompound , al igual que lo hace con cualquier vista estándar.

  • Xml extraer elementos del analizador xml
  • Manejando espacios de nombres Xml con XmlPullParser
  • Android ksoap llamada xmlpullparser excepción
  • ¿Cómo extracto el texto de un xml anidado usando xmlpullparser en android?
  • XmlPullParserException al analizar un archivo de recursos en Android
  • XmlPullParser getAttributeValue devuelve null
  • XmlPullParser - token inesperado (android)
  • XmlPullParser: PI no debe comenzar con xml, pero solo en Android 2.3.3 hacia abajo
  • Android org.xmlpull.v1.XmlPullParserException al analizar XML
  • XmlPullParserException sólo en ICS
  • Parser SAX vs analizador XMLPull
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.