【问题标题】:How to inserting a custom view in XML in Android如何在 Android 中的 XML 中插入自定义视图
【发布时间】:2014-06-17 13:26:01
【问题描述】:

我有一个扩展类ViewA类

我有一个 class B,它扩展了 class A

现在我正在尝试将 class B 添加到我的 xml 中,但是我无法做到这一点,而我可以将 class A 添加到我的 xml 中。

我注意到的另一件事是,所有其他直接扩展 View 的自定义类在我的 xml 中都是可见的。

我想知道是否有任何方法可以添加一个扩展另一个类的类,该类又将View 扩展到我的xml 中?

注意:我使用的是正确的 xml 格式和完整的包名。

A 级

public class A extends View implements Serializable{

    public A(final Context context, final AttributeSet attrs,
            final int defStyle, final SomeEnum myType) {
        super(context, attrs, defStyle);
    }

    public A(final Context context, final AttributeSet attrs,
            final SomeEnum myType) {
        this(context, attrs, 0, testStateType);
    }

    public A(final Context context,
            final SomeEnum myType) {
        this(context, null, 0, testStateType);
    }

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

    @Override
    protected void onSizeChanged(final int w, final int h, final int oldw,
            final int oldh) {
        invalidate();
    }

    @Override
    protected void onMeasure(final int widthMeasureSpec,
            final int heightMeasureSpec) {
    }

    @Override
    protected void onDraw(Canvas canvas) {

    }
}

B 类

public class B extends A
{
    public B(final Context context,
            final AttributeSet attrs, final int defStyle, final SomeEnum myType)
    {
        super(context, attrs, defStyle, testStateType);
    }

    public B(final Context context, final AttributeSet attrs, final SomeEnum myType)
    {
        this(context, attrs, 0, testStateType);
    }

    public B(final Context context, final SomeEnum myType)
    {
        this(context, null, 0, testStateType);
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);
    }
}

【问题讨论】:

  • “我无法添加”是什么意思?有些事情不允许你这样做?
  • 这样做应该没有任何问题。您需要发布 XML
  • 要在 xml 中添加自定义视图,您需要使用它的完整包名称,例如 <com.myproj.myview.CustomElement ...\>
  • @AndroidWarrior 我认为 Ctrl+Space 不会显示您的自定义视图,我认为它只显示 android 的默认值。
  • @AndroidWarrior 这没有任何意义。您尝试输入和编译吗?

标签: android android-xml android-custom-view


【解决方案1】:

类 B 缺少具有默认参数的构造函数。添加:

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

到您的班级,您将能够使用其他视图从 XML 扩充它。

通常,将自定义参数添加到视图的构造函数不是一个好习惯。为此使用自定义属性。

【讨论】:

    【解决方案2】:

    自定义视图必须具有以下构造函数:

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

    看起来您只有接收 SomeEnum 参数的重载,但 LayoutInflater 不知道如何调用它们。

    【讨论】:

    • 非常接近答案伴侣,但SomeEnum 参数不会引起任何问题。尽管正如@ivagarz 所说,这不是一个好习惯。 +1 解释。
    • 这正是我的意思......你可以有额外的构造函数,但其​​他的都是必需的。你只有那些接收 SomeEnum 的人。
    【解决方案3】:

    为什么会出现 android inflating 异常错误?

    主要是由于 xml 错误引起的。如果您试图通过非法资源、布局等设置视图的属性,您的程序将像您的大脑一样崩溃。例如:您不能通过布局xml文件设置textView背景,您很清楚这一点。但它可能会在您快速使用 eclipse 建议时发生。查看 logcat 你可以看到“Binary XML file line 20 or something”。它告诉你错误在哪一行。

    原因:

    android.view.InflateException: Binary XML file line #9: Error inflating class

    解决方案:

    这说明没有找到您定义的类名。仔细检查类名或检查构建路径。 如果其中一个资源具有高像素分辨率,则将占用大量内存,从而导致膨胀异常。

    更多常见的android InflateExceptions:Android.view.InflateException: Binary XML file line # xx

    【讨论】:

    • 只需尝试上面的类,即没有@ivagarz 提到的构造函数。在您的 xml 中使用您的类的完整限定名称,并尝试在您的 getView() 中添加它。你不会收到ComileTimeException,而是RunTimeException,即android.view.InflateException
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多