Использование набора ограничений с привязкой к виду

#android #android-viewbinding #constraintset

Вопрос:

Я не могу запрограммировать кнопку, чтобы она отображалась с набором ограничений при использовании в сочетании с привязкой просмотра. Он не падает, кнопка просто не появляется. Я не могу понять, почему. Инструкции печати показывают, что btn находится на уровне 0,0 и нулевой высоте и ширине. До привязки просмотра я мог создавать и размещать кнопки и т. Д. С помощью набора ограничений, поэтому любая помощь, которую я могу получить для решения этой проблемы, была бы отличной.

 <?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)
    }
}
 

Скриншот

Комментарии:

1. Какая ошибка появляется в трассировке стека ?

2. @NisanthReddy спасибо за ответ. Здесь нет никаких ошибок. Кнопка просто не добавляется в представление.

Ответ №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) .

Это должно решить вашу проблему.

Комментарии:

1. У меня уже есть это :привязка = ActivityMainBinding.inflate(LayoutInflater) val view = привязка.корневой setContentView(представление)

2. пожалуйста, обновите свой вопрос, указав свой последний код класса занятий

3. @Питер обновил ответ. Проверить это. Код работает идеально.

4. Модифицированная функция, которая показывает, что btn находится на уровне 0,0 и нулевой высоте и ширине. Это действительно странно. Если я не использую набор ограничений, то кнопка отображается правильно при 0,0

5. @Питер, не могли бы вы опубликовать все свои действия и код макета. Также подумайте о том, чтобы обновить свой вопрос с помощью скриншотов, чтобы лучше понять вашу проблему.