Я пытаюсь использовать Kotlin в своем Android-проекте. Мне нужно создать собственный класс представления. Каждый пользовательский вид имеет два важных конструктора:
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.
Ответ на этот вопрос предполагает, что я использую конструктор со значениями по умолчанию или factory. Но вот что мы имеем:
Factory:
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)
Как решить эту проблему?
UPDATE: Похоже, мы можем использовать конструктор View(Context, null)
суперкласса вместо View(Context)
, поэтому метод метода factory представляется решением. Но даже тогда я не могу заставить свой код работать:
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