aac-navigation-shared-elements-transition
aac-navigation-shared-elements-transition allows you to use shared elements transitions between fragments.
Usage
Add in project
Add specific maven repository to repositories closure. For example, you should add it to root
of build.gradle
:
allprojects {
repositories {
maven { url "https://dl.bintray.com/lion4ik/maven" }
}
}
Add dependency:
dependencies {
implementation "com.github.lion4ik:arch-navigation-shared-elements:$version"
}
where recommended $version
is the latest from Download badge .
How to use
To integrate with aac-navigation-shared-elements-transition you need to do several steps
- You need to declare navigation fragment in your xml layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark"/>
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/my_nav_host_fragment"
android:name="com.github.lion4ik.arch.sharedelements.NavHostSharedElementsTransitionFragment"
app:navGraph="@navigation/mobile_navigation"
app:defaultNavHost="false"
/>
</LinearLayout>
- Fragment which is responsible for navigation to details fragment with shared element transition should implement interface:
interface HasSharedElements {
fun getSharedElements(): Map<String, View>
fun hasReorderingAllowed(): Boolean
}
You can do it like this:
class SharedElementFragment : Fragment(), HasSharedElements {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_shared_element, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view.findViewById<View>(R.id.imgView).setOnClickListener(
Navigation.createNavigateOnClickListener(R.id.next_action)
)
}
override fun getSharedElements(): Map<String, View> {
val view = view?.findViewById<View>(R.id.imgView) ?: throw IllegalArgumentException("view is null")
return mapOf(view.transitionName to view)
}
override fun hasReorderingAllowed(): Boolean = true
}
FragmentManager
gets views as shared elements through getSharedElements()
method implemented by Fragment
. Shared elements will be add to FragmentTransaction
by addSharedElement
method. Also, in some cases you need to set reordering flag for FragmentTransaction
.