4

我有一个 Android 项目,其中包含一个aar library module通用类,这些类被用作多个应用程序的基础。一切都是用 Kotlin 编写的,没有使用任何 Java 代码(第三方库除外)。

尝试组装应用程序以运行时会出现此问题。尝试运行我的应用程序时出现以下错误:

:app:compileDebugKotlinAfterJava
e: Supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath:
    class com.test.app.view.ECMKotlinTextView, unresolved supertypes: com.test.lib.localization.Localizable

出于这个问题的目的,我编写了自定义 TextView 的两个单独版本,它们扩展了android.widget.TextView类并实现了一个接口,比如说Localizable;一进Java一进Kotlin

ECMJavaTextView.java

package com.test.lib.view;

import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.TextView;

import com.test.lib.localization.Localizable;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Map;


public class ECMJavaTextView extends TextView implements Localizable{
    public ECMJavaTextView(Context context) {
        super(context);
    }

    public ECMJavaTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ECMJavaTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public ECMJavaTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Nullable
    @Override
    public String getTextId() {
        return "JAVA TEXT ID";
    }

    @Override
    public void setTextId(@Nullable String s) {

    }

    @Nullable
    @Override
    public Map<String, String> getTextArgs() {
        return null;
    }

    @Override
    public void setTextArgs(@Nullable Map<String, String> map) {

    }

    @Override
    public void updateText(@NotNull String text) {

    }
}

ECMKotlinTextView.kt

package com.test.lib.view

import android.annotation.TargetApi
import android.content.Context
import android.graphics.Canvas
import android.os.Build
import android.util.AttributeSet
import android.util.Log
import android.widget.TextView
import com.test.lib.localization.Localizable
import com.test.lib.localization.updateText

class ECMKotlinTextView : TextView , Localizable {

       override var textId: String? = "textID"
        get() = field
        set(value) {
            field = value
        }
    override var textArgs: Map<String, String>? = null
        get() = field
        set(value) {
            field = value
        }

    override fun updateText(text: String) {

    }
    constructor(context: Context?) : super(context){

    }
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {

    }
    constructor(context: Context?, attrs: AttributeSet?, defStyle: Int) : super(context, attrs, defStyle) {

    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    constructor(context: Context?, attrs: AttributeSet?, defStyle: Int, defStyleRes: Int) : super(context, attrs, defStyle, defStyleRes) {

    }

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
    }

}

两者在库模块中都有 xml 布局,我将它们包含在main_activity.xml文件中。我设法将问题隔离到findViewbyId()方法上(这里我使用kotlin-extensions库来获取视图;两者都试过)。

MainActivity.kt

import kotlinx.android.synthetic.main.content_main.*

class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        var java_textV = demo_java_text_view as ECMJavaTextView
        Log.d("JAVA", "${java_textV.textId}")

        var kotlin_textV = demo_kotlin_text_view as ECMKotlinTextView
        Log.d("Kotlin", "${kotlin_textV.textId}")
    }
...

第二次强制转换总是给出上面提到的错误,但是如果我删除强制转换 ( ECMKotlinTextView),我将无法访问Localizable我需要的方法。更有趣的一点是JAVA类按预期工作。

不确定它是否是我遗漏或尚未设置的东西,或者它当前是否是 Kotlin 插件中的错误。有人可以帮我吗?一些见解将不胜感激。

4

0 回答 0