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 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. 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.java
public class NewWordActivity extends AppCompatActivity {
public static final String EXTRA_REPLY = "unique.key.for.REPLY";

private EditText mEditWordView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_word);

    mEditWordView = findViewById(R.id.edit_word);

    final Button button = findViewById(R.id.button_save);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            Intent replyIntent = new Intent();
            if (TextUtils.isEmpty(mEditWordView.getText())) {
                setResult(RESULT_CANCELED, replyIntent);
            } else {
                String word = mEditWordView.getText().toString();
                replyIntent.putExtra(EXTRA_REPLY, word);
                setResult(RESULT_OK, replyIntent);
            }
            finish();
        }
    });
}
}

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

  1. Définissez un code de demande en tant que membre de la MainActivity :

    MainActivity.java
    public static final int NEW_WORD_ACTIVITY_REQUEST_CODE = 1;
    
  2. Dans MainActivity, ajoutez le rappel onActivityResult() pour NewWordActivity. Si l'activité retourne avec RESULT_OK, insérez le mot retourné dans la base de données en appelant la méthode insert() de WordViewModel :

    MainActivity.java
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            if (requestCode == NEW_WORD_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) {
                Word word = new Word(data.getStringExtra(NewWordActivity.EXTRA_REPLY));
                mWordViewModel.insert(word);
            } else {
                Toast.makeText(
                        getApplicationContext(),
                        R.string.empty_not_saved,
                        Toast.LENGTH_LONG).show();
            }
    }
    
  3. Dans MainActivity, démarrez NewWordActivity lorsque l'utilisateur appuie sur le FAB. Dans la méthode onCreate() de MainActivity, recherchez le FAB et remplacez le code de onClick() avec le code suivant :

    MainActivity.java
    1
    2
    3
    4
    5
    6
    7
    binding.fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(MainActivity.this, NewWordActivity.class);
            startActivityForResult(intent, NEW_WORD_ACTIVITY_REQUEST_CODE);
        }
    });
    
  4. Maintenant, lancez votre application ! Lorsque vous ajoutez un mot à la base de données dans NewWordActivity, l'interface utilisateur se met automatiquement à jour.