原文https://www.zhangman523.cn/383.html
隨著ConstraintLayout 2.0
的推出案怯,有一個(gè)名為ConstraintLayoutStates
的有趣新功能龟虎。 ConstraintLayoutStates
允許您創(chuàng)建具有不同狀態(tài)的布局吆寨,并輕松地在它們之間切換。 通常鳄哭,大多數(shù)布局包含加載狀態(tài)岛心,初始狀態(tài),結(jié)束狀態(tài)和錯(cuò)誤狀態(tài)默辨。 使用ConstraintLayoutStates
,可以在這些不同的狀態(tài)之間切換婴程。
你如何使用這個(gè)新功能?
第一步 添加依賴(lài)
dependencies {
implementation 'com.android.support.constraint:constraint-layout:2.0.0-alpha2'
}
或者用androidX變種
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
第二步 在layout 的文件下創(chuàng)建不同狀態(tài)的布局文件
第三步 創(chuàng)建ConstraintLayoutStates
XML文件
在xml
資源文件夾中抱婉,創(chuàng)建包含狀態(tài)的xml
文件档叔。 在此示例中,我們將其稱(chēng)為constraint_layout_states_example.xml
蒸绩。 在此文件中放置布局的所有不同表示衙四。 給他們有意義的id,如start 患亿, loading等传蹈,然后將它們鏈接到相關(guān)的約束文件押逼。
<?xml version="1.0" encoding="utf-8"?>
<ConstraintLayoutStates xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<State
android:id="@+id/start"
app:constraints="@layout/activity_constraint_layout_states_start" />
<State
android:id="@+id/loading"
app:constraints="@layout/activity_constraint_layout_states_loading" />
<State
android:id="@+id/end"
app:constraints="@layout/activity_constraint_layout_states_end" />
</ConstraintLayoutStates>
第四步 在狀態(tài)之間切換
在您的Activity
/Fragment
中,您現(xiàn)在可以根據(jù)不同的條件輕松切換這些狀態(tài)惦界。 首先需要在ConstraintLayout
對(duì)象上使用loadLayoutDescription()
加載狀態(tài)描述挑格。 完成后,可以使用先前狀態(tài)文件中定義的任何狀態(tài)調(diào)用constraintLayout.setState()
沾歪。
在下面的示例中漂彤,我們將狀態(tài)設(shè)置為loading
狀態(tài)。 然后過(guò)了一段時(shí)間(在這個(gè)例子中我只是post
了一個(gè)延遲的runnable
灾搏,模仿網(wǎng)絡(luò)調(diào)用)挫望,我們將它設(shè)置為end狀態(tài)。
class ConstraintLayoutStateTest : AppCompatActivity() {
val handler = Handler()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_constraint_layout_states_start)
stateConstraintLayout.loadLayoutDescription(R.xml.constraintlayout_states_exmaple)
var change = false
button.setOnClickListener {
stateConstraintLayout.setState(R.id.loading, 0, 0)
HandlerCompat.postDelayed(handler, {
stateConstraintLayout.setState(if (change) R.id.start else R.id.end, 0, 0)
change = !change
}, null, 3000)
}
}
}
效果圖
您現(xiàn)在應(yīng)該可以在自己的應(yīng)用程序中使用ConstraintLayoutStates 狂窑。 這個(gè)例子可以在GITHUB上找到 媳板。