我有一个需要显示的片段,并通过一些步骤将一些 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 布局。请指导我如何处理这个问题