我有一个 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 插件中的错误。有人可以帮我吗?一些见解将不胜感激。