13

我收到以下警告:

自定义视图 com/example/view/adapter/SomeAdapter 缺少工具使用的构造函数:(Context) 或 (Context,AttributeSet) 或 (Context,AttributeSet,int)

在我的类 SomeAdapter 中,它扩展了一些 BaseAdapter,它扩展了 ArrayAdapter

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

该警告存在于具体适配器中,但不存在于抽象 BaseAdapter 中。有没有人在这种情况下听说过这个警告?

AFAIK Android 通过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;
}

据我所知,我的类名与上面的模式不匹配。有谁知道如何修复或抑制此警告?

BaseAdapter 中的 getView():

@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;
}
4

4 回答 4

12

在您的 CustomView 类中添加构造函数:

public CustomView(Context context) {
    super(context);
}
public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
}
于 2013-06-12T10:29:52.410 回答
3

请在 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) {
    }
}
于 2019-07-22T03:53:55.473 回答
2

一些布局工具(例如 Eclipse 的 Android 布局编辑器)需要找到具有以下签名之一的构造函数: * View(Context context) * View(Context context, AttributeSet attrs) *View(Context context, AttributeSet attrs, int defStyle)

如果您没有使用这些东西,而只是想为您的所有项目摆脱这个警告,请转到:

窗口 -> 首选项 -> Android -> Lint 错误检查。

从列表中查找ViewConstructor并将严重性设置为'ignore'

于 2013-07-11T16:49:19.473 回答
1

您正在使用自定义 View 类,您需要将缺少的构造函数添加到您的类中。

在 Java 中,您可以使用 Jarvis 的回答:

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

它在 Kotlin 中更紧凑:

class YourCustomView @JvmOverloads constructor(
        context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr)
于 2019-11-17T11:00:54.520 回答