li2*_*li2 1 android kotlin android-seekbar
我创建了一个自定义的 SeekBar,它扩展了android.widget.Seekbar:
data class Range(val min: Int, val max: Int, private val defaultIncrement: Int) {
val increment = if ((max - min) < defaultIncrement) 1 else defaultIncrement
}
internal fun Range.toSeekbarMaximum(): Int = (max - min) / increment
class RangeSeekBar: SeekBar {
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
init {
range = Range(0, 100, 1)
}
var range: Range
set(value) {
max = value.toSeekbarMaximum()
}
override fun setProgress(progress: Int) = super.setProgress((progress - range.min) / range.increment)
override fun getProgress(): Int = range.min + super.getProgress() * range.increment
}
Run Code Online (Sandbox Code Playgroud)
我在运行代码时得到了一个 NPE, constructor 首先执行,然后转到setProgress,它崩溃了,因为它range是空的。该init块后没有执行 constructor ,什么错?谢谢
小智 5
创建一个属性并在 init 块中初始化该属性,就像您拥有它一样,与在声明时初始化该属性相同。init 块仅在调用主构造函数时执行。你有默认的主构造函数(一个空的构造函数)和自定义的二级构造函数。如果您希望在 init 块中执行它,则必须调用主构造函数。如果您希望 range 在每次构造时都被初始化,只需在声明时初始化它并摆脱 init 块。
var range: Range = Range(0, 100, 1)
set(value){
max = value.toSeekbarMaximum()
field = value
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1929 次 |
| 最近记录: |