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

时间:2013-05-16 16:37:49

标签: java android android-layout android-custom-view 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);
    }
}

<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中,它总是说“CLASSES可能无法找到。”

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

6 个答案:

答案 0 :(得分:17)

自定义视图组件也在IDEA中得到支持和正确显示,但由于IntelliJ IDEA使用输出目录中的类文件来呈现此类组件,因此您必须首先在项目上进行build-&gt; make项目。

enter image description here

reference

答案 1 :(得分:5)

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

<div repeat.for='items of my_1000_items_collection' custom-event.capture='doIt()'></div>

然后重建项目。

答案 2 :(得分:4)

正如我今天发现的那样,最终没有找到&#34; Classdef&#34;布局渲染期间的错误实际上是误导性的。它们的真正含义是在执行小部件时出现一些错误。

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

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

    tools:text="Sample content"
    
  2. (&#34;工具:命名空间由Android Studio自动添加)

    1. 将原始班级名称(例如&#34; MyFrameLayout&#34;)返回到XML布局。它现在有效吗?
    2. 如果不是:

      1. 为方便起见,将自定义视图的定义复制到临时新类(例如&#34; MyFrameLayoutBeforeFix&#34;)。您将使用它与&#34; MyFrameLayout&#34;进行比较。 class,你现在就开始修改。

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

        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. 从&#34; MyFrameLayoutBeforeFix&#34;逐段移动代码复制到这个类,检查每一步都没有错误......

      5. 以上序列似乎很明显,但它对我有用。诀窍在于布局编辑器在自己的上下文中启动您的类,这可能会导致代码中出现一些意外错误,这些错误可以解决问题。从你的应用程序内部开始......

        另一个技巧是使用isInEditMode()检查窗口小部件的代码来跳过部分,这些部分可能无法在设计视图中使用。 E.g:

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

答案 3 :(得分:1)

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

enter image description here