【已解决】 从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
希望能帮到和我有一样问题的同学
而且还有demo
你可以下载下来跑一下,对着源码学习一下。