6

我在我的主要活动中使用运动布局。它工作正常。但是,当我移动到其他活动并导航回我的主要活动时,有时活动会重置并且布局处于其起始状态。如何防止这种情况发生?除此之外,我还有另一个关于运动布局的问题,我在这里问过

4

5 回答 5

9

我所做的是添加一个字段,一个布尔字段,并使用生命周期来处理它。

    private var hasMotionScrolled = false

    override fun onResume() {
        super.onResume()
        if (hasMotionScrolled) motionLayout.progress = MOTION_TRANSITION_COMPLETED
    }

    override fun onPause() {
        super.onPause()
        hasMotionScrolled = motionLayout.progress > MOTION_TRANSITION_INITIAL
    }


    companion object {
        private const val MOTION_TRANSITION_COMPLETED = 1F
        private const val MOTION_TRANSITION_INITIAL = 0F
    }

所以在我的例子中,运动布局正在做一个与滚动相关的动画。如果这不是你的情况,也许你可以直接使用motionLayout.progress. 我直接使用的问题progress是中间状态会使其他元素在返回时不可见,这就是实现全有或全无布尔标志的原因。

我不认为这是一个干净的解决方案,一个标志总是意味着其他东西可能会更好,如果你能找到官方的东西,请在评论中告诉我。

于 2020-03-23T14:16:18.637 回答
3

您必须保存/恢复 MotionLayout 的进度:

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putFloat("progress", motionLayout.progress)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        if (savedInstanceState != null)
            motionLayout.progress = savedInstanceState.getFloat("progress", 0f)
        ...
    }
于 2019-06-06T14:09:10.977 回答
2

这就是我的做法Fragment

Fragment在你的类上创建一个实例变量:

var motionProgress = 0f // 0f being initial state

在您的onViewCreated函数上,为布局提供当前值:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    binding.motionLayout.progress = motionProgress
}

最后,当离开 时Fragment,更新motionProgresson 函数的值onPause

override fun onPause() {
    super.onPause()

    motionProgress = binding.motionLayout.progress
}
于 2021-03-03T14:56:10.690 回答
1

您可以将过渡侦听器添加到运动布局并在过渡完成时保存标志。之后,当重新创建活动时,您可以读取该标志并使用 smth,如:

motionLayout.setState(R.id.end, ConstraintSet.WRAP_CONTENT, ConstraintSet.WRAP_CONTENT)

其中 R.id.end 是 constraintSetEnd 属性的 id。

于 2019-01-03T09:47:17.457 回答
0
class ExtMotionLayout : MotionLayout {
    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    override fun onSaveInstanceState(): Parcelable? {
        return SavedState(progress, super.onSaveInstanceState())
    }

    override fun onRestoreInstanceState(state: Parcelable?) {
        if (state is SavedState) {
            progress = state.progress
            super.onRestoreInstanceState(state.superState)
        } else super.onRestoreInstanceState(state)
    }

    class SavedState : BaseSavedState {
        val progress: Float

        constructor(progress: Float, source: Parcelable?) : super(source) {
            this.progress = progress
        }

        constructor(superState: Parcel) : super(superState) {
            progress = superState.readFloat()
        }

        override fun writeToParcel(out: Parcel, flags: Int) {
            super.writeToParcel(out, flags)
            out.writeFloat(progress)
        }
    }
}
于 2020-01-16T11:48:03.110 回答