How to implement shared transition element from RecyclerView item to Fragment with Android Navigation Component?

前端 未结 5 1551
梦如初夏
梦如初夏 2020-12-30 06:38

I have a pretty straightforward case. I want to implement shared element transition between an item in recyclerView and fragment. I\'m using androi

5条回答
  •  轮回少年
    2020-12-30 07:14

    Here is my example with RecyclerView that have fragment shared transition. In my adapter i am setting different transition name for each item based on position(In my example it is ImageView).

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = items[position]
        holder.itemView.txtView.text=item
        ViewCompat.setTransitionName(holder.itemView.imgViewIcon, "Test_$position")
        holder.setClickListener(object : ViewHolder.ClickListener {
            override fun onClick(v: View, position: Int) {
                when (v.id) {
                    R.id.linearLayout -> listener.onClick(item, holder.itemView.imgViewIcon, position)
                }
            }
        })
    
    }
    

    And when clicking on item, my interface that implemented in source fragment:

    override fun onClick(text: String, img: ImageView, position: Int) {
        val action = MainFragmentDirections.actionMainFragmentToSecondFragment(text, position)
        val extras = FragmentNavigator.Extras.Builder()
                .addSharedElement(img, ViewCompat.getTransitionName(img)!!)
                .build()
        NavHostFragment.findNavController(this@MainFragment).navigate(action, extras)
    }
    

    And in my destination fragment:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        info("onCreate")
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            sharedElementEnterTransition = TransitionInflater.from(context).inflateTransition(android.R.transition.move)
        }
    }
    
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        info("onCreateView")
        return inflater.inflate(R.layout.fragment_second, container, false)
    }
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        info("onViewCreated")
        val name=SecondFragmentArgs.fromBundle(arguments).name
        val position=SecondFragmentArgs.fromBundle(arguments).position
        txtViewName.text=name
        ViewCompat.setTransitionName(imgViewSecond, "Test_$position")
    }
    

提交回复
热议问题