大家都知道layout()函数能够对调用它的view进行定位,然后就有小伙伴在实现拖动,或者点击事件中通过它进行对view进行位置设定,从而达到自己想要的效果。事实上这种做法是不值得提倡的。
layout()方法虽然可以对view自身进行定位,但该函数应该让父view调用从而确定view的位置而非我们自动调用去确定view的位置,比如在代码中直接使用button.layout(),或者在自定义的view中调用该方法的做法在思想上其实是错误的。它的确能够满足我们的需求(对view本身进行定位),但是问题在于当父容器刷新时,我们之前对view的定位将会作废(比如当输入法弹出的时候)。这是因为我们使用layout()方法对view进行定位的时候,layout方法并不会告知父容器自身的定位发生改变,即此时父容器中记录的该view的位置并没有任何改变。当父view更新的时候,对于该view的位置设置(onlayout()时)依旧和之前一样。
所以当我们给一个view的定位时,个人认为使用LayoutParams会比较好,当我们通过setLayoutParams()给view定位的时候,它能够通知父容器自身的定位发生改变,这样的话当父容器刷新时就不会影响我们之前给view的定位。关于setLayoutparams()如何通知父容器,小伙伴们可以看看源码(源码实现很简单)。
有错误之处欢迎大家指出,感激不尽。