Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I properly extend a layout class?

I want to make a custom RelativeLayout, but I keep getting this error:

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)

And here's my class:

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));
            }
        }
    }
}

What am I doing wrong?

like image 855
Steven Schoen Avatar asked Sep 11 '25 05:09

Steven Schoen


2 Answers

You implemented only one constructor. To be able use views in xml, you should implement 2 other constructors from View:

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

public CheckableRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}
like image 171
Alex Orlov Avatar answered Sep 12 '25 18:09

Alex Orlov


You forgot to override constructor, each layout can be created from code or from XML and for creation used different constructors, override another one

like image 40
Dmitriy Tarasov Avatar answered Sep 12 '25 17:09

Dmitriy Tarasov