60

在 Android Studio 中,布局编辑器无法预览 xml 中的自定义视图。

非常简单的例子:

public class MyCustomView extends FrameLayout {
    public MyCustomView(Context context) {
        super(context);
    }

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

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

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <com.myprojectxxx.view.MyCustomView
        android:layout_width="48dp"
        android:layout_height="48dp" />

</LinearLayout>

Android Studio 总是说,

渲染问题

找不到以下类:

  • com.myprojectxxx.view.MyCustomView(修复构建路径,创建类)

提示:尝试构建项目

当然,我有这门课。如果我单击“创建类”,它会抱怨同一个类已经存在。如果我重建那个项目,什么都不会改变。

而且,是的,该项目在我的 Android 设备上运行良好。此外,它在 Eclipse ADT 中呈现得非常好。但是,在 Android Studio 中,它总是说“无法找到类”。

Android Studio 不能预览带有自定义视图的 xml 文件?这有什么问题?

4

6 回答 6

38

IDEA 也支持并正确显示自定义视图组件,但由于 IntelliJ IDEA 使用输出目录中的类文件来渲染此类组件,因此您必须先在项目上执行 build->make project。

在此处输入图像描述

参考

于 2017-04-08T07:34:28.297 回答
7

面对同样的问题,我不得不重写三个和四个参数构造函数:

public View(Context context, AttributeSet attrs, int defStyle) public View(Context context, AttributeSet attrs, int defStyle, int defStyleRes)

然后重建项目。

于 2016-12-14T22:35:18.597 回答
6

正如我今天发现的那样,布局渲染过程中的“Classdef not found”等错误实际上是误导性的。他们真正的意思是在您的小部件执行过程中出现了一些错误。

找出问题所在的最简单方法是:

  1. 在您的 XML 布局文件中,将您的自定义视图类(为清楚起见我们称之为“MyFrameLayout”)替换为 Android 库存类(例如使用 FrameLayout),并确保布局编辑器正常工作。添加“工具:...”属性以允许您查看内容,而不是空布局。例如,如果您的自定义视图中有 EditText 小部件,请向其中添加此属性,该属性将仅在设计模式下使用:

    tools:text="Sample content"
    

("tools: 命名空间由 Android Studio 自动添加)

  1. 将您的原始类名(例如“MyFrameLayout”)返回到 XML 布局。它现在有效吗?

如果不:

  1. 为方便起见,将自定义视图的定义复制到一个临时的新类(例如“MyFrameLayoutBeforeFix”)。您将使用它与“MyFrameLayout”类进行比较,您现在将开始修改该类。

  2. 使用 Android Studio 从头开始​​重新创建您的“MyFrameLayout”类,从绝对最小值开始:它应该编译。因此,Java 类将包含“扩展“FrameLayout”和所需的构造函数/方法,例如在这种情况下:

    package com.myprojectxxx.view;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.widget.FrameLayout;
    
    public class MyFrameLayout  extends FrameLayout {
        public MyFrameLayout(Context context) {
            super(context);
        }
    
        public MyFrameLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    }
    
  3. 确保此自定义视图正常呈现。它应该,至少在 2016 年!

  4. 将代码从“MyFrameLayoutBeforeFix”副本中逐段移动到此类,检查每一步是否有错误...

上面的顺序似乎很明显,但它对我有用。诀窍是布局编辑器在其自己的上下文中启动您的类,这可能会导致您的代码中出现一些意外错误,当从您的应用程序内部启动时,这些错误“有效”......

另一个技巧是isInEditMode()在小部件的代码中使用检查来跳过部分,这在设计视图中可能不起作用。例如:

MyClass myClass = isInEditMode() ? null : MyClass.getInstance();

于 2016-04-16T13:46:58.553 回答
2

也可能是因为您使用了错误的主题来呈现布局。确保选择您在项目中使用的那个。

在此处输入图像描述

于 2018-02-01T08:22:12.420 回答
1

应通过以下提交修复。

https://android-review.googlesource.com/#/c/59090/

于 2013-05-24T00:45:02.170 回答
1

不需要奇怪的构造函数参数!这完全是误会!使用常规 2-arg (context + xmlattrs) 构造函数的 Android Studio 4.1 及更高版本的工作案例:

  1. 导航到您的CustomView.kt班级
  2. 打开“拆分”视图在此处输入图像描述
  3. 点击这个问题图标在此处输入图像描述
  4. 阅读错误信息,观察布局预览代码在哪里崩溃在此处输入图像描述
  5. 修复这些错误!在我的情况下,布局预览无法获取字体,因此我观察到构造函数代码失败。我已通过设置带有isInEditMode标志的布局预览识别的默认字体来解决此问题:
    private val defaultTypeface: Typeface = if (!isInEditMode) {
        ResourcesCompat.getFont(context, R.font.sfpro_bold)!!
    } else {
        Typeface.DEFAULT
    }

于 2021-02-23T16:59:18.537 回答