TextInputLayout共享元素转换问题

14

我们来看:有两个界面(Activity)共享一个元素(按钮)的转场动画。第二个Activity有一个带提示信息的TextInputLayout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:focusable="true"
              android:focusableInTouchMode="true"
              android:gravity="center_horizontal"
              android:orientation="vertical">

    <Button android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:text="GO"
            android:transitionName="test"/>

    <android.support.design.widget.TextInputLayout android:layout_width="match_parent"
                                                   android:layout_height="wrap_content"
                                                   android:hint="WTF?!">
        <android.support.design.widget.TextInputEditText android:layout_width="match_parent"
                                                         android:layout_height="wrap_content"/>
    </android.support.design.widget.TextInputLayout>
</LinearLayout>   
第二个 Activity 的进入转场被延迟以澄清问题: TextInputLayout 的提示忽略了过渡动画并在过渡开始后立即显示。 在动画结束时,您可以看到提示下方正确动画化的 EditText 背景(水平线)。 这是一个错误还是我漏掉了什么? 这是第二个 Activity
public class SecondActivity extends AppCompatActivity {

    public static void launch(Activity activity, View sharedElement) {
        Intent intent = new Intent(activity, SecondActivity.class);

        ActivityOptionsCompat options = ActivityOptionsCompat.
                makeSceneTransitionAnimation(activity, sharedElement, "test");
        activity.startActivity(intent, options.toBundle());
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().setEnterTransition(new Slide().setDuration(5000));
        }
    }
}

编辑:通过给第二个活动的布局添加背景可以“修复”此错误。

without backgroundwith background


你们共享的元素是什么?你们期望会发生什么? - azizbekian
共享元素是按钮,正如您从示例代码中所看到的那样。期望的是,TextInputLayout的提示能够作为Activity转换的一部分得到适当的动画处理,就像视图的其余部分一样(请查看视频中EditText背景的适当转换)。 - artkoenig
请明确您的问题。您的动画GIF看起来很不错,我们已经拿到了。这是非常酷的动画。但我不明白,问题在哪里?它在哪里?我看到的是蓝线向上移动。就这些。然后短暂的闪烁——输入字段下方出现一条线。这是预期的吗?还是意外的?什么鬼? - babay
TextInputLayout 的提示信息没有动画效果,在切换到第二个 Activity 后立即显示出来。EditText 的背景闪烁的光标线会在 Activity 切换结束时出现。蓝色线条是第二个 Activity 的状态栏,在进入时有动画效果。这里没有什么酷或特别的东西,只是上面展示的代码。 - artkoenig
3个回答

16

适用于API 21及以上版本

android:transitionGroup="true"
将此行添加到 TextInputLayout 中。它可以解决问题。或者,如果您有几个 TextInputLayout ,则将该行添加到它们的容器中。

0

我认为这是TextInputLayout的一个bug。我将其删除并将提示信息添加到TextInputEditText中,它按照您的期望工作。

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="GO"
        android:transitionName="test" />


    <android.support.design.widget.TextInputEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="WTF?!" />

</LinearLayout>

0

似乎是一个错误。我提交了一个新问题

您可以通过为第二个活动定义android:background来避免这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接