使用片段共享转换时,返回转换未正确工作

20

我有2个片段:ListMovieFragmentDetailMovieFragment

ListMovieFragment中有一个接口,在MainActivity中实现。我正在使用共享元素转换;当我在ListMovieFragment中点击图像视图时,MainActivity中的onMovieSelected被调用。

ListMovieFragment进行转换是有效的。
但是当我点击返回按钮时,从DetailMovieFragmentListMovieFragment的转换无法工作。

gif of what is going wrong

这是MainActivity。我认为我在设置片段转换方面组合不正确。

public class MainActivity extends AppCompatActivity implements ListMovieFragment.MovieSelectedListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(savedInstanceState == null) {
            ListMovieFragment listMovieFragment = new ListMovieFragment();

            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.add(R.id.activity_main, listMovieFragment, ListMovieFragment.TAG);
            fragmentTransaction.commit();
        }
    }

    @Override
    public void onMovieSelected(int movieId) {
        DetailMovieFragment detailMovieFragment =
                (DetailMovieFragment)getSupportFragmentManager().findFragmentByTag(DetailMovieFragment.TAG);
        /* Create a new DetailMovieFragment if not exits */
        if(detailMovieFragment == null) {
            detailMovieFragment = new DetailMovieFragment();
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            /* Get the fragments that will be using the transition */
            ListMovieFragment listMovieFragment =
                    (ListMovieFragment)getSupportFragmentManager().findFragmentByTag(ListMovieFragment.TAG);
            if(listMovieFragment == null) {
                listMovieFragment = new ListMovieFragment();
            }

            /* Inflate the transition */
            Transition changeTransition = TransitionInflater
                    .from(MainActivity.this)
                    .inflateTransition(R.transition.change_image_transform);

            /* source fragment (ListMovieFragment) */
            listMovieFragment.setExitTransition(new Explode());
            listMovieFragment.setSharedElementReturnTransition(changeTransition);

            /* Destination fragment (DetailMovieFragment) */
            detailMovieFragment.setSharedElementEnterTransition(changeTransition);
            detailMovieFragment.setEnterTransition(new Explode());

            /* Get the shared imageview from the source fragment (MovieListFragment) */
            final ImageView ivSharedImage = (ImageView) findViewById(R.id.ivMoviePoster);

            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.activity_main, detailMovieFragment, DetailMovieFragment.TAG);
            fragmentTransaction.addToBackStack(DetailMovieFragment.TAG);
            fragmentTransaction.addSharedElement(ivSharedImage, getResources().getString(R.string.transition_poster_image));
            fragmentTransaction.commit();
        }
        else {
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.activity_main, detailMovieFragment, DetailMovieFragment.TAG);
            fragmentTransaction.addToBackStack(DetailMovieFragment.TAG);
            fragmentTransaction.commit();
        }
    }

    @Override
    public void onBackPressed() {
        if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
            getSupportFragmentManager().popBackStack();
        }
        else {
            super.onBackPressed();
        }
    }
}

我的转换 XML 文件:

<transitionSet>
    <changeBounds />
</transitionSet>

片段列表

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingTop="18dp"
    android:paddingBottom="6dp">

    <ImageView
        android:id="@+id/ivMoviePoster"
        android:layout_width="184dp"
        android:layout_height="276dp"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"
        android:transitionName="@string/transition_poster_image"/>
</LinearLayout>

片段详情

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="me.androidbox.fragmenttransitions.detail.DetailMovieFragment">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="The Movie App"
        android:textSize="28sp"
        android:fontFamily="sans-serif-light"
        android:textColor="@android:color/holo_blue_dark"/>

    <ImageView
        android:id="@+id/ivMoviePoster"
        android:layout_width="92dp"
        android:layout_height="138dp"
        android:layout_marginEnd="16dp"
        android:layout_marginTop="112dp"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"
        android:layout_gravity="end"
        android:transitionName="@string/transition_poster_image"/>
</FrameLayout>

activity_main

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="me.androidbox.fragmenttransitions.activity.MainActivity">
</FrameLayout>

看起来过渡效果很好,但是我们看不到海报初始边界之外的部分。如果更改第一个屏幕的大小或海报的初始大小会发生什么? - cokceken
你能分享一下你的activity_main和fragment布局吗? - Nilesh Singh
@NileshSingh 我已经添加了布局文件。 - ant2009
1个回答

10

您应该按以下方式更改fragment_list.xml,更改android:layout_width/height属性。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="18dp"
    android:paddingBottom="6dp">

    <ImageView
        android:id="@+id/ivMoviePoster"
        android:layout_width="184dp"
        android:layout_height="276dp"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"
        android:transitionName="@string/transition_poster_image"/>
</LinearLayout>

我简直不敢相信这是如此简单。我以为在转换方面做错了什么。谢谢。 - ant2009
@cokceken 我认为代码在没有这个更改的情况下也可以工作。除了match_parent之外,我没有看到任何其他更改。 - Nilesh Singh
@Nilesh Singh 这是关于布局大小的问题。如果您有更大的图像或许多图像,它将起作用。 - cokceken
1
@NileshSingh,由于原始布局将其宽度和高度设置为“wrap content”,如果您有全屏大小的图像,则不会遇到问题。 - cokceken
我正在使用一张350x300的图片,并且使用wrap_content效果非常好。 - Nilesh Singh
显示剩余2条评论

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