Aller au contenu

Créer une activité pour ajouter des mots

Vous allez maintenant ajouter une activité qui permet à l'utilisateur d'utiliser le FAB pour saisir de nouveaux mots.

12.1 Créer l'activité NewWordActivity

  1. Ajoutez ces ressources de chaîne dans values/strings.xml :

    values/strings.xml
    1
    2
    3
    <string name="hint_word">Word...</string>
    <string name="button_save">Save</string>
    <string name="empty_not_saved">Word not saved because it is empty.</string>
    
  2. Ajoutez un style aux boutons dans values/styles.xml :

    values/styles.xml
    1
    2
    3
    4
    5
    6
    <style name="button_style" parent="Widget.Material3.Button">
            <item name="android:layout_width">match_parent</item>
            <item name="android:layout_height">wrap_content</item>
            <item name="android:textAppearance">@android:style/TextAppearance.Large</item>
            <item name="android:layout_marginTop">16dp</item>
    </style>
    
  3. Ajoutez un style pour le thème de la nouvelle activité que vous allez créer par la suite, dans values/themes.xml :

    values/themes.xml
    1
    2
    3
    4
    5
    <style name="Theme.RoomWordSample.WithActionBar" parent="Base.Theme.RoomWordSample" >
            <item name="windowActionBar">true</item>
            <item name="windowNoTitle">false</item>
            <item name="toolbarStyle">@style/Widget.Material3.Toolbar.Surface</item>
    </style>
    
  4. Utilisez le modèle Empty Views Activity (en Kotlin) pour créer une nouvelle activité, NewWordActivity. Vérifiez que l'activité a été ajoutée au manifeste Android :

    AndroidManifest.xml
    1
    2
    3
    <activity
        android:name=".NewWordActivity"
        android:exported="false" />
    
  5. Appliquez le nouveau thème Theme.RoomWordSample.WithActionBar à la nouvelle activité et spécifiez MainActivity comme son parent :

    AndroidManifest.xml
    1
    2
    3
    4
    5
    <activity
        android:name=".NewWordActivity"
        android:theme="@style/Theme.RoomWordSample.WithActionBar"
        android:parentActivityName=".MainActivity"
        android:exported="false" />
    
  6. Mettez à jour le fichier activity_new_word.xml dans le dossier layout avec le code suivant :

    layout/activity_new_word.xml
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="32dp"
        tools:context=".NewWordActivity">
    
        <EditText
            android:id="@+id/edit_word"
            style="@style/word_title"
            android:hint="@string/hint_word"
            android:inputType="textAutoComplete" />
    
        <Button
            android:id="@+id/button_save"
            android:text="@string/button_save"
            style="@style/button_style"/>
    
    </LinearLayout>
    
  7. Implémentez la classe NewWordActivity sous le même package que MainActivity, en remplaçant le code généré par le modèle. L'objectif est que lorsque l'utilisateur appuie sur le bouton Save, le nouveau mot soit placé dans un Intent pour être renvoyé à l'activité principale. Voici le code de l'activité NewWordActivity :

    NewWordActivity.kt
    class NewWordActivity : AppCompatActivity() {
    
        private lateinit var editWordView: EditText
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_new_word)
    
            editWordView = findViewById(R.id.edit_word)
    
            val button = findViewById<Button>(R.id.button_save)
            button.setOnClickListener {
                val replyIntent = Intent()
                if (editWordView.text.isEmpty()) {
                    setResult(RESULT_CANCELED, replyIntent)
                } else {
                    val word = editWordView.text.toString()
                    replyIntent.putExtra(EXTRA_REPLY, word)
                    setResult(RESULT_OK, replyIntent)
                }
                finish()
            }
        }
    
        companion object {
            const val EXTRA_REPLY = "unique.key.for.REPLY"
        }
    }
    

12.2 Ajouter du code pour insérer un mot dans la base de données

  1. Dans MainActivity, enregistrez un launcher pour NewWordActivity avec registerForActivityResult(). Si l'activité retourne avec RESULT_OK, insérez le mot retourné dans la base de données en appelant la fonction insert() de WordViewModel. Ajoutez cette propriété à la classe MainActivity (à côté de wordViewModel) :

    MainActivity.kt
    private val newWordActivityLauncher =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            val word = result.data?.getStringExtra(NewWordActivity.EXTRA_REPLY)
            if (result.resultCode == RESULT_OK && word != null) {
                wordViewModel.insert(Word(word))
            } else {
                Toast.makeText(
                    applicationContext,
                    R.string.empty_not_saved,
                    Toast.LENGTH_LONG
                ).show()
            }
        }
    

    registerForActivityResult() plutôt que startActivityForResult()

    Les fonctions startActivityForResult() et onActivityResult(), ainsi que le code de requête associé, sont dépréciées. L'API Activity Result les remplace : le résultat arrive directement dans le lambda passé à registerForActivityResult(), sans code de requête à gérer.

  2. Dans MainActivity, démarrez NewWordActivity lorsque l'utilisateur appuie sur le FAB. Dans la fonction onCreate() de MainActivity, recherchez le FAB et remplacez le code de setOnClickListener avec le code suivant :

    MainActivity.kt
    1
    2
    3
    4
    binding.fab.setOnClickListener {
        val intent = Intent(this, NewWordActivity::class.java)
        newWordActivityLauncher.launch(intent)
    }
    
  3. Maintenant, lancez votre application ! Lorsque vous ajoutez un mot à la base de données dans NewWordActivity, l'interface utilisateur se met automatiquement à jour.