Kotlin

Kotlin – Créer une extension

By 8 novembre 2018 No Comments

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

Leave a Reply