#android #visibility #android-motionlayout
#Android #видимость #android-motionlayout
Вопрос:
Я пробую MotionLayout
в первый раз, и у меня возникают проблемы с изменением видимости TextInputLayouts
в моем MotionScene
.
motion_scene.xml
<?xml version="1.0" encoding="utf-8"?>
<MotionScene
xmlns:motion="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<Transition
motion:constraintSetStart="@id/afinstall"
motion:constraintSetEnd="@id/signin"
motion:duration="1000">
<OnClick
motion:targetId="@id/button_sign_in"
motion:clickAction="transitionToEnd"/>
<OnClick
/>
</Transition>
<Transition
motion:constraintSetEnd="@id/afinstall"
motion:constraintSetStart="@id/signin"
motion:duration="1000">
<OnClick
motion:targetId="@id/button_back"
motion:clickAction="transitionToEnd"/>
<OnClick
/>
</Transition>
.............
<ConstraintSet android:id="@ id/afinstall">
....
<Constraint
android:layout_width="282dp"
android:layout_height="wrap_content"
android:hint="Username"
android:layout_marginEnd="8dp"
motion:layout_constraintEnd_toEndOf="parent" android:layout_marginStart="8dp"
motion:layout_constraintStart_toStartOf="parent" android:id="@ id/sign_in_username_tf"
android:layout_marginTop="1dp" motion:layout_constraintTop_toBottomOf="@ id/app_slogan"
android:visibility="gone" />
<Constraint
android:layout_width="282dp"
android:layout_height="wrap_content"
android:hint="Password"
android:layout_marginStart="8dp"
motion:layout_constraintStart_toStartOf="parent" android:layout_marginEnd="8dp"
motion:layout_constraintEnd_toEndOf="parent" android:id="@ id/sign_in_password_tf"
android:layout_marginTop="1dp" motion:layout_constraintTop_toBottomOf="@ id/sign_in_username_tf"
android:visibility="gone"/>
....
</ConstraintSet>
<ConstraintSet android:id="@ id/signin">
....
<Constraint
android:layout_width="282dp"
android:layout_height="wrap_content"
android:hint="Username"
android:layout_marginEnd="8dp"
motion:layout_constraintEnd_toEndOf="parent" android:layout_marginStart="8dp"
motion:layout_constraintStart_toStartOf="parent" android:id="@ id/sign_in_username_tf"
android:layout_marginTop="110dp" motion:layout_constraintTop_toBottomOf="@ id/app_slogan"
android:visibility="visible"/>
<Constraint
android:layout_width="282dp"
android:layout_height="wrap_content"
android:hint="Password"
android:layout_marginTop="15dp"
motion:layout_constraintTop_toBottomOf="@ id/sign_in_username_tf" android:layout_marginStart="8dp"
motion:layout_constraintStart_toStartOf="parent" android:layout_marginEnd="8dp"
motion:layout_constraintEnd_toEndOf="parent" android:id="@ id/sign_in_password_tf"
android:visibility="visible"/>
....
</ConstraintSet>
</MotionScene>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.motion.MotionLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutDescription="@xml/motion_scene"
tools:context=".MainActivity">
....
<android.support.design.widget.TextInputLayout
android:layout_width="282dp"
android:layout_height="wrap_content"
android:hint="Username"
android:layout_marginEnd="8dp"
app:layout_constraintEnd_toEndOf="parent" android:layout_marginStart="8dp"
app:layout_constraintStart_toStartOf="parent" android:id="@ id/sign_in_username_tf"
android:layout_marginTop="1dp" app:layout_constraintTop_toBottomOf="@ id/app_slogan"
android:visibility="gone">
<android.support.design.widget.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/nunito_sans" android:textSize="20sp"
android:textColor="@color/colorPrimaryLi"/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_width="282dp"
android:layout_height="wrap_content"
android:hint="Password" app:hintEnabled="true"
app:hintAnimationEnabled="true"
android:layout_marginStart="8dp"
app:layout_constraintStart_toStartOf="parent" android:layout_marginEnd="8dp"
app:layout_constraintEnd_toEndOf="parent" android:id="@ id/sign_in_password_tf"
android:layout_marginTop="1dp" app:layout_constraintTop_toBottomOf="@ id/sign_in_username_tf"
android:visibility="gone">
<android.support.design.widget.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/nunito_sans" android:textSize="20sp"
android:textColor="@color/colorPrimaryLi"/>
</android.support.design.widget.TextInputLayout>
....
</android.support.constraint.motion.MotionLayout>
Я пытался возиться с вещами, но я не мог указать, почему это происходит на самом деле.
Пожалуйста, не помечайте это как дубликат, потому что это довольно новая библиотека, которую я пытаюсь. Я бы с радостью уточнил, если потребуется.
Комментарии:
1. Эта ошибка все еще присутствует в beta1. Вы смогли сообщить о проблеме?
Ответ №1:
Я обнаружил, что в настоящее время (альфа 5) изменение видимости не работает (оно работает, если вы установили его в constrainsets, но не в наборах событий или ключевых фреймов) В качестве обходного пути я использую alpha 0-1, чтобы сделать view видимым или нет, и добавляю прослушиватели incode, чтобы сделать его интерактивным
Ответ №2:
Вы должны использовать <KeyFrameSet>
inside <Trasition>
и переопределить <KeyAttribute>
Ответ №3:
Вместо объявления видимости в ограничении вы можете попробовать объявить видимость как пользовательский атрибут. Итак, для вашего первого ограничения попробуйте это:
<Constraint
android:layout_width="282dp"
android:layout_height="wrap_content"
android:hint="Username"
android:layout_marginEnd="8dp"
motion:layout_constraintEnd_toEndOf="parent"
android:layout_marginStart="8dp"
motion:layout_constraintStart_toStartOf="parent"
android:id="@ id/sign_in_username_tf"
android:layout_marginTop="1dp"
motion:layout_constraintTop_toBottomOf="@ id/app_slogan" >
<CustomAttribute
motion:attributeName="visibility"
motion:customIntegerValue="8" />
</Constraint>
Объявив видимость как пользовательский атрибут, это должно помочь макету движения правильно интерполировать значения видимости. Немного неинтуитивно, какое значение int является видимостью, но они определяются следующим образом
Visible = 0
Invisible = 4
Gone = 8