动画布局:警告找不到视图ID -1 [英] Motionlayout: WARNING could not find view id -1

查看:60
本文介绍了动画布局:警告找不到视图ID -1的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题是,我不断收到警告 W/MotionLayout:警告找不到视图ID -1 .因此,我的MotionLayout确实很慢,几乎从 expanded状态跳到了 collapsed状态.等待几秒钟后,动画开始变好(不再跳跃/不再滞后),但警告仍然存在.

My problem is, that I constantly get the warning W/MotionLayout: WARNING could not find view id -1. Because of this, my MotionLayout is really laggy and nearly jumps from the expanded state to the collapsed state. After waiting a couple of seconds, the animation starts getting better (no jumping / laggs anymore), but the warning remains.

<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="product"
            type="com.example.app.framework.datasource.models.product.Product" />
    </data>

    <androidx.constraintlayout.motion.widget.MotionLayout
        android:id="@+id/shop_motion_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutDescription="@xml/shop_item_content_scene"
        app:showPaths="true"
        tools:context=".framework.ui.view.fragments.shop.ShopItemFragment">

        <com.google.android.material.appbar.MaterialToolbar
            android:id="@+id/shop_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/ThemeOverlay.AppCompat.Light"
            app:menu="@menu/shop_item_toolbar"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageView
            android:id="@+id/product_image"
            android:layout_width="0dp"
            android:layout_height="142dp"
            android:layout_marginStart="72dp"
            android:layout_marginTop="@dimen/standard8dpMargin"
            android:layout_marginEnd="72dp"
            android:adjustViewBounds="true"
            android:contentDescription="@null"
            android:fitsSystemWindows="true"
            app:loadImage="@{product.images[0]}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/shop_toolbar" />

        <com.google.android.material.textview.MaterialTextView
            android:id="@+id/product_name"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/big16dpMargin"
            android:layout_marginBottom="12dp"
            android:ellipsize="end"
            android:fontFamily="sans-serif-medium"
            android:maxLines="2"
            android:text="@{product.name}"
            android:textAlignment="textStart"
            android:textColor="@color/color_text_dark"
            android:textSize="@dimen/textHeadlineNormal1"
            app:layout_constraintBottom_toTopOf="@id/scrollview_shop"
            app:layout_constraintEnd_toEndOf="@id/barrier"
            app:layout_constraintStart_toStartOf="@id/margin_left"
            app:layout_constraintTop_toBottomOf="@+id/product_image"
            tools:text="Long text to test some stuff etc. bla bla" />

        <com.google.android.material.button.MaterialButton
            android:id="@+id/btn_shop"
            style="@style/Widget.MaterialComponents.Button.Icon"
            android:layout_width="56dp"
            android:layout_height="56dp"
            android:layout_marginEnd="16dp"
            android:backgroundTint="@color/color_btn_blue"
            android:insetLeft="0dp"
            android:insetTop="0dp"
            android:insetRight="0dp"
            android:insetBottom="0dp"
            android:padding="0dp"
            app:icon="@drawable/ic_shopping_cart_filled"
            app:iconGravity="textStart"
            app:iconPadding="0dp"
            app:layout_constraintBottom_toTopOf="@id/scrollview_shop"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="@id/scrollview_shop"
            app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Example.Button.Circle" />

        <!-- My scrollview -->
        <androidx.core.widget.NestedScrollView
            android:id="@+id/scrollview_shop"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:fillViewport="true"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/product_name">

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

                <com.google.android.material.textview.MaterialTextView
                    android:id="@+id/product_article_number"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="@dimen/standard8dpMargin"
                    android:text="FISCH"
                    android:textAlignment="textStart"
                    android:textColor="@color/color_text_gray"
                    android:textDirection="locale"
                    android:textSize="@dimen/textDescriptionNormal2"
                    android:textStyle="normal"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent"
                    tools:text="A 1234567" />

                <com.google.android.material.textview.MaterialTextView
                    android:id="@+id/tv_mwst_disclaimer"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="@dimen/standard8dpMargin"
                    android:text="SEIFE"
                    android:textAlignment="textStart"
                    android:textColor="@color/color_text_mwst"
                    android:textDirection="locale"
                    android:textSize="@dimen/textDescriptionNormal4"
                    android:textStyle="italic"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@id/product_article_number"
                    tools:text="PREIS" />

            </androidx.constraintlayout.widget.ConstraintLayout>
        </androidx.core.widget.NestedScrollView>

        <androidx.constraintlayout.widget.Barrier
            android:id="@+id/barrier"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:barrierDirection="left"
            app:constraint_referenced_ids="btn_shop" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/margin_left"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_begin="@dimen/big16dpMargin" />

    </androidx.constraintlayout.motion.widget.MotionLayout>
</layout>

ContentScene XML

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

    <Transition
        app:constraintSetEnd="@id/collapsed"
        app:constraintSetStart="@id/expanded">

        <OnSwipe
            motion:dragDirection="dragUp"
            app:onTouchUp="stop"
            motion:touchAnchorId="@id/scrollview_shop"
            motion:touchAnchorSide="top" />

        <KeyFrameSet>
            <KeyAttribute
                app:motionTarget="@id/product_image"
                app:framePosition="40"
                android:alpha="0.0" />
        </KeyFrameSet>
    </Transition>

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

    <ConstraintSet android:id="@+id/collapsed">
        <Constraint
            android:id="@id/product_image"
            android:layout_height="?attr/actionBarSize"
            android:layout_marginStart="56dp"
            android:layout_marginEnd="56dp"
            android:alpha="0.0"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
        <Constraint
            android:id="@id/product_name"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="56dp"
            android:layout_marginEnd="@dimen/standard8dpMargin"
            android:scaleX="0.925"
            android:scaleY="0.925"
            app:layout_constraintBottom_toBottomOf="@id/shop_toolbar"
            app:layout_constraintTop_toTopOf="@id/shop_toolbar"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="@id/barrier" />

        <Constraint
            android:id="@id/btn_shop"
            android:layout_marginEnd="@dimen/big16dpMargin"
            android:layout_width="56dp"
            android:layout_height="56dp"
            app:layout_constraintBottom_toBottomOf="@id/shop_toolbar"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/product_name" />
    </ConstraintSet>

</MotionScene>

片段

class ShopItemFragment : Fragment(R.layout.fragment_shop_item) {
    private val productArgs by navArgs<ShopItemFragmentArgs>()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? = FragmentShopItemBinding.inflate(inflater, container, false).apply {
        product = productArgs.product
    }.root

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

    private fun initToolbar() = shop_toolbar.apply {
        setupWithNavController(findNavController(), AppBarConfiguration(findNavController().graph))
    }
}

展开

我尽力调试代码,发现以下内容:在我看来, mConstraintSetId 的值是 -1 ,我认为那个logcat正在警告我这一点.我该如何更改此值,或者更好地说:为什么此值为-1?

I've tried to debug my code as good as I can and I found following: In my view, the mConstraintSetId has the value -1, and I think that logcat is warning me about that. How can I change this value or to say better: Why is this value -1?

推荐答案


问题:

您需要的主要事情不是同时使用在同一 MotionScene 中混合的 app motion xml命名空间:


The Issue:

The main thing you needed was not not be using both app and motion xml namespaces mixed in the same MotionScene:

xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:motion="http://schemas.android.com/tools"

您都可以使用,但必须坚持使用.我更喜欢 app -使我更容易在布局XML和运动场景XML之间切换.

You can use either, but you have to stick with one. I prefer app - makes it easier for me to jump between layout XML and motion scene XML.

就目前而言,因为您同时使用了两者,所以MotionLayout只是选择了标有 app 的属性,而忽略了 motion 的属性,这意味着您对 OnSwipe 与此相同:

As it stood, because you were using both, MotionLayout just picked up attributes tagged with app and disregarded motion ones, which meant your instructions for OnSwipe were the same as this:

<OnSwipe app:onTouchUp="stop" />

这就是为什么您看到 WARNING找不到视图ID -1 的原因,这可能意味着MotionLayout在这种情况下需要更好的错误消息,或者如果有多个名称空间,则根本不应该编译使用.

That's why you were seeing the WARNING could not find view id -1, which probably means MotionLayout needs a better error message in that case, or shouldn't compile at all if more than one namespace is used.

因此,假设您删除了 motion 命名空间,那么您要做的就是将 OnSwipe 过渡更新为此:

So let's say you delete motion namespace, then all you have to do is update the OnSwipe transition to this:

        <OnSwipe
            app:dragDirection="dragUp"
            app:onTouchUp="stop"
            app:touchAnchorId="@id/scrollview_shop"
            app:touchAnchorSide="top" />

然后您的过渡应该运行得很好.

And then your transition should run just fine.

这篇关于动画布局:警告找不到视图ID -1的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆