LayoutParams не применяется - PullRequest
       2

LayoutParams не применяется

1 голос
/ 23 сентября 2019

У меня День Класса Kotlin.Это расширяет ViewGroup.Это функция Init.

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.RectF
import android.util.AttributeSet
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import timber.log.Timber
import java.util.*

class Day: ViewGroup {
    val date : Date;
    val dayView: View
    var color: Int = Color.TRANSPARENT

    constructor(context: Context?, date: Date) : super(context) {
        this.date = date
    }

    constructor(context: Context?, attrs: AttributeSet?, date: Date) : super(context, attrs) {
        this.date = date
    }

    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, date: Date) : super(
        context,
        attrs,
        defStyleAttr
    ) {
        this.date = date
    }

    constructor(
        context: Context?,
        attrs: AttributeSet?,
        defStyleAttr: Int,
        defStyleRes: Int,
        date: Date
    ) : super(context, attrs, defStyleAttr, defStyleRes) {
        this.date = date
    }

    init {
        dayView = TextView(this.context)
        dayView.text = "test"
        dayView.visibility = View.VISIBLE
        dayView.layout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)

        this.addView(dayView)
        this.setBackgroundColor(Color.CYAN)
    }

    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
    }

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)

       val paint = Paint();
        Timber.i("on draw")
        paint.strokeWidth = 5F
        paint.style = Paint.Style.FILL_AND_STROKE
        paint.color = this.color

        val pos = IntArray(2)
        this.getLocationOnScreen(pos)

        canvas?.drawArc(
            RectF(pos[0].toFloat() / 10, pos[1].toFloat() / 10, pos[0].toFloat() / 10 + 100, pos[1].toFloat() / 10 + 100),-90F, 180F, false, paint)
    }
}

После успешного построения я добавляю объект в линейный макет.

val day = Day(context, Date())
this.layout.addView(day)
this.layout.requestLayout()

И это определение макета.

<LinearLayout
        android:orientation="vertical"
        android:id="@+id/calendarContainer"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:background="@color/colorAccent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="0dp"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintVertical_weight="1">

Но результат не такой, как ожидалось.Потому что я ожидаю, что TextView такой же высокий и широкий, как родительский, но текстовое представление не отображается.И нарисованный круг показывает только одно.

unexpected result

Новая реализация onLayout.

override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
    this.children.forEach {
        it.left = left
        it.top = top

        if(it.layoutParams.width == LayoutParams.MATCH_PARENT){
            it.right = right
        }

        if(it.layoutParams.height == LayoutParams.MATCH_PARENT){
            it.bottom = bottom
        }
        it.textAlignment = View.TEXT_ALIGNMENT_CENTER

        it.layoutParams = LayoutParams(right,bottom)
        Timber.i("right: " + right)

        Timber.i("height: " + it.width.toString())
        Timber.i("width: " + it.height.toString())
    }
}

1 Ответ

0 голосов
/ 26 сентября 2019

Проблема заключалась в том, что функция onLayout не была реализована, как сказал @Enselic.

Сначала я попытался реализовать макет самостоятельно.Но есть более простой способ:

override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
    if(changed){
        this.children.forEach {
//delegating the layouting to the element
            it.layout(left,top,right,bottom)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...