【已解决】 从Activity中管理的fragment使用share element跳转到另一个fragment不起作用。
   我在MainActivity中有一个HomeFragment,HomeFragment布局中有一张图片,点击这张图片打开SearchFragment,以下是我在这样两个Fragment布局中的图片
fragment_search.xml
<ImageView
    android:id="@+id/ivProfile"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_alipay_48"
    android:transitionName="profile"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
fragment_home.xml
<ImageView
    android:id="@+id/ivProfile"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_alipay_48"
    android:transitionName="profile" />
HomeFragment图片的点击事件我暴露了一个OnSearchBarClickListener接口出来,把fragment切换逻辑写在了MainAcitivty里
mSearchFragment.sharedElementEnterTransition =
        TransitionInflater.from(this).inflateTransition(R.transition.share_search_bar)
mHomeFragment.setOnSearchBarClickedListener {
    supportFragmentManager.beginTransaction()
            .replace(R.id.container, mSearchFragment)
            .addSharedElement(mHomeFragment.ivProfile, "profile")
            .addToBackStack(null)
            .commit()
}
R.transition.share_search_bar
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <autoTransition android:duration="@integer/animNormalSpeed" />
</transitionSet>
这几天刚刚开始学Kotlin,也不知道这么写对不对…
我本意并不是想共享两个简单的图片,我想的是在HomeFragment中放一个TextView点击后切换到SearchFragment,这个SearchFragment里和他共享的是一个自定义组合控件
HomeFragment里的TextView

SearchFragment里的自定义组合控件

两者长得几乎一样…就是想让他位置向上移动并且宽度变窄以额外显示一个取消按钮。然后跑起来没得效果,所以我就想是不是我共享的元素太复杂了…然后我没有使用jetpack的Navigation,就没有跟着康师傅代码走,所以我从这个网站里找了案例来试试看…
https://guides.codepath.com/android/shared-element-activity-transition#fragment-shared-elements-transitions
结果仅仅共享图片也没有效果…
从昨天下午到现在我还没搞明白
不你跟着视频走就算了,那你得有根据呀。
这是官方文档
https://developer.android.com/training/basics/fragments/animate
这个是原生的切换。也就是手动replace的。
找到坑了,希望可以帮助后面踩坑的同学
这个共享元素很好用…不论你的两个fragment中共享的元素放在哪里,不论这两个元素的类型是否一样,不论整个页面布局多么复杂都没有关系,唯一有关系的就是他们的transitionName要一致,还有我踩的这个坑:
我的MainActivity管理了三个子Fragment,页面布局的最底下有一个BottomNavigationView,这个底部导航栏不论怎么样都是在这三个子Fragment的顶层的,这是没问题的,因为就是要这样才方便页面切换,但是搜索页面就不同了,当我打开搜索页面的时候这个底部导航栏就不能被看到,否则会很奇怪,因此我把SearchFragment放在了底部导航栏的父容器下,这样就可以让SearchFragment将底部导航栏遮盖住,这个SearchFragment就没有放在和三个子Fragment同一个容器下,就是这里导致的问题。
也就是说,在MainActivity的页面replace时要把SearchFragment放在和他有共享元素的Fragment同一个容器下,即下面的 R.id.navHostFragment
mHome.setOnSearchBarClickedListener { supportFragmentManager.beginTransaction() .replace(R.id.navHostFragment, mSearch) .addSharedElement(mHome.home_search_bar, getString(R.string.shareSearchBar)) .addToBackStack(null) .commit() }希望能帮到和我有一样问题的同学
而且还有demo
你可以下载下来跑一下,对着源码学习一下。