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文件?这有什么问题?
不需要奇怪的构造函数参数!这完全是误解!Android Studio 4.1 及更高版本使用常规 2-arg (context + xmlattrs) 构造函数的工作案例:
CustomView.kt
班级isInEditMode
: private val defaultTypeface: Typeface = if (!isInEditMode) {
ResourcesCompat.getFont(context, R.font.sfpro_bold)!!
} else {
Typeface.DEFAULT
}
Run Code Online (Sandbox Code Playgroud)
正如我今天所发现的,最后,布局渲染期间的“找不到Classdef”等错误实际上是令人误解的。它们的真正含义是在执行小部件期间出现一些错误。
找出问题所在的最简单方法是:
在XML布局文件中,将自定义视图类(为清晰起见,将其命名为“ MyFrameLayout”)替换为Android股票类(例如,使用FrameLayout),并确保“布局编辑器”正常工作。添加“工具:...”属性以允许您查看内容,而不是空白布局。例如,如果您的自定义视图中有EditText小部件,则向此属性添加此属性,该属性仅在设计模式下使用:
tools:text="Sample content"
Run Code Online (Sandbox Code Playgroud)(“工具:名称空间由Android Studio自动添加)
如果不:
为了方便起见,将您的自定义视图的定义复制到一个临时的新类(例如“ MyFrameLayoutBeforeFix”)。您将使用它与“ MyFrameLayout”类进行比较,现在将开始对其进行修改。
从绝对最低开始,使用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)确保此自定义视图正常显示。至少应该在2016年!
将代码从“ MyFrameLayoutBeforeFix”副本中逐段移动到此类,检查每一步是否没有错误...
上面的顺序似乎很明显,但是对我有用。诀窍是,布局编辑器在自己的上下文中启动类,这可能会导致代码中出现一些意外错误,这些错误是从应用程序内部启动时“起作用”的。
另一个技巧是isInEditMode()
在小部件的代码中使用check来跳过零件,这可能在“设计”视图中不起作用。例如:
MyClass myClass = isInEditMode() ? null : MyClass.getInstance();
小智 5
面对相同的问题,我不得不重写三个和四个参数构造函数:
public View(Context context, AttributeSet attrs, int defStyle)
public View(Context context, AttributeSet attrs, int defStyle, int defStyleRes)
然后重建项目。
归档时间: |
|
查看次数: |
24706 次 |
最近记录: |