Почему динамическая кнопка не учитывает высоту в Kotlin? - PullRequest
0 голосов
/ 06 июня 2019

В приведенном ниже упрощенном примере в 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)

    }
}

Результат в мобильном телефоне:

imageenter 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

Размер работает как брелок, но мне нужно использоватькоординаты, а не ограничения.

1 Ответ

2 голосов
/ 06 июня 2019

здесь ваша проблема в строке c.connect(newBut.id,ConstraintSet.BOTTOM, // or this one(see PS3) ConstraintSet.PARENT_ID,ConstraintSet.BOTTOM,0) вы выравнивали ограничение кнопки снизу по отношению к родителю, поэтому вместо растяжения используйте 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.GRAY)
    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.constrainHeight(newBut.id,200) ***// set button height here***
 /*   c.connect(newBut.id,ConstraintSet.BOTTOM, // or this one(see PS3)
            newBut.id,ConstraintSet.BOTTOM,0)*/
    c.applyTo(myLayout)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...