В приведенном ниже упрощенном примере в Kotlin
в Android Studio
я использую constraint layout
в XML
пусто
После того, как я динамически создал textview
с фоновым изображением, а затем ясоздал button
того же размера с централизованным текстом.Я также запрограммировал ограничения в отношении кнопки, текста и родителя (расположение ограничений).
Дисплей в моем мобильном телефоне упрямо растягивает кнопку, чтобы занять нижнюю половину экрана.
Что я сделал не так?
Мой код моей уникальной деятельности (кроме импорта):
var idGlob:Int = 100
fun incId():Int {
idGlob++
return idGlob
}
class MainActivity : AppCompatActivity() {
lateinit var newView:ImageView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val newText: TextView = TextView(this)
myLayout.addView(newText)
newText.setText("XO")
newText.setTextColor(Color.WHITE);
newText.setTextSize(TypedValue.COMPLEX_UNIT_SP,28F);
newText.layoutParams.height = 200
newText.layoutParams.width = 400
// XML Vector Image from a SVG file
newText.setBackgroundResource(R.drawable.ic_square)
newText.gravity = Gravity.CENTER
newText.id = incId() // Custom function to generate unique ID
val c = ConstraintSet()
c.clone(myLayout)
c.connect(newText.id,ConstraintSet.START,
ConstraintSet.PARENT_ID,ConstraintSet.START,0)
c.connect(newText.id,ConstraintSet.END,
ConstraintSet.PARENT_ID,ConstraintSet.END,0)
c.connect(newText.id,ConstraintSet.TOP,
ConstraintSet.PARENT_ID,ConstraintSet.TOP,0)
c.connect(newText.id,ConstraintSet.BOTTOM,
ConstraintSet.PARENT_ID,ConstraintSet.BOTTOM,0)
val newBut: Button = Button(this)
myLayout.addView(newBut)
newBut.height = 200 // I also tried newBut.layoutParams.height
newBut.width = 400 // I also tried newBut.layoutParams.width
newBut.id = incId() // Custom function to generate unique ID
newBut.setBackgroundColor(Color.MAGENTA)
newBut.text = "CENTER"
newBut.textAlignment = ALIGN_CENTER
c.connect(newBut.id,ConstraintSet.START,
newText.id,ConstraintSet.START,0)
c.connect(newBut.id,ConstraintSet.END,
newText.id,ConstraintSet.END,0)
c.connect(newBut.id,ConstraintSet.TOP, // If I remove this line
newText.id,ConstraintSet.BOTTOM,0)
c.connect(newBut.id,ConstraintSet.BOTTOM, // or this one(see PS3)
ConstraintSet.PARENT_ID,ConstraintSet.BOTTOM,0)
c.applyTo(myLayout)
}
}
Результат в мобильном телефоне:
enter code here">
ОБНОВЛЕНИЕ : чтобы показать, что не работает, является динамическим эквивалентом статического решения, статическое решение с теми же значениями работает отлично:
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/myLayout"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="400px"
android:layout_height="200px"
android:text="XO"
android:background="@drawable/ic_square"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" android:id="@+id/textView"/>
<Button
android:text="Center"
android:layout_width="400px"
android:layout_height="200px"
android:id="@+id/button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
PS 1 : мой макет использует Constraint Layout
.Итак, я попробовал
newBut.setLayoutParams(ConstraintLayout.LayoutParams(400, 200))
К сожалению, это тоже не сработало!
PS 2 : Я также попробовал
newBut.maxHeight = 200
Ничего не меняется.
PS 3 : Если я удаляю один из двух последних connect
вызовов из кода (вверху или внизу от кнопки), Center button
исчезает!
PS 4 : Если я удаляю все connect
звонки из Center button
и добавляю
newBut.y = 1200F
newBut.x = 300F
Размер работает как брелок, но мне нужно использоватькоординаты, а не ограничения.