【问题标题】:Using ConstraintSet with ViewBinding将 ConstraintSet 与 ViewBinding 一起使用
【发布时间】:2021-08-02 01:54:02
【问题描述】:

当与 ViewBinding 结合使用时,我无法将编程按钮与 ConstraintSet 一起显示。它不会崩溃,按钮只是没有出现。我不知道为什么。 打印语句显示 btn 位于 0,0 且高度和宽度为零。 在 ViewBinding 之前,我能够使用 ConstraintSet 创建和定位按钮等,所以我能得到的任何帮助来解决这个问题都会很棒。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/topView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/teal_200"
    tools:context=".MainActivity"/>

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import com.randrdevelop.viewbinding.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
//        setContentView(R.layout.activity_main)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
        displayCustomBtn1()
//        displayCustomBtn2()
    }

    private fun displayCustomBtn1() {
        val btn = Button(this)
        val set = ConstraintSet()
        val layout: ConstraintLayout = binding.topView
        btn.text = "Programmed Button 1"
        binding.topView.addView(btn)
        btn.id = View.generateViewId()
        set.clone(layout)
        set.centerHorizontally(btn.id, layout.id)
        set.centerVertically(btn.id, layout.id)
        set.applyTo(layout)
        var array = intArrayOf(-1, -1)
        btn.getLocationOnScreen(array)
        println("Note height ${btn.height}")
        println("Note width ${btn.width}")
        println("Note Location ${array[0]} ${array[1]}")
    }

    private fun displayCustomBtn2() {
        // no constraint set. This works.
        val btn = Button(this)
        btn.text = "Programmed Button 2"
        binding.topView.addView(btn)
    }
}

【问题讨论】:

  • 堆栈跟踪中出现什么错误?
  • @NisanthReddy 感谢您的回复。没有错误。该按钮只是没有添加到视图中。

标签: android android-viewbinding constraintset


【解决方案1】:

更新

您的代码运行良好。你还面临什么问题?可以加截图吗?

这是我正在运行的代码

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
        displayCustomBtn()
    }

    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
    private fun displayCustomBtn() {
        val btn = Button(this)
        val set = ConstraintSet()
        val layout: ConstraintLayout = binding.topView
        btn.text = "Programmed Button 1"
        binding.topView.addView(btn)
        btn.id = View.generateViewId()
        set.clone(layout)
        set.centerHorizontally(btn.id, layout.id)
        set.centerVertically(btn.id, layout.id)
        set.applyTo(layout)
    }
}

输出

启用viewBinding时,

您是否将您的setContentView(R.layout.activity_main) 更改为setContentView(binding.root)。

这应该可以解决您的问题。

【讨论】:

  • 我已经有了 :binding = ActivityMainBinding.inflate(layoutInflater) val view = binding.root setContentView(view)
  • 请用您最新的活动课程代码更新您的问题
  • @Peter 已更新答案。看看这个。代码运行良好。
  • 修改后的函数显示 btn 位于 0,0 且高度和宽度为零。这真的很奇怪。如果我不使用 ConstraintSet,那么按钮会正确显示在 0,0
  • @Peter 您能否发布您的整个活动和布局代码。还可以考虑使用屏幕截图更新您的问题,以更好地了解您的问题。
猜你喜欢
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 2021-11-18
  • 2020-06-10
  • 1970-01-01
  • 2021-02-02
相关资源
最近更新 更多