2012-08-01 14 views
25

Quiero hacer una costumbre RelativeLayout, pero me siguen dando este error:¿Cómo extiendo correctamente una clase de diseño?

08-01 02:28:19.385: E/AndroidRuntime(9989): FATAL EXCEPTION: main 
08-01 02:28:19.385: E/AndroidRuntime(9989): android.view.InflateException: Binary XML  file line #1: Error inflating class com.stevenschoen.putio.CheckableRelativeLayout 
08-01 02:28:19.385: E/AndroidRuntime(9989):  at  android.view.LayoutInflater.createView(LayoutInflater.java:596) 
08-01 02:28:19.385: E/AndroidRuntime(9989):  at  android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687) 
08-01 02:28:19.385: E/AndroidRuntime(9989):  at  android.view.LayoutInflater.inflate(LayoutInflater.java:466) 
08-01 02:28:19.385: E/AndroidRuntime(9989):  at  android.view.LayoutInflater.inflate(LayoutInflater.java:396) 

... 

08-01 02:28:19.385: E/AndroidRuntime(9989): Caused by: java.lang.NoSuchMethodException:  <init> [class android.content.Context, interface android.util.AttributeSet] 
08-01 02:28:19.385: E/AndroidRuntime(9989):  at  java.lang.Class.getConstructorOrMethod(Class.java:460) 
08-01 02:28:19.385: E/AndroidRuntime(9989):  at  java.lang.Class.getConstructor(Class.java:431) 
08-01 02:28:19.385: E/AndroidRuntime(9989):  at  android.view.LayoutInflater.createView(LayoutInflater.java:561) 

Y aquí es mi clase:

public class CheckableRelativeLayout extends RelativeLayout implements 
     Checkable { 

    public CheckableRelativeLayout(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
    } 

    private boolean isChecked; 
// List<Checkable> checkableViews = new ArrayList<Checkable>(); 

    // @see android.widget.Checkable#isChecked() 
    public boolean isChecked() { 
     return isChecked; 
    } 

    // @see android.widget.Checkable#setChecked(boolean) 
    public void setChecked(boolean isChecked) { 
     this.isChecked = isChecked; 
//  for (Checkable c : checkableViews) { 
      // Pass the information to all the child Checkable widgets 
//   c.setChecked(isChecked); 
//  } 
    } 

    // @see android.widget.Checkable#toggle() 
    public void toggle() { 
     this.isChecked = !this.isChecked; 
//  for (Checkable c : checkableViews) { 
      // Pass the information to all the child Checkable widgets 
//   c.toggle(); 
//  } 
    } 

    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 

     final int childCount = this.getChildCount(); 
     for (int i = 0; i < childCount; ++i) { 
      findCheckableChildren(this.getChildAt(i)); 
     } 
    } 

    /** 
    * Add to our checkable list all the children of the view that implement the 
    * interface Checkable 
    */ 
    private void findCheckableChildren(View v) { 
     if (v instanceof Checkable) { 
//   this.checkableViews.add((Checkable) v); 
     } 

     if (v instanceof ViewGroup) { 
      final ViewGroup vg = (ViewGroup) v; 
      final int childCount = vg.getChildCount(); 
      for (int i = 0; i < childCount; ++i) { 
       findCheckableChildren(vg.getChildAt(i)); 
      } 
     } 
    } 
} 

¿Qué estoy haciendo mal?

+0

Estoy utilizando este mismo código para ListView con opción simple con radio en el lado izquierdo de la fila, no puedo verificar un elemento cuando cargo esta lista por primera vez, ya que tengo que mostrar un elemento predeterminado pre seleccionado. – Puneet

Respuesta

80

Has implementado solo un constructor. Para ser vistas capaz de utilizar en XML, se deben implementar otros 2 constructores de Vista:

public CheckableRelativeLayout(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public CheckableRelativeLayout(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 
+2

¡Ah! Ojalá Lint me hubiera advertido sobre eso. ¡Gracias! –

+2

Tengo que agregar un "gracias" aquí para eso. Pasar siglos preguntándome por qué mi clase personalizada se estaba cayendo. – RichieHH

4

te olvidó anular constructor, cada diseño puede ser creado a partir de código o de XML y para la creación utilizaron diferentes constructores, anular otra

+2

¿Alguna referencia de por qué es necesario implementar los otros dos constructores? –

Cuestiones relacionadas