在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文件?这有什么问题?
答案 0 :(得分:17)
自定义视图组件也在IDEA中得到支持和正确显示,但由于IntelliJ IDEA使用输出目录中的类文件来呈现此类组件,因此您必须首先在项目上进行build-&gt; make项目。
答案 1 :(得分:5)
面对同样的问题,我不得不重写三个和四个参数构造函数:
<div repeat.for='items of my_1000_items_collection' custom-event.capture='doIt()'></div>
然后重建项目。
答案 2 :(得分:4)
正如我今天发现的那样,最终没有找到&#34; Classdef&#34;布局渲染期间的错误实际上是误导性的。它们的真正含义是在执行小部件时出现一些错误。
找出问题的最简单方法是:
在您的XML布局文件中,使用Android库存类(例如使用FrameLayout)替换自定义视图类(让我们称之为&#34; MyFrameLayout&#34;为了清晰起见)并确保布局编辑器作品。 添加&#34;工具:...&#34;允许您查看内容的属性,而不是空布局。例如。如果您在自定义视图中有EditText小部件,请将此属性添加到其中,该属性仅在设计模式下使用:
tools:text="Sample content"
(&#34;工具:命名空间由Android Studio自动添加)
如果不是:
为方便起见,将自定义视图的定义复制到临时新类(例如&#34; MyFrameLayoutBeforeFix&#34;)。您将使用它与&#34; MyFrameLayout&#34;进行比较。 class,你现在就开始修改。
重新创建&#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);
}
}
确保此自定义视图正常呈现。它应该,至少在2016年!
从&#34; MyFrameLayoutBeforeFix&#34;逐段移动代码复制到这个类,检查每一步都没有错误......
以上序列似乎很明显,但它对我有用。诀窍在于布局编辑器在自己的上下文中启动您的类,这可能会导致代码中出现一些意外错误,这些错误可以解决问题。从你的应用程序内部开始......
另一个技巧是使用isInEditMode()
检查窗口小部件的代码来跳过部分,这些部分可能无法在设计视图中使用。 E.g:
MyClass myClass = isInEditMode() ? null : MyClass.getInstance();
答案 3 :(得分:1)
答案 4 :(得分:1)
不需要奇怪的构造函数参数!这完全是误会! 使用常规 2-arg(上下文 + xmlattrs)构造函数的 Android Studio 4.1 及更高版本的工作案例:
CustomView.kt
类isInEditMode
标志设置布局预览识别的默认字体来解决此问题: private val defaultTypeface: Typeface = if (!isInEditMode) {
ResourcesCompat.getFont(context, R.font.sfpro_bold)!!
} else {
Typeface.DEFAULT
}
答案 5 :(得分:0)