在自定义视图组的onLayout方法中调用setLayoutParams()不会执行任何操作

时间:2018-07-21 10:14:07

标签: android android-relativelayout custom-view

我正在扩展RelativeLayout,并希望在onLayout方法中设置childViews的位置。所以这是代码:

 override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {

    val margin = Math.round(beautyButton!!.measuredWidth * 1.75).toInt()

    beautyButton!!.visibility = View.GONE

    var params = defaultSeekbar!!.layoutParams as RelativeLayout.LayoutParams
    params.setMargins(margin,0,margin,0)
    params.addRule(CENTER_IN_PARENT)
    params.removeRule(ALIGN_PARENT_START)
    params.removeRule(START_OF)

    var params2 = beautySeekbar!!.layoutParams as RelativeLayout.LayoutParams
    params2.setMargins(margin,0,margin,0)
    params2.addRule(CENTER_IN_PARENT)
    params2.removeRule(ALIGN_PARENT_START)
    params2.removeRule(START_OF)

   super.onLayout(changed, l, t, r, b)
}

我想根据Button的大小设置搜索栏的位置。 这什么也没做。我也尝试过类似的方法,但是结果是一样的。

defaultSeekbar!!.layout(margin,defaultSeekbar!!.measuredWidth,margin,defaultSeekbar!!.measuredHeight)

有人可以帮我解决一下,然后再将其显示在屏幕上吗?

感谢大家提前提供答案!

1 个答案:

答案 0 :(得分:1)

您缺少一些代码。您不能只获取View的LayoutParams然后对其进行修改,因为框架需要某种方式来知道它们已被更新。

添加以下行:

DROP TABLE If EXISTS transactions;
CREATE TABLE IF NOT EXISTS transactions (id INTEGER PRIMARY KEY, amounts INTEGER(20), timestamps INTEGER(20));
INSERT INTO transactions (amounts, timestamps) VALUES
    (450,1536115105.62894),
    (450,1536115105.62894),
    (450,1536115105.62894),
    (551,1537115603.29054)
    ;

SELECT *, 
    datetime(timestamps,'unixepoch') AS dt,
    strftime('%Y-%m-%d 02:00','2018-09-05') AS cmprtime1,
    strftime('%Y-%m-%d 23:59','2018-09-05') AS cmprtime2,
    strftime('%s','2018-09-05 02:00') AS cmprts1,
    strftime('%s','2018-09-05 23:59') AS cmprts2
FROM transactions;

SELECT *
FROM transactions 
WHERE datetime(timestamps,'unixepoch') BETWEEN '2018-09-05 02:00' AND '2018-09-05 23:59'
;

SELECT *
FROM transactions 
WHERE timestamps BETWEEN strftime('%s', '2018-09-05 02:00') AND strftime('%s', '2018-09-05 23:59')
;

请记住,Kotlin喜欢将Java setter / getter方法转换为所谓的“属性访问语法”,在该类中它们看起来像变量。问题是defaultSeekbar!!.layoutParams = params beautySeekbar!!.layoutParams = params2 不仅会更改View中的变量。它还调用了其他内容,因此框架知道该视图已更改。

另一件事。我猜您正在执行View#setLayoutParams(),因为您没有立即初始化SeekBar。如果适合您的情况,则可以使用惰性初始化语法(我无法确定,因为您尚未发布该代码):

!!

仅在调用它们后才会对其进行初始化,然后该实例将保留。