根据列表更改约束布局

时间:2019-02-17 15:11:14

标签: android android-layout kotlin android-constraintlayout

我有一排按钮要根据来自sharedpreferences的值进行重新排列。该值已更改并正确侦听,但布局中仍然没有任何反应,因此该错误一定是在用于设置列表的类中或在设置约束的片段中。这是课程:

class ButtonPosLists(context: Context) {

var mContext: Context = context

val view = inflate(mContext, R.layout.fragment_level, null)
val dobutton = view.findViewById<AppCompatButton>(R.id.dobutton)
val dirabutton = view.findViewById<AppCompatButton>(R.id.dirabutton)
val rebutton = view.findViewById<AppCompatButton>(R.id.rebutton)
val rimebutton = view.findViewById<AppCompatButton>(R.id.rimebutton)
val mibutton = view.findViewById<AppCompatButton>(R.id.mibutton)
val fabutton = view.findViewById<AppCompatButton>(R.id.fabutton)
val fisebutton = view.findViewById<AppCompatButton>(R.id.fisebutton)
val sobutton = view.findViewById<AppCompatButton>(R.id.sobutton)
val silebutton = view.findViewById<AppCompatButton>(R.id.silebutton)
val labutton = view.findViewById<AppCompatButton>(R.id.labutton)
val litabutton = view.findViewById<AppCompatButton>(R.id.litabutton)
val tibutton = view.findViewById<AppCompatButton>(R.id.tibutton)

val c = listOf(dobutton, dirabutton, rebutton, rimebutton, mibutton, fabutton, fisebutton, sobutton, silebutton, labutton, litabutton, tibutton)
val db = listOf(dirabutton, rebutton, rimebutton, mibutton, fabutton, fisebutton, sobutton, silebutton, labutton, litabutton, tibutton, dobutton)
val d = listOf(rebutton, rimebutton, mibutton, fabutton, fisebutton, sobutton, silebutton, labutton, litabutton, tibutton, dobutton, dirabutton)
val eb = listOf(rimebutton, mibutton, fabutton, fisebutton, sobutton, silebutton, labutton, litabutton, tibutton, dobutton, dirabutton, rebutton)
val e = listOf(mibutton, fabutton, fisebutton, sobutton, silebutton, labutton, litabutton, tibutton, dobutton, dirabutton, rebutton, rimebutton)
val f = listOf(fabutton, fisebutton, sobutton, silebutton, labutton, litabutton, tibutton, dobutton, dirabutton, rebutton, rimebutton, mibutton)
val gb = listOf(fisebutton, sobutton, silebutton, labutton, litabutton, tibutton, dobutton, dirabutton, rebutton, rimebutton, mibutton, fabutton)
val g = listOf(sobutton, silebutton, labutton, litabutton, tibutton, dobutton, dirabutton, rebutton, rimebutton, mibutton, fabutton, fisebutton)
val ab = listOf(silebutton, labutton, litabutton, tibutton, dobutton, dirabutton, rebutton, rimebutton, mibutton, fabutton, fisebutton, sobutton)
val a = listOf(labutton, litabutton, tibutton, dobutton, dirabutton, rebutton, rimebutton, mibutton, fabutton, fisebutton, sobutton, silebutton)
val bb = listOf(litabutton, tibutton, dobutton, dirabutton, rebutton, rimebutton, mibutton, fabutton, fisebutton, sobutton, silebutton, labutton)
val b = listOf(tibutton, dobutton, dirabutton, rebutton, rimebutton, mibutton, fabutton, fisebutton, sobutton, silebutton, labutton, litabutton)

var posList = bb

fun makePosition(posString: String?) {
when(posString) {
    "c" -> {
        posList = c
    }
    "db" -> {
        posList = db
    }
    "d" -> {
        posList = d
    }
    "eb" -> {
        posList = eb
    }
    "e" -> {
        posList = e
    }
    "f" -> {
        posList = f
    }
    "gb" -> {
        posList = gb
    }
    "g" -> {
        posList = g
    }
    "ab" -> {
        posList = ab
    }
    "a" -> {
        posList = a
    }
    "bb" -> {
        posList = bb
    }
    "b" -> {
        posList = b
    }
}
println(posList[7].toString())
}
}

在我要应用这些列表的片段中,我使用以下代码:

fun setPositions() {
    val params = FullscreenActivity.buttonPos.posList[0].layoutParams as ConstraintLayout.LayoutParams
    val params1 = FullscreenActivity.buttonPos.posList[1].layoutParams as ConstraintLayout.LayoutParams
    val params2 = FullscreenActivity.buttonPos.posList[2].layoutParams as ConstraintLayout.LayoutParams
    val params3 = FullscreenActivity.buttonPos.posList[3].layoutParams as ConstraintLayout.LayoutParams
    val params4 = FullscreenActivity.buttonPos.posList[4].layoutParams as ConstraintLayout.LayoutParams
    val params5 = FullscreenActivity.buttonPos.posList[5].layoutParams as ConstraintLayout.LayoutParams
    val params6 = FullscreenActivity.buttonPos.posList[6].layoutParams as ConstraintLayout.LayoutParams
    val params7 = FullscreenActivity.buttonPos.posList[7].layoutParams as ConstraintLayout.LayoutParams
    val params8 = FullscreenActivity.buttonPos.posList[8].layoutParams as ConstraintLayout.LayoutParams
    val params9 = FullscreenActivity.buttonPos.posList[9].layoutParams as ConstraintLayout.LayoutParams
    val params10 = FullscreenActivity.buttonPos.posList[10].layoutParams as ConstraintLayout.LayoutParams
    val params11 = FullscreenActivity.buttonPos.posList[11].layoutParams as ConstraintLayout.LayoutParams

    params.topToTop = guideline8.id
    params.endToStart = guideline1.id
    params.startToStart = container.id
    params.bottomToTop = guideline7.id
    FullscreenActivity.buttonPos.posList[0].requestLayout()

    params1.topToTop = guideline9.id
    params1.endToStart = guideline13.id
    params1.startToStart = guideline12.id
    params1.bottomToTop = guideline8.id
    FullscreenActivity.buttonPos.posList[1].requestLayout()

    params2.topToTop = guideline8.id
    params2.endToStart = guideline2.id
    params2.startToStart = guideline1.id
    params2.bottomToTop = guideline7.id
    FullscreenActivity.buttonPos.posList[2].requestLayout()

    params3.topToTop = guideline9.id
    params3.endToStart = guideline14.id
    params3.startToStart = guideline13.id
    params3.bottomToTop = guideline8.id
    FullscreenActivity.buttonPos.posList[3].requestLayout()

    params4.topToTop = guideline8.id
    params4.endToStart = guideline3.id
    params4.startToStart = guideline2.id
    params4.bottomToTop = guideline7.id
    FullscreenActivity.buttonPos.posList[4].requestLayout()

    params5.topToTop = guideline8.id
    params5.endToStart = guideline4.id
    params5.startToStart = guideline3.id
    params5.bottomToTop = guideline7.id
    FullscreenActivity.buttonPos.posList[5].requestLayout()

    params6.topToTop = guideline9.id
    params6.endToStart = guideline16.id
    params6.startToStart = guideline15.id
    params6.bottomToTop = guideline8.id
    FullscreenActivity.buttonPos.posList[6].requestLayout()

    params7.topToTop = guideline8.id
    params7.endToStart = guideline5.id
    params7.startToStart = guideline4.id
    params7.bottomToTop = guideline7.id
    FullscreenActivity.buttonPos.posList[7].requestLayout()

    params8.topToTop = guideline9.id
    params8.endToStart = guideline17.id
    params8.startToStart = guideline16.id
    params8.bottomToTop = guideline8.id
    FullscreenActivity.buttonPos.posList[8].requestLayout()

    params9.topToTop = guideline8.id
    params9.endToStart = guideline6.id
    params9.startToStart = guideline5.id
    params9.bottomToTop = guideline7.id
    FullscreenActivity.buttonPos.posList[9].requestLayout()

    params10.topToTop = guideline9.id
    params10.endToStart = guideline18.id
    params10.startToStart = guideline17.id
    params10.bottomToTop = guideline8.id
    FullscreenActivity.buttonPos.posList[10].requestLayout()

    params11.topToTop = guideline8.id
    params11.endToEnd = container.id
    params11.startToStart = guideline6.id
    params11.bottomToTop = guideline7.id
    FullscreenActivity.buttonPos.posList[11].requestLayout()
}

知道我哪里出错了吗?

2 个答案:

答案 0 :(得分:1)

您要在对布局属性进行膨胀之后对其进行更改,否则进一步的更改将不会自动应用于现有布局。在应用新的布局参数之后,尝试使用invalidate()来触发顶部布局的onDraw方法。

答案 1 :(得分:1)

您应该使用ConstraintSet而不是ConstraintLayout.LayoutParams。根据{{​​1}}的文档。 (斜体是我的。)

  

此类包含不同的属性,这些属性指定如何在ConstraintLayout内布局视图。 要在运行时建立约束,建议使用ConstraintSet。