Ребенок MotionLayout игнорирует "setVisibility" - PullRequest
0 голосов
/ 31 марта 2020

Допустим, у меня есть простой интерфейс с макетом движения:

// activity_main. xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/motion"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutDescription="@transition/motion_scene"
    app:showPaths="true">

    <View
        android:id="@+id/view"
        android:layout_width="0dp"
        android:layout_height="250dp"
        android:background="#CCAA33"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        />

    <ProgressBar
        android:id="@+id/progress_bar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="visible"
        android:progressTint="#3366CC"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        />
</androidx.constraintlayout.motion.widget.MotionLayout>

со сценой макета движения:

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

    <Transition
            app:constraintSetStart="@id/collapsed"
            app:constraintSetEnd="@id/expanded"
            app:duration="1000">
        <OnSwipe
                app:touchAnchorId="@id/view"
                app:touchAnchorSide="top"
                app:dragDirection="dragUp" />
    </Transition>
    <ConstraintSet android:id="@+id/collapsed">

    </ConstraintSet>

    <ConstraintSet android:id="@+id/expanded">

    </ConstraintSet>
</MotionScene>

Image1

(он ничего не делает, потому что я все разобрал для демонстрационных целей).

Теперь, если я попытаюсь скрыть индикатор выполнения (скажем, в представлении щелкните):

// MainActivity.kt

import android.content.res.ColorStateList
import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.widget.ProgressBar
import androidx.appcompat.app.AppCompatActivity


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        val view = findViewById<View>(R.id.view)
        val progressBar = findViewById<ProgressBar>(R.id.progress_bar)

        view.setOnClickListener {
            view.setBackgroundColor(Color.parseColor("#006699"))
            progressBar.progressTintList = ColorStateList.valueOf(Color.parseColor("#FF3300"))
            progressBar.visibility = View.GONE
        }
    }
}

(цвета задаются только для демонстрационных целей).

Image2

По какой-то причине индикатор выполнения все еще отображается на экране (цвет фона установлен правильно). Если я нажму еще раз, индикатор выполнения перезапускает прогресс.

Мне кажется, что макет как-то недействителен.

Я ожидаю, что индикатор выполнения будет скрыт после щелчка просмотра. Что-то не так с макетом движения или моим пониманием? Как я могу избежать этого эффекта и скрыть индикатор выполнения?

Спасибо!

1 Ответ

1 голос
/ 01 апреля 2020

Да! Я был очень расстроен этим также. Я смог решить эту проблему, поместив тег visibilityMode="ignore" внутри тега ограничения для нужного представления (примечание: я добавил этот тег как для начального, так и для конечного ограничения). Для получения дополнительной информации, вы можете проверить этот пост . Таким образом, внутри вашего ConstraintSet вам понадобится Constraint, подобный этому

<Constraint
        android:id="@id/progress_bar"
        motion:visibilityMode="ignore"/>

для каждого вида и установки режима видимости.

Надеюсь, что это работает для вас!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...