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:

  • 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 

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.

  • ¿El editor de diseño de Android Studio muestra propiedades de vista personalizada?
  • Rellenar lista de vista personalizada mediante ListFragment
  • Desliza para elegir Android
  • Cómo utilizar Path (android.graphics.Path) con lienzo en android?
  • Lona transparente para Android con transparencia
  • Android: cambia la vista de título personalizado en tiempo de ejecución
  • Vista personalizada CustomView no utiliza los constructores de vista de 2 o 3 argumentos
  • CastClassException en vista personalizada
  • Crear subviews de Android como subvisiones de iOS
  • No se encontró ningún identificador de recurso para el atributo '' in package 'com.app ...'
  • Soporte para diferentes resoluciones android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.