Custom view is missing constructor used by tools for adapter

风格不统一 提交于 2019-12-23 08:00:17

问题


I got the following warning:

Custom view com/example/view/adapter/SomeAdapter is missing constructor used by tools: (Context) or (Context,AttributeSet) or (Context,AttributeSet,int)

in my class SomeAdapter which extends some BaseAdapter which extends ArrayAdapter

public class SomeAdapter extends BaseAdapter{}
public abstract class BaseAdapter extends ArrayAdapter<SomeModel>{}

The warning exists in the concrete adapter but not in the abstract BaseAdapter. Has anyone ever heard of this warning in that context?

AFAIK Android checks classes for they are extending views by checking the name of the super classes via ViewConstructorDetector:

 private static boolean isViewClass(ClassContext context, ClassNode node) {
    String superName = node.superName;
    while (superName != null) {
        if (superName.equals("android/view/View")                //$NON-NLS-1$
                || superName.equals("android/view/ViewGroup")    //$NON-NLS-1$
                || superName.startsWith("android/widget/")       //$NON-NLS-1$
                && !((superName.endsWith("Adapter")              //$NON-NLS-1$
                        || superName.endsWith("Controller")      //$NON-NLS-1$
                        || superName.endsWith("Service")         //$NON-NLS-1$
                        || superName.endsWith("Provider")        //$NON-NLS-1$
                        || superName.endsWith("Filter")))) {     //$NON-NLS-1$
            return true;
        }

        superName = context.getDriver().getSuperClass(superName);
    }

    return false;
}

As far as I can see my class names don't match the pattern above. Does anyone has any idea how to fix or suppress this warning?

getView() in BaseAdapter:

@Override
public final View getView(final int position, final View convertView, final ViewGroup parent) {
    View view = convertView;
    if (null == view) {
        view = createNewView(parent, position);
    } else {
        reuseOldView(view, position);
    }
    return view;
}

回答1:


In your CustomView class add constructors:

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



回答2:


Some layout tools (such as the Android layout editor for Eclipse) needs to find a constructor with one of the following signatures: * View(Context context) * View(Context context, AttributeSet attrs) * View(Context context, AttributeSet attrs, int defStyle)

If you are not using such things, and just want to get rid of this warning for all your projects just go to:

Window -> Preferences -> Android -> Lint Error Checking.

Find ViewConstructor from the list and set the severity to 'ignore'.




回答3:


Please try below in Kotlin:-

 class CustomView: View {
    constructor(context: Context) : this(context, null)
    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
    }
}



回答4:


In Kotlin:

class KotlinView @JvmOverloads constructor(
        context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr)


来源:https://stackoverflow.com/questions/17063090/custom-view-is-missing-constructor-used-by-tools-for-adapter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!