#author("2025-04-10T21:19:33+08:00","default:Admin","Admin")
#author("2025-04-10T22:41:28+08:00","default:Admin","Admin")
[[Android]]

&color(red){※前提条件:本情報はAndroid Studio 2024.1.1を基づいて説明してる};

#contents

* 概要 [#f0d29740]

ConstraintLayout (约束布局)的好处太多了,现在Android Studio新的版本默认就是 ConstraintLayout

** &color(red){创建约束布局的规则}; [#gb0895b1]

- 每个视图都必须至少有两个约束条件:一个水平约束条件,一个垂直约束条件(不进行水平或者垂直约束的话,默认显示到0,0位置也就是左上角)
- 只能在共用同一平面的约束手柄与定位点之间创建约束条件。因此,视图的垂直平面(左侧和右侧)只能约束在另一个垂直平面上;而基准线则只能约束到其他基准线上。
(简单说视图顶部/底部只能约束顶部或底部,左侧/右侧只能约束左侧或右侧)
-每个约束句柄只能用于一个约束条件,但您可以在同一定位点上创建多个约束条件(从不同的视图),也就是说出发只能一个而到达目的地可以多个

* 布局 [#k7f7a6ab]
** 相对布局 [#h77dc2b7]

|layout_constraintLeft_toLeftOf|layout_constraintStart_toStartOf|left一定是左边,而start不一定 &br; 我们的习惯是start从左往右,&br; 而某些国家是start从右往左。这个开始方向是跟系统语言有关系的。|
|layout_constraintLeft_toRightOf|layout_constraintStart_toEndOf|~|
|layout_constraintRight_toRightOf|layout_constraintEnd_toEndOf||
|layout_constraintRight_toLeftOf|layout_constraintEnd_toStartOf||
|layout_constraintTop_toTopOf|||
|layout_constraintTop_toBottomOf|||
|layout_constraintBottom_toTopOf|||
|layout_constraintBottom_toBottomOf|||
|layout_constraintBaseline_toBaselineOf|||

** 角度定位 [#c434b85c]


#codeprettify{{
//围绕的目标
layout_constraintCircle
//距离
layout_constraintCircleRadius
//角度
layout_constraintCircleAngle
}}

** 绝对布局 [#c54a4e98]

#codeprettify{{
layout_editor_absoluteX
layout_editor_absoluteY
}}

** 偏移 [#s69d189a]
bias就是偏移的意思


水平偏移和垂直偏移

#codeprettify{{
layout_constraintHorizontal_bias
layout_constraintVertical_bias
}}

** 宽高比 [#l8bc0a0f]
#codeprettify{{
layout_constraintDimensionRatio
}}



* Troubleshooting [#bd4ce315]

下面的错误的可能性
- 如果控件的约束设置的不对,有可能控件之间会互相影响。
- 尽量不要对UI进行多层嵌套。
- 其他的线程里面对UI进行的更新时,一定像下面一样使用runOnUiThread
#codeprettify{{
Activity.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        //UI的更新
    }
});
}}

#codeprettify{{
FATAL EXCEPTION: main
Process: com.sengxiaonong.fpvcar, PID: 1757
java.lang.IllegalStateException: View with id 16908290: androidx.appcompat.widget.ContentFrameLayout#onMeasure() did not set the measured dimension by calling setMeasuredDimension()
	at android.view.View.measure(View.java:26512)
	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6981)
	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1608)
	at android.widget.LinearLayout.measureVertical(LinearLayout.java:878)
	at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
	at android.view.View.measure(View.java:26496)
	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6981)
	at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
	at android.view.View.measure(View.java:26496)
	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6981)
	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1608)
	at android.widget.LinearLayout.measureVertical(LinearLayout.java:878)
	at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
	at android.view.View.measure(View.java:26496)
	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6981)
	at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
	at com.android.internal.policy.DecorView.onMeasure(DecorView.java:760)
	at android.view.View.measure(View.java:26496)
	at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:4042)
	at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2658)
	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2964)
	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2371)
	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9297)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1231)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
	at android.view.Choreographer.doCallbacks(Choreographer.java:899)
	at android.view.Choreographer.doFrame(Choreographer.java:832)
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1214)
	at android.os.Handler.handleCallback(Handler.java:942)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loopOnce(Looper.java:201)
	at android.os.Looper.loop(Looper.java:288)
	at android.app.ActivityThread.main(ActivityThread.java:7924)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
2025-04-10 21:43:40.960  1757-1757  Process                 com.sengxiaonong.fpvcar              I  Sending signal. PID: 1757 SIG: 9
}}


#hr();
コメント:
#comment_kcaptcha

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS