Android ConstraintLayout 2.0:ConstraintLayoutStates

zhang523發表於2018-12-12

image

原文www.zhangman523.cn/383.html

隨著ConstraintLayout 2.0的推出,有一個名為ConstraintLayoutStates的有趣新功能。 ConstraintLayoutStates允許您建立具有不同狀態的佈局,並輕鬆地在它們之間切換。 通常,大多數佈局包含載入狀態,初始狀態,結束狀態和錯誤狀態。 使用ConstraintLayoutStates,可以在這些不同的狀態之間切換。

你如何使用這個新功能?

第一步 新增依賴

dependencies {
    implementation 'com.android.support.constraint:constraint-layout:2.0.0-alpha2'
}
複製程式碼

或者用androidX變種

    implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
複製程式碼

第二步 在layout 的檔案下建立不同狀態的佈局檔案

image

第三步 建立ConstraintLayoutStatesXML檔案

xml資原始檔夾中,建立包含狀態的xml檔案。 在此示例中,我們將其稱為constraint_layout_states_example.xml 。 在此檔案中放置佈局的所有不同表示。 給他們有意義的id,如start , loading等,然後將它們連結到相關的約束檔案。

<?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>
複製程式碼

第四步 在狀態之間切換

在您的Activity/Fragment中,您現在可以根據不同的條件輕鬆切換這些狀態。 首先需要在ConstraintLayout物件上使用loadLayoutDescription()載入狀態描述。 完成後,可以使用先前狀態檔案中定義的任何狀態呼叫constraintLayout.setState()

在下面的示例中,我們將狀態設定為loading狀態。 然後過了一段時間(在這個例子中我只是post了一個延遲的runnable,模仿網路呼叫),我們將它設定為end狀態。

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)
        }
    }
}
複製程式碼

效果圖

image

您現在應該可以在自己的應用程式中使用ConstraintLayoutStates 。 這個例子可以在GITHUB上找到 。

原文www.zhangman523.cn/383.html

相關文章