2012-07-25 7 views
7

He una TextView personalizada que implementa los tres Ver constructores (nb, este es mi primer intento de una aplicación para Android):La implementación ampliada/encargo Ver tiros NoSuchMethod para el constructor

public class DynamicGeometryTextView extends TextView { 

    public DynamicGeometryTextView (Context con) { super(con); } 

    public DynamicGeometryTextView (Context con, AttributeSet attrs) { 
     super(con, attrs); 
    } 

    public DynamicGeometryTextView (Context con, AttributeSet attrs, int style) { 
     super(con, attrs, style); 
    } 

Esto es un no-estático clase interna, ya que necesita acceder a datos de instancia desde la clase externa. Aparece en un diseño .xml:

<view class="cogdis.chalkboard.DisplayText$DynamicGeometryTextView" 
    android:id="@+id/chalkboard" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

Todo compila e instala bien, pero en tiempo de ejecución:

Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class cogdis.chalkboard.DisplayText$DynamicGeometryTextView 
    at android.view.LayoutInflater.createView(LayoutInflater.java:596)                   
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)                 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)                   
    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)                    
    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)                    
    at android.view.LayoutInflater.inflate(LayoutInflater.java:352)                    
    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)              
    at android.app.Activity.setContentView(Activity.java:1867)                     
    at cogdis.chalkboard.DisplayText.onCreate(DisplayText.java:26)                    
    at android.app.Activity.performCreate(Activity.java:5008)                     
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)                
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)                
    ... 11 more                                 
Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]      
    at java.lang.Class.getConstructorOrMethod(Class.java:460)                     
    at java.lang.Class.getConstructor(Class.java:431)                       
    at android.view.LayoutInflater.createView(LayoutInflater.java:561)                   
    ... 22 more          

Para mi ojo, esto implica que no puede encontrar el (Contexto, AttributeSet) versión del constructor ... pero existe. He visto algunas otras publicaciones de SO, como Android Custom View Constructor, todo esto apunta a la misma conclusión (a mi juicio) y leí la Guía de la API en componentes personalizados repetidamente, pero me he quedado perplejo con esto por más de una hora.

¿Alguien tiene alguna idea? ¿Hay alguna manera de depurar esto más?

para la posteridad, es decir., Cualquier persona nueva en este como yo, las clases internas no estáticos son un no-go si se hace referencia a su costumbre Vista en un diseño de XML, pero si lo crea mediante programación, puede funcionar , por ejemplo:

LayoutInflater lif = getLayoutInflater(); 
    ViewGroup layout = (ViewGroup)lif.inflate(R.layout.board, null); 

    tv = new DynamicGeometryTextView(this); 

    layout.addView((View)tv); 

En este caso, solo necesita hacer coincidir los constructores que realmente usa. Los parámetros de diseño (WRAP_CONTENT, etc.) se pueden establecer en el constructor a través del setLayoutParams() que se hereda de la Vista.

+1

Sólo para reducir la causa, puede eliminar las referencias a la clase externa y hacer que tu clase TextView estética? –

+0

@ DheerajV.S .: Sí, y de hecho eso resuelve el problema:/ – delicateLatticeworkFever

Respuesta

9

No hay forma de instanciar una clase interna no estática without reference to an instance of the outer class.

OuterClass.InnerClass innerObject = outerObject.new InnerClass(); 

Así que esta podría ser la razón por la que el inflador de diseño no pudo inflar su clase. Haga que su clase sea estática después de eliminar las referencias a los miembros de la clase externa.

+0

! @ $ # Creo que intentaré instanciarlo sin el diseño xml primero, hay un montón de acoplamiento. – delicateLatticeworkFever

9

Cambio:

public class DynamicGeometryTextView extends TextView { 

Para:

public static class DynamicGeometryTextView extends TextView { 

Con el fin de hacer referencia correctamente, debe ser una clase interna static

Cuestiones relacionadas