Error al inflar la clase de botón personalizado. NoSuchMethodException
Estoy intentando crear un botón de encargo con dos campos del texto. Cuando creo una instancia de código, funciona. Cuando intento e inflado de XML se bloquea.
Lo que he hecho hasta ahora para tratar de resolver este problema:
- Visor dinámico de altura
- Aplicar como listview
- Cómo leer atributos personalizados en Android
- El lienzo no dibuja en Vista personalizada
- Código de ejemplo que extiende la clase View y el uso del archivo xml de diseño
- Seguido y entendido el ejemplo de código LabelView en el SDK.
- Seguido y entendido esta excelente presentación personalizada de Devoxx FlowLayout .
- Seguido y entendido numerosos tutoriales sobre el tema.
- Pasó horas revisando preguntas similares en stackoverflow.
- Despojado el código de nuevo a los conceptos básicos de simplemente pasar el atributo establecido en hasta la clase super.
De las preguntas que he leído, la causa más común no está definiendo el constructor requerido que toma el conjunto del atributo ie
MyClass(Context context, AttributeSet attrs) { super(context, attrs); }
Cerca del final de la lista de errores en LogCat tengo:
Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
Esto podría llevar a la conclusión de que he cometido el mismo error que muchos otros, pero cuando miras mi código a continuación puedes ver que he definido el constructor de este formulario.
Parece que estoy haciendo exactamente lo que dicen todas las fuentes. Simplemente no puedo ver lo que estoy perdiendo.
Src / com.soundconception.custombuttontest2 / TitledValueButton.java
package com.soundconception.custombuttontest2; import android.content.Context; import android.util.AttributeSet; import android.widget.Button; public class TitledValueButton extends Button { public TitledValueButton(Context context) { super(context); } protected TitledValueButton(Context context, AttributeSet attrs) { super(context, attrs); } }
Res / values / attrs.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="TitledValueButton"> <attr name="titleText" format="string" /> </declare-styleable> </resources>
Res / layout / activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res/com.soundconception.custombuttontest2" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <com.soundconception.custombuttontest2.TitledValueButton android:id="@+id/test_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1..2..3.." app:titleText="Testing" /> </RelativeLayout>
Src / com.soundconception.custombuttontest2 / MainActivity.java
package com.soundconception.custombuttontest2; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
LogCat
threadid=1: thread exiting with uncaught exception (group=0x41a5a700) FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{com.soundconception.custombuttontest2/com.soundconception.custombuttontest2.MainActivity}: android.view.InflateException: Binary XML file line #13: Error inflating class com.soundconception.custombuttontest2.TitledValueButton at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) at android.app.ActivityThread.access$600(ActivityThread.java:141) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) Caused by: android.view.InflateException: Binary XML file line #13: Error inflating class com.soundconception.custombuttontest2.TitledValueButton at android.view.LayoutInflater.createView(LayoutInflater.java:603) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696) at android.view.LayoutInflater.rInflate(LayoutInflater.java:755) at android.view.LayoutInflater.inflate(LayoutInflater.java:492) at android.view.LayoutInflater.inflate(LayoutInflater.java:397) at android.view.LayoutInflater.inflate(LayoutInflater.java:353) at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:267) at android.app.Activity.setContentView(Activity.java:1895) at com.soundconception.custombuttontest2.MainActivity.onCreate(MainActivity.java:12) at android.app.Activity.performCreate(Activity.java:5133) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) ... 11 more Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet] at java.lang.Class.getConstructorOrMethod(Class.java:423) at java.lang.Class.getConstructor(Class.java:397) at android.view.LayoutInflater.createView(LayoutInflater.java:568) ... 22 more
- Llene el gráfico sinusoidal de Android
- No se encontró ningún recurso que coincida con el nombre dado '@ style / Widget.RatingBar.Small'
- Disposición de la vista Lista de Android Similar a Google play
- Cómo usar una misma fontface personalizada para toda la vista en android?
- Custom attr get devuelve valores inválidos
- Establecer valor de enum en xml del recurso
- Botones circulares Vista de grupo
- Android - Personalización del widget Spinner Look and Feel
Falta este constructor:
public TitledValueButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); }
Agregue este constructor a su clase de botón personalizado.
Falta un constructor más. Añadir esto para eliminar el accidente.
public TitledValueButton(Context context, AttributeSet attrs) { super(context, attrs); // This should be first line of constructor }
y
public TitledValueButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); }
Recuerde que el constructor debe estar en modo público.
Tuve el mismo mensaje de error al intentar declarar una clase interna no estática en mi diseño (con el signo de dólar). Simplemente agregando el keywoard static
a mi clase hizo que funcionara.
- Cargador de archivos Android OpenGL .OBJ
- Java.lang.SecurityException:! @Too muchas alarmas (500) registradas de pid 10790 uid 10206