首先,记得为
Activity
、
Fragment
、
FragmentManager
、任何
Transition
和
PathMotion
使用支持版本。
其次,我假设在主活动的布局文件中有一个 ID 为
container
的 FrameLayout,并且您共享的 TextView 具有 ID
mySharedTextView
。
在 Kotlin 中:
您的 MainActivity.kt:
class MainActivity : AppCompatActivity(),
FirstFragment.OnItemSelectedListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
supportFragmentManager.beginTransaction()
.replace(R.id.container, FirstFragment.newInstance())
.addToBackStack(null)
.commit()
}
override fun onItemSelected(id: Long, view: View) {
val secondFragment = SecondFragment.newInstance(itemId)
val sharedElementTransition = TransitionSet()
val changeBounds = ChangeBounds()
changeBounds.setPathMotion(ArcMotion())
sharedElementTransition
.addTransition(changeBounds)
.addTransition(ChangeTransform())
.addTransition(ChangeClipBounds())
.addTransition(ChangeImageTransform())
secondFragment.sharedElementEnterTransition = sharedElementTransition
secondFragment.sharedElementReturnTransition = sharedElementTransition
val mainTransition = Fade()
secondFragment.enterTransition = mainTransition
secondFragment.exitTransition = mainTransition
supportFragmentManager.beginTransaction()
.addSharedElement(view, "${SecondFragment.SHARED_TRANSITION_NAME}-$itemId")
.replace(R.id.container, secondFragment)
.addToBackStack(null)
.commit()
}
}
你的FirstFragment.kt文件:
class FirstFragment : Fragment() {
companion object {
@JvmStatic
fun newInstance() = FirstFragment()
}
private lateinit var listener: OnItemSelectedListener
interface OnItemSelectedListener {
fun onAdSelected(adId: Long, view: View)
}
override fun onAttach(context: Context) {
super.onAttach(context)
try {
listener = activity as OnItemSelectedListener
} catch (e: ClassCastException) {
throw ClassCastException("${activity!!.javaClass} must implement OnItemSelectedListener")
}
}
... onCreate, onCreateView, etc...
inner class ItemAdapter(var items: List<Item> = emptyList()) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
...
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
is ItemViewHolder -> holder.bind(items[position].id)
}
}
internal inner class AdViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(itemId: Long) {
itemView.setOnClickListener {
listener.onItemSelected(itemId, itemView.mySharedTextView)
}
ViewCompat.setTransitionName(itemView.mySharedTextView, "${SecondFragment.SHARED_TRANSITION_NAME}-$itemId")
}
}
...
}
}
你的 SecondFragment.kt 文件:
class SecondFragment : Fragment() {
companion object {
const val ARG_ITEM_ID = "ARG_ITEM_ID"
const val SHARED_TRANSITION_NAME = "text_view_transition_name"
@JvmStatic
fun newInstance(itemId: Long): SecondFragment {
val fragment = SecondFragment()
fragment.arguments = Bundle()
fragment.arguments!!.putLong(ARG_ITEM_ID, itemID)
return fragment
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.second_fragment, container, false)
ViewCompat.setTransitionName(view.mySharedTextView, "$SHARED_TRANSITION_NAME-${arguments!!.getLong(ARG_ITEM_ID)}")
}
}
就是这样。