Une des nouveautés apportée par le langage Kotlin est la fonction d’extensions. Cela permet d’ajouter de nouvelles fonctionnalités à une classe sans avoir à l’étendre ou à utiliser un design pattern type Decorator.
Si vous avez besoin d’une fonctionnalité n’existant pas par défaut sur l’objet sur lequel vous souhaitez l’utiliser, vous pouvez alors créer une extension.
Prenons l’exemple d’une barre de menu se trouvant en bas de votre activité. Le but étant d’afficher ou cacher celle-ci avec un effet.
Ce menu est défini comme ceci coté xml :
<LinearLayout android:id="@+id/menu" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="10dp" android:paddingTop="10dp" android:visibility="visible" android:background="@android:color/white" app:layout_constraintBottom_toBottomOf="parent" android:weightSum="3"> <Button android:id="@+id/bouton1" android:layout_width="0dp" android:layout_weight="1" android:drawableTop="@drawable/ic_refresh" android:layout_height="68dp" android:textAllCaps="false" android:textColor="@color/colorPrimary" android:textSize="11sp" android:text="@string/refresh"/> <Button android:id="@+id/bouton2" android:layout_width="0dp" android:layout_weight="1" android:drawableTop="@drawable/ic_locate_2" android:layout_height="68dp" android:textSize="11sp" android:textAllCaps="false" android:textColor="@color/colorPrimary" android:text="@string/locate"/> <Button android:id="@+id/bouton3" android:layout_width="0dp" android:layout_weight="1" android:drawableTop="@drawable/ic_star_2" android:layout_height="68dp" android:textSize="11sp" android:textAllCaps="false" android:textColor="@color/colorPrimary" android:text="@string/favorite"/> </LinearLayout>
LinearLayout hérite de ViewGroup, héritant lui même de la classe View.
Nous allons donc pouvoir créer l’extension au niveau de la classe View, qui pourra s’appliquer sur notre LinearLayout.
Il suffit de créer une nouvelle classe : ViewExtension.kt. Celle-ci contiendra les extensions que l’on va développer pour les Views.
Dans cette classe, nous allons créer 2 méthodes « showWithSlideBottomAnimation » et « hideWithSlideBottomAnimation », ces méthodes s’appliquant sur des objets de type « View ».
package xxx.xxx.xxx import android.view.View import android.view.animation.AnimationUtils import androidx.core.view.isVisible fun View.showWithSlideUpAnimation() { val slideUp = AnimationUtils.loadAnimation(this.context, R.anim.slide_up) isVisible = true startAnimation(slideUp) } fun View.hideWithSlideBottomAnimation() { val slideBottom = AnimationUtils.loadAnimation(this.context, R.anim.slide_bottom) startAnimation(slideBottom) isVisible = false }
Il ne reste plus qu’a utiliser ces 2 extensions dans votre activity
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) afficher.setOnClickListener { menu.showWithSlideBottomAnimation() afficher.visibility = View.GONE cacher.visibility = View.VISIBLE } cacher.setOnClickListener { menu.hideWithSlideBottomAnimation() afficher.visibility = View.VISIBLE cacher.visibility = View.GONE } } }
Le code source de cette exemple est disponbile sur github.
Voici le résultat