1

我有一个需要显示的片段,并通过一些步骤将一些 XML 布局放入其中(在此示例中,我有 3 个步骤)我知道我们可以将布局包含到父片段布局中,并且只处理可见/消失的布局。但我想用 ConstraintLayout 中的 ConstraintSet 来做。当我搜索将另一个 XML 布局加载到父 XML 布局中时,每个 XML 布局中的两个根元素都必须是具有相同组件和相同 ID 的约束布局。但在我的示例中,我有不同的 XML 布局和根元素约束布局,但在每个 XML 布局中,我有不同的组件和 ID。现在我的问题是如何根据步骤实时数据使用另一个 XML 布局更改部分 XML 布局?我们关心的是平滑这个布局并用一些动画改变布局。这些是我的文件:

拾取片段:

 class PickupFragment : BaseFragment<FragmentPickupBinding, PickupViewModel>
    (R.layout.fragment_pickup, PickupViewModel()) {

    private val primaryConstraintBody = ConstraintSet()
    private val parcelConstraintBody = ConstraintSet()
    private val senderConstraintBody = ConstraintSet()
    private val receiverConstraintBody = ConstraintSet()


    private val body by lazy { binding.body }


    private val pickupRequestStepObserver = Observer<Int> { step ->

        when (step) {

            0 -> parcelConstraintBody.loading(body)
            1 -> senderConstraintBody.loading(body)
            2 -> receiverConstraintBody.loading(body)
        }
    }


    override fun initVariables() {
        binding.viewModel = vModel
    }

    override fun initObserves() {
        vModel.pickupRequestStep.observe(this, pickupRequestStepObserver)
    }

    override fun initViews() {

        vModel.pickupRequestStep.value = 0

        primaryConstraintBody.clone(body)
        parcelConstraintBody.clone(context, R.layout.fragment_pickup_parcel)
        senderConstraintBody.clone(context, R.layout.fragment_pickup_sender)
        receiverConstraintBody.clone(context, R.layout.fragment_pickup_receiver)

    }

}

片段拾取:

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="viewModel"
            type="com.chaparnet.chapar.views.pickup.PickupViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/body">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/constraintBody"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </androidx.constraintlayout.widget.ConstraintLayout>

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

fragment_pickup_parcel:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="viewModel"
            type="com.chaparnet.chapar.views.pickup.PickupViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/constraintBody"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:context=".delivery_pickup.AddCargoFragment">

        <TextView
            android:id="@+id/txt_text_add_pickup"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="32dp"
            android:layout_marginRight="16dp"
            android:fontFamily="@font/main_bold"
            android:text=" "
            android:textColor="@color/colorPrimary"
            android:textSize="18sp"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/txt_text_new_pickup_waybill"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="40dp"
            android:layout_marginRight="16dp"
            android:fontFamily="@font/main_medium"
            android:text=""
            android:textColor="@color/lightGray"
            android:textSize="14sp"
            android:visibility="gone"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/txt_text_add_pickup" />

        <EditText
            android:id="@+id/et_new_pickup_waybill"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:layout_marginTop="24dp"
            android:layout_marginRight="8dp"
            android:background="@android:color/transparent"
            android:fontFamily="@font/main_medium"
            android:gravity="right"
            android:inputType="number"
            android:paddingLeft="16dp"
            android:paddingTop="16dp"
            android:paddingRight="100dp"
            android:paddingBottom="16dp"
            android:textColor="@color/darkGray"
            android:textSize="14sp"
            android:visibility="gone"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/txt_text_add_pickup" />

        <View
            android:id="@+id/view_waybill"
            android:layout_width="match_parent"
            android:layout_height="@dimen/divider_height"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:background="@color/lighterGray"
            android:visibility="gone"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/et_new_pickup_waybill" />

        <TextView
            android:id="@+id/txt_text_new_pickup_closed_count"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:layout_marginRight="16dp"
            android:fontFamily="@font/main_medium"
            android:text=" "
            android:textColor="@color/lightGray"
            android:textSize="14sp"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/view_waybill" />

        <EditText
            android:id="@+id/et_new_pickup_closed_count"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="8dp"
            android:background="@android:color/transparent"
            android:fontFamily="@font/main_medium"
            android:gravity="right"
            android:inputType="number"
            android:paddingLeft="16dp"
            android:paddingTop="16dp"
            android:paddingRight="100dp"
            android:paddingBottom="16dp"
            android:text="@={viewModel.pickupClosedCount}"
            android:textColor="@color/darkGray"
            android:textSize="14sp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/view_waybill" />

        <View
            android:id="@+id/view_closed_count"
            android:layout_width="match_parent"
            android:layout_height="@dimen/divider_height"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:background="@color/lighterGray"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/et_new_pickup_closed_count" />

        <TextView
            android:id="@+id/txt_text_new_pickup_kind_service"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:layout_marginRight="16dp"
            android:fontFamily="@font/main_medium"
            android:text=" "
            android:textColor="@color/lightGray"
            android:textSize="14sp"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/view_closed_count" />

        <Spinner
            android:id="@+id/spinner_new_pickup_kind_service"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:layout_marginTop="14dp"
            android:layout_marginRight="100dp"
            android:paddingLeft="16dp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/view_closed_count" />

        <View
            android:id="@+id/view_kind_service"
            android:layout_width="match_parent"
            android:layout_height="@dimen/divider_height"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="16dp"
            android:layout_marginRight="20dp"
            android:background="@color/lighterGray"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/txt_text_new_pickup_kind_service" />

        <TextView
            android:id="@+id/txt_text_new_pickup_kind_rent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:layout_marginRight="16dp"
            android:fontFamily="@font/main_medium"
            android:text=""
            android:textColor="@color/lightGray"
            android:textSize="14sp"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/view_kind_service" />

        <!--<androidx.appcompat.widget.AppCompatSpinner
            android:id="@+id/spinner_new_pickup_kind_rent"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:layout_marginTop="16dp"
            android:layout_marginRight="100dp"
            android:paddingLeft="16dp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/view_kind_service" />-->


        <RadioGroup
            android:id="@+id/spinner_new_pickup_kind_rent"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:layout_marginTop="10dp"
            android:layout_marginRight="100dp"
            android:gravity="center"
            android:orientation="horizontal"
            android:paddingLeft="16dp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/view_kind_service">

            <RadioButton
                android:id="@+id/radio1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="start"
                android:layout_marginRight="16dp"
                android:button="@null"
                android:checked="@={viewModel.radioPasPayment}"
                android:drawableRight="?android:attr/listChoiceIndicatorSingle"
                android:fontFamily="@font/main_light"
                android:layoutDirection="rtl"
                android:text=""
                android:textAlignment="textStart"
                android:textSize="12sp" />

            <RadioButton
                android:id="@+id/radio2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="start"
                android:button="@null"
                android:checked="@={viewModel.radioPishPayment}"
                android:drawableRight="?android:attr/listChoiceIndicatorSingle"
                android:fontFamily="@font/main_light"
                android:layoutDirection="rtl"
                android:text=""
                android:textAlignment="textStart"
                android:textSize="12sp" />
        </RadioGroup>

        <View
            android:id="@+id/view_kind_rent"
            android:layout_width="match_parent"
            android:layout_height="@dimen/divider_height"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="16dp"
            android:layout_marginRight="20dp"
            android:background="@color/lighterGray"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/txt_text_new_pickup_kind_rent" />

        <!--<TextView
            android:id="@+id/txt_text_new_service_percentage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:layout_marginRight="16dp"
            android:fontFamily="@font/main_medium"
            android:tag="check_for_visibility"
            android:text="Service percent"
            android:textColor="@color/lightGray"
            android:textSize="14sp"
            android:visibility="gone"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/view_kind_rent" />

        <EditText
            android:id="@+id/et_new_pickup_service_percentage"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="8dp"
            android:background="@android:color/transparent"
            android:fontFamily="@font/main_medium"
            android:gravity="right"
            android:inputType="number"
            android:paddingLeft="16dp"
            android:paddingTop="16dp"
            android:paddingRight="100dp"
            android:paddingBottom="16dp"
            android:tag="check_for_visibility"
            android:textColor="@color/darkGray"
            android:textSize="14sp"
            android:visibility="gone"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/view_kind_rent" />

        <View
            android:id="@+id/view_kind_service_percentage"
            android:layout_width="match_parent"
            android:layout_height="@dimen/divider_height"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="16dp"
            android:layout_marginRight="20dp"
            android:background="@color/lighterGray"
            android:tag="check_for_visibility"
            android:visibility="gone"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/txt_text_new_service_percentage" />-->

        <TextView
            android:id="@+id/txt_text_new_weight_of_goods"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:layout_marginRight="16dp"
            android:fontFamily="@font/main_medium"
            android:tag="check_for_visibility"
            android:text="weight"
            android:textColor="@color/lightGray"
            android:textSize="14sp"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/view_kind_rent" />

        <EditText
            android:id="@+id/et_new_pickup_weight_of_goods"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="8dp"
            android:background="@android:color/transparent"
            android:fontFamily="@font/main_medium"
            android:gravity="right"
            android:inputType="number"
            android:paddingLeft="16dp"
            android:paddingTop="16dp"
            android:paddingRight="100dp"
            android:paddingBottom="16dp"
            android:tag="check_for_visibility"
            android:text="@={viewModel.weightOfGoods}"
            android:textColor="@color/darkGray"
            android:textSize="14sp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/view_kind_rent" />

        <View
            android:id="@+id/view_weight_of_goods"
            android:layout_width="match_parent"
            android:layout_height="@dimen/divider_height"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="16dp"
            android:layout_marginRight="20dp"
            android:background="@color/lighterGray"
            android:tag="check_for_visibility"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/txt_text_new_weight_of_goods" />

        <TextView
            android:id="@+id/txt_text_new_value_of_goods"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:layout_marginRight="16dp"
            android:fontFamily="@font/main_medium"
            android:tag="check_for_visibility"
            android:text="Value"
            android:textColor="@color/lightGray"
            android:textSize="14sp"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/view_weight_of_goods" />

        <EditText
            android:id="@+id/et_new_pickup_value_of_goods"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="8dp"
            android:background="@android:color/transparent"
            android:fontFamily="@font/main_medium"
            android:gravity="right"
            android:inputType="number"
            android:paddingLeft="16dp"
            android:paddingTop="16dp"
            android:paddingRight="100dp"
            android:paddingBottom="16dp"
            android:tag="check_for_visibility"
            android:text="@={viewModel.valueOfGoods}"
            android:textColor="@color/darkGray"
            android:textSize="14sp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/view_weight_of_goods" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

另外两个片段类似于 fragment_pickup_sender 和 fragment_pickup_receiver,但具有不同的组件和 id。在我的 fragment_pickup 中,我将有一些按钮用于下一步和上一步,用于更新步骤实时数据以切换 XML 布局。请指导我如何处理这个问题

4

0 回答 0