我们有一个Fragment
(托管在Activity
中),其中包含一个搜索栏(由EditText
包裹的CardView
)。我们想通过此搜索栏执行到另一个活动的共享元素转换,并在顶部进行相同的搜索。您可能已经在其他应用程序中看到了这种常见模式。
执行初始实现后,向前过渡(从Fragment
到Activity
)看起来很好并且看起来很平滑。但是,当我按下“后退”按钮退出新的Activity
时,返回的动画非常混乱。
某些代码:
MyFragment
class MyFragment : BaseFragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate view.
val view = inflater.inflate(R.layout.my_fragment, container, false)
view.search_input.setOnClickListener {
var intent = Intent(activity, SearchActivity::class.java)
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
activity!!,
view.search_wrapper as View,
"search"
)
activity!!.startActivity(intent, options.toBundle())
}
return view
}
}
my_fragment.xml
<ConstraintLayout>
<androidx.cardview.widget.CardView
android:id="@+id/search_wrapper"
android:transitionName="search"
android:clickable="true"
...>
<EditText
android:focusable="false"
android:cursorVisible="false"
android:inputType="none"
android:clickable="false"
... />
</androidx.cardview.widget.CardView>
</ConstraintLayout>
SearchActivity
class SearchActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_search)
}
override fun onBackPressed() {
supportFinishAfterTransition()
}
}
activity_search.xml
<androidx.constraintlayout.widget.ConstraintLayout>
<FrameLayout
app:layout_constraintTop_toTopOf="parent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
....>
<androidx.cardview.widget.CardView
android:id="@+id/search_wrapper"
android:transitionName="search"
...>
<EditText
android:id="@+id/search_input"
... />
</androidx.cardview.widget.CardView>
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
最后,<item name="android:windowContentTransitions">true</item>
设置为我们的AppTheme
风格。
随附的是展示问题的简短视频。
问题
Fragment
到Activity
的共享元素转换吗?