This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you

喜欢吃快餐的小伙伴可以直接点后面的解决方案。

发现问题的过程

今天听同事惊呼,这个控件好屌,

遂问,啥控件?

ConstraintLayout,可以写万能布局。

这么屌?怎么可能啊,线性布局和相对布局都能写?

就是这么屌!他是不建议写代码,建议拖拽,你自己看看吧。

拖拽啊,那有点说的通了。

因为最近准备换工作,遂即本着所剩不多的“好奇心”(没办法,懂得新技术能加分)了解一番。

好,直接上手,创建新项目,打开布局,写一个button,哦不,拖拽一个button(后来证明我这啥也没看就直接上手太草率了,不过这是后话)
This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you

擦,啥情况,刚拖就报错,不是说随便拖拽吗?这也太不给面了吧。。。

This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you add constraints

这句话的意思大概是(捡起我失散多年的英语):这个view没有被约束,它仅仅有设计时的位置,因此它将跳到(0,0),除非你添加约束。

虽然明白了啥意思,但我对这个控件还不了解,以往的经验,先看看布局代码咋写的。

This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you

这个button跟上面的textview的代码是有点不一样啊,没有加constraint…balabala,估计加上就好了,可是等等,之前不是说随便拖拽吗,这咋还要自己写呢?我小眼一眯,故作沉思,一定不是这样。

根据以往经验,直接百度错误,我知道的算挺晚的了,我想应该会有前辈栽树了吧,前人栽树后人乘凉嘛。

This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you

信息很少啊,也理解,毕竟是新东西。

第一个是*的,全英文的,想都没想就略过去了。

第二个,csdn,点击去看一下。

This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you

这什么鬼,通篇靠想象吗?

而且评论也说了,最新的AS版本,问题无法解决,因为他找不到infer Constraints。。。(摊手,我就是最新的3.0版android studio啊。。。想骂娘)

没办法,全网就这两篇相关的博客,又回到第一篇,全英文,只能硬着头皮看了,不知道还能记得多少英文,就constraint还是临时百度的呢。。。

This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you

看了一下,问题倒是跟我一样,不过这个外国人好像也不是最新版的android studio啊,不管了,只能往下看,

This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you

好像还能看懂,说什么右键出问题的控件,再点击ConstrainLayout就能找到那个infer Constraints了,这个歪果仁还很贴心,截了图,试一下。

此处过了N分钟。。。

鼠标右键截屏搞不定啊!!!抓狂,一截屏就消失,算了,反正我们明白,咱们的界面跟老外的不一样就是了。

咱们就想像一下哈!

不行,我还是过不了我心里这坎。

嘴角略微上扬,默默地从兜里掏出了手机。
This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you

条条大路通罗马啊,明白就好。

反正就是跟老外不一样,咱没有那个啥constraint按钮,咋办?

还能咋办?继续往下看,这时候就死马当活马医了。(此时我的内心是崩溃的,这玩意才刚接触,就要夭折了,哎)

This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you

咦,等等,这哥们也是3.0,我看看,大概意思是

ConstrainLayout 不在我右击一个控件的下拉菜单里,我意识到在设计预览界面上方的工具栏菜单中有一个看起来像魔术棒的图标,那也是一个“infer Constrains”的按钮。

你可能在在想的是问题看来解决了,而我想的是,我的天,我竟然能读懂!简直比解决了问题还兴奋!


留给吃快餐的小伙伴回去的入口,嘿嘿

解决方案

不过兴奋归兴奋,问题还是要解决的,试一下!

This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you

果然好了!

This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you
This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you

总结

还是*强大啊!英语还是很重要滴!

参考资料:
*同类问题
负面案例:
不知所云

补充

以上只是一开始不太懂的时候的一个解决方案,后来慢慢用多了才发现,这个问题的根本原因是没有添加约束,而以上的魔法棒只是其中一种解决方案
它只是Android Studio自带的自动添加约束的一个工具。当时只是为了解决报错,没有真正关心好不好用,但后来真正用起来才发现,自动添加的约束有时候不能满足我想要的场景。

要是想完全按照自己的心意(好吧,其实是为了应付UI各种各样的高保真)来,还有一种办法,就是手动添加约束
这个就说来话长了,本来想着要单独再另外写一篇的,但是呢,由于已经有郭霖大神栽过树了,咱们只管乘凉就好啦,哈哈哈。
好吧,其实我就是嫌麻烦。
开个玩笑,附链接:
Android新特性介绍,ConstraintLayout完全解析