在kotlin中自定义ProgressBar

时间:2017-02-07 10:47:00

标签: android progress-bar android-custom-view kotlin

我正在尝试按照自定义布局的方式制作自定义ProgressBar。这次我遇到了问题。

我只用这个xml就能达到理想的效果:

<ProgressBar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:indeterminateOnly="false"
    android:progressDrawable="@drawable/progress_bar" />

然而,最终目标是在自定义类中进行一些自定义,以便xml缩小到这个:

<se.my.viktklubb.app.progressbar.HorizontalProgressBar
    android:id="@+id/planProgressBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

以下是自定义类:

class HorizontalProgressBar : ProgressBar {

    constructor(context: Context) : super(context) {
        initialSetup()
    }

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
        initialSetup()
    }

    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
        initialSetup()
    }

    fun initialSetup() {
        max = 100
        isIndeterminate = false
        progressDrawable = context.getDrawable(R.drawable.progress_bar)
    }
}

第二个构造函数被触发但是条形图没有样式化。它实际上显示为不确定的旋转进度,并且最终都没有应用这些设置 - 感觉就像之后被其他东西覆盖。

这里有什么问题?

声明: 这是一个非常简单的例子。我完全知道我可以选择样式或简单的xml实现,但我只是用这个简单的案例来证明这个问题。

1 个答案:

答案 0 :(得分:0)

根据此article的项目符号5,您可能需要修改initialSetup:

fun initialSetup() {
    max = 100
    isIndeterminate = false
    progressDrawable = context.getDrawable(R.drawable.progress_bar)
    invalidate()
    requestLayout()
}

如果它没有改变任何东西,请尝试稍后调用initialSetup,例如onResume of activity / fragment。如果这项工作,问题可能与android组件的初始化/生命周期的复杂性有关。