aar library module
複数のアプリの基盤として使用されているジェネリック クラスを含む Android プロジェクトがあります。すべてが 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
この質問の目的のために、android.widget.TextView
クラスを拡張してインターフェースを実装するカスタム TextView の 2 つの別々のバージョンを作成しましたLocalizable
。1 つはJava
に、もう 1 つは にあり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}")
}
...
2 番目のキャストでは常に上記のエラーが発生しますが、キャスト () を削除すると、必要なメソッドにECMKotlinTextView
アクセスできなくなります。Localizable
さらに興味深い点は、JAVAクラスが期待どおりに機能することです。
それが私が見逃しているものなのか、セットアップしていないものなのか、それとも現在 Kotlin プラグインのバグなのかはわかりません。誰かがこれで私を助けることができますか? いくつかの洞察をいただければ幸いです。