Android studio 自定义视图不在Android Studio的Desgin视图中渲染?

Android studio 自定义视图不在Android Studio的Desgin视图中渲染?,android-studio,android-layout,kotlin-android-extensions,Android Studio,Android Layout,Kotlin Android Extensions,我已经创建了一个自定义视图,以便在底部显示信息,在顶部显示分隔符。 我很难在Android Studio(V4.1)的设计视图中呈现它,尽管它在应用程序中运行良好 class InfoDivider @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyle: Int = 0, defStyleRes: Int = 0 ) : LinearLayout(con

我已经创建了一个自定义视图,以便在底部显示信息,在顶部显示分隔符。 我很难在Android Studio(V4.1)的设计视图中呈现它,尽管它在应用程序中运行良好

class InfoDivider @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyle: Int = 0,
    defStyleRes: Int = 0
) : LinearLayout(context, attrs, defStyle, defStyleRes) {

    var text: String? by Delegates.observable<String?>("") { _, old, new ->
        if (old != new)
            update()
    }


    init {
        LayoutInflater.from(context)
            .inflate(R.layout.info_divider, this, true)

        orientation = VERTICAL

        if (attrs != null) {
            val math = context.obtainStyledAttributes(attrs, R.styleable.InfoDivider)

            if (math.hasValue(R.styleable.InfoDivider_text)) {
                this.text = math.getString(R.styleable.InfoDivider_text)
            }


            math.recycle()
        }
    }

    private fun update() {
        txt_message.text = text
    }
}
class-InfoDivider@JVM重载构造函数(
上下文:上下文,
属性集?=null,
defStyle:Int=0,
defStyleRes:Int=0
):LinearLayout(上下文、属性、定义样式、定义样式){
变量文本:字符串?由委托。可观察(“”{},旧,新->
如果(旧的!=新的)
更新()
}
初始化{
LayoutFlater.from(上下文)
.充气(R.layout.info_分隔器,此为真)
方向=垂直
如果(属性!=null){
val math=context.actainStyledAttributes(attrs,R.styleable.InfoDivider)
if(math.hasValue(R.styleable.InfoDivider\u text)){
this.text=math.getString(R.styleable.InfoDivider\u text)
}
数学循环()
}
}
私人娱乐更新(){
txt_message.text=文本
}
}
它只会在设计视图中引发一些问题

java.lang.NoSuchMethodError: kotlin.jvm.internal.MutablePropertyReference1Impl.<init>(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V
    at com.test.custom_views.info_dividers.InfoDivider.<clinit>(InfoDivider.kt)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.jetbrains.android.uipreview.ViewLoader.createNewInstance(ViewLoader.java:413)
    at org.jetbrains.android.uipreview.ViewLoader.loadClass(ViewLoader.java:203)
    at org.jetbrains.android.uipreview.ViewLoader.loadView(ViewLoader.java:161)
    at com.android.tools.idea.rendering.LayoutlibCallbackImpl.loadView(LayoutlibCallbackImpl.java:309)
    at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:416)
    at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:427)
    at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:331)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:961)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:659)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:501)
    at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:353)
    at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:404)
    at com.android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary.java:141)
    at com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:713)
    at com.android.tools.idea.rendering.RenderTask.lambda$inflate$6(RenderTask.java:844)
    at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1604)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
java.lang.NoSuchMethodError:kotlin.jvm.internal.MutablePropertyReference1Impl.(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V
在com.test.custom_views.info_dividers.InfoDivider.(InfoDivider.kt)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:423)
位于org.jetbrains.android.uipreview.ViewLoader.createNewInstance(ViewLoader.java:413)
位于org.jetbrains.android.uipreview.ViewLoader.loadClass(ViewLoader.java:203)
位于org.jetbrains.android.uipreview.ViewLoader.loadView(ViewLoader.java:161)
在com.android.tools.idea.rendering.LayoutlibCallbackImpl.loadView(LayoutlibCallbackImpl.java:309)上
在android.view.BridgeInflater.loadCustomView(BridgeInflater.java:416)中
在android.view.BridgeInflater.loadCustomView(BridgeInflater.java:427)中
在android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:331)中
位于android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:961)
在android.view.LayoutInflater.充气(LayoutInflater.java:659)
在android.view.LayoutInflater.充气(LayoutInflater.java:501)
在com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:353)上
位于com.android.layoutlib.bridge.bridge.createSession(bridge.java:404)
位于com.android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary.java:141)
位于com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:713)
在com.android.tools.idea.rendering.RenderTask.lambda$inflate$6(RenderTask.java:844)
位于java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1604)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
运行(Thread.java:748)
看起来像这样

它应该是什么样子

适用于可能陷入同一问题的任何人

根本原因是Kotlin委托的属性

解决方案可以是以下三种方案中的一种:

  • 删除使用委派属性的代码

  • 保留委派属性逻辑并将您的Kotlin版本降低到1.3-由我自己测试,它可以工作,但您必须放弃一些只有Kotlin 1.4可以提供的Kotlin功能,如尾部逗号、自动智能转换

  • 保留委托属性,Kotlin版本高于1.4,并将您的Android Studio升级到4.2 beta版,这是撰写此答案时的最新版本

这就是我在上面找到答案的地方


我认为这是关于kotlin委托属性的。我已经解决了这个问题,我会尽快发布解决方案。应该有一些解释,我知道您可以通过删除kotlin委托属性逻辑来解决这个问题。但这只是暂时的解决办法,对吗?
class InfoDivider @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyle: Int = 0,
    defStyleRes: Int = 0
) : LinearLayout(context, attrs, defStyle, defStyleRes) {




    init {
        LayoutInflater.from(context)
            .inflate(R.layout.info_divider, this, true)

        orientation = VERTICAL

        if (attrs != null) {
            val math = context.obtainStyledAttributes(attrs, R.styleable.InfoDivider)

            if (math.hasValue(R.styleable.InfoDivider_text)) {
                txt_message.text = math.getString(R.styleable.InfoDivider_text)
            }


            math.recycle()
        }

    }

    fun setText(str: String) {
        txt_message.text = str
    }
}