Android Studio布局编辑器无法呈现自定义视图

Nae*_*mul 46 java android android-custom-view android-layout android-studio

在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

 

<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>
Run Code Online (Sandbox Code Playgroud)

Android Studio总是说,

渲染问题

找不到以下类:

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

提示:尝试构建项目

当然,我有那门课.如果我单击"创建类",它会抱怨同一个类已经存在.如果我重建该项目,没有任何改变.

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

Android Studio无法使用自定义视图预览xml文件?这有什么问题?

Bad*_*chi 22

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

在此输入图像描述

参考


Mic*_*ski 6

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

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

Run Code Online (Sandbox Code Playgroud)


yvo*_*olk 5

正如我今天所发现的,最后,布局渲染期间的“找不到Classdef”等错误实际上是令人误解的。它们的真正含义是在执行小部件期间出现一些错误。

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

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

    tools:text="Sample content"
    
    Run Code Online (Sandbox Code Playgroud)

(“工具:名称空间由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);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 确保此自定义视图正常显示。至少应该在2016年!

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

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

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

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

  • 甚至都不了解步骤1。添加“工具:...”是什么意思?您在哪里添加此语句?您是说`xmlns:tools =“ http://schemas.android.com/tools”`还是其他一些工具命令?在第3步中,您要讨论的是哪个“新类”,即所讨论的自定义类还是某种毫无意义的全新类?对不起,但是我很困惑。您似乎想出了解决方案,但我没有遵循您的逻辑。 (2认同)

小智 5

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

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

然后重建项目。

  • 这似乎对我有帮助。我说“似乎”,是因为过去我已经设法“修复”了这个错误,然后稍后又对我跳了出来。.但是到目前为止还不错!到目前为止的区别似乎是需要使用@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)`覆盖此4参数构造函数,因为我的目标是低于棒棒糖... (3认同)

Nae*_*mul 0

应通过以下提交修复。

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

  • 2.2.3 - 仍未修复:( (2认同)