Android プロジェクトで Kotlin を使用しようとしています。カスタム ビュー クラスを作成する必要があります。各カスタム ビューには、2 つの重要なコンストラクターがあります。
public class MyView extends View {
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
MyView(Context)
コードでビューをインスタンス化するために使用されMyView(Context, AttributeSet)
、XML からレイアウトをインフレートするときにレイアウト インフレータによって呼び出されます。
この質問への回答は、コンストラクターをデフォルト値またはファクトリーメソッドで使用することを示唆しています。しかし、ここに私たちが持っているものがあります:
工場方式:
fun MyView(c: Context) = MyView(c, attrs) //attrs is nowhere to get
class MyView(c: Context, attrs: AttributeSet) : View(c, attrs) { ... }
また
fun MyView(c: Context, attrs: AttributeSet) = MyView(c) //no way to pass attrs.
//layout inflater can't use
//factory methods
class MyView(c: Context) : View(c) { ... }
デフォルト値を持つコンストラクター:
class MyView(c: Context, attrs: AttributeSet? = null) : View(c, attrs) { ... }
//here compiler complains that
//"None of the following functions can be called with the arguments supplied."
//because I specify AttributeSet as nullable, which it can't be.
//Anyway, View(Context,null) is not equivalent to View(Context,AttributeSet)
このパズルはどのように解決できますか?
更新:View(Context, null)
の代わりにスーパークラス コンストラクターを使用できるようにView(Context)
思われるため、ファクトリ メソッド アプローチが解決策のようです。しかし、それでも私は自分のコードを動作させることができません:
fun MyView(c: Context) = MyView(c, null) //compilation error here, attrs can't be null
class MyView(c: Context, attrs: AttributeSet) : View(c, attrs) { ... }
また
fun MyView(c: Context) = MyView(c, null)
class MyView(c: Context, attrs: AttributeSet?) : View(c, attrs) { ... }
//compilation error: "None of the following functions can be called with
//the arguments supplied." attrs in superclass constructor is non-null