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.

  • Error desconocido en xpath (utilizando xmlpullparser)
  • XmlPullParserException sólo en ICS
  • Diferencia entre el analizador XML SAX, analizador de tracción y analizador de DOM en android
  • Android ksoap llamada xmlpullparser excepción
  • Xml extraer elementos del analizador xml
  • XmlPullParser - token inesperado (android)
  • XmlPullParser obtener archivo del sistema de archivos
  • Analizador XML personalizado de Android falla al resolver el espacio de nombres android
  • Android: El mejor analizador para analizar datos XML
  • XmlPullParser: obtener texto interno incluyendo etiquetas XML
  • XmlPullParser - Analizar etiqueta analizada
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.