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
- Android: El mejor analizador para analizar datos XML
- KXmlParser lanza la excepción "Símbolo inesperado" al inicio de RSS pasing
- Error desconocido en xpath (utilizando xmlpullparser)
- XmlPullParser: obtener texto interno incluyendo etiquetas XML
- Net.sqlcipher.database.SQLiteException: no es un error:
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
?
- ¿Existe una manera de enumerar las funciones XMLPullParser disponibles en el dispositivo Android actual?
- XmlPullParser obtener nodos secundarios
- Cómo obtener un valor de nodo con XmlPullParser
- XmlPullParser no funciona con InputStream
- XmlPullParser obtener archivo del sistema de archivos
- ArrayIndexOutOfBoundsException en el KXmlParser de android
- Diferencia entre el analizador XML SAX, analizador de tracción y analizador de DOM en android
- ¿Por qué Android XmlPullParser REALMENTE lento en mi dispositivo más antiguo?
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.