Ces travaux pratiques sont basés sur le cours de base pour les développeurs Android fourni par Google, qui prépare les participants au test de certification Associate Android Developer. Pour tirer le meilleur parti de ce TP, il est recommandé de travailler successivement dans les codelabs.
Une activité (Activity
) représente un seul écran dans votre application avec lequel votre utilisateur peut effectuer une tâche unique, telle que prendre une photo, envoyer un courrier électronique ou afficher une carte. Une activité est généralement présentée à l'utilisateur sous la forme d'une fenêtre plein écran.
Une application est généralement composée de plusieurs écrans liés de manière approximative. Chaque écran est une activité. En règle générale, une activité dans une application est spécifiée comme activité principale (MainActivity.java
), qui est présentée à l'utilisateur lors du lancement de l'application. L'activité principale peut alors démarrer d'autres activités pour effectuer différentes actions.
Chaque fois qu'une nouvelle activité démarre, l'activité précédente est arrêtée, mais le système conserve l'activité dans une pile ("back stack"). Quand une nouvelle activité commence, cette nouvelle activité est poussée dans la pile arrière et prend le focus de l'utilisateur. La pile arrière suit la logique de pile de base "dernier entré, premier sorti". Lorsque l'utilisateur a terminé l'activité en cours et appuie sur le bouton Précédent, cette activité est extraite de la pile, détruite et l'activité précédente reprend.
Une activité est démarrée ou activée avec une intention. Une intention (Intent
) est un message asynchrone que vous pouvez utiliser dans votre activité pour demander une action à une autre activité ou à un autre composant d'application. Vous utilisez l'intention pour démarrer une activité à partir d'une autre activité et de transmettre des données entre les activités.
Une intention peut être explicite ou implicite:
Dans cette pratique, vous créez des intentions explicites. Vous découvrirez comment utiliser les intentions implicites dans une pratique plus tard.
Vous devriez être familier avec:
ConstraintLayout
onClick
à un bouton (Button
).Acitivity
) dans Android Studio.Activity
) avec une intention (Intent
) explicite.Activity
) avec une intention (Intent
) explicite.Activity
) principale et une deuxième activité (Activity
).Activity
) principale à la seconde à l'aide d'une intention, puis affichez ces données dans la deuxième activité (Activity
).Activity
) principale, en utilisant également une intention (Intent
).Dans cette pratique, vous créez et construisez une application appelée Deux activités (Two Activities) qui, sans surprise, contient deux implémentations d' Activity
. Vous construisez l'application en trois étapes.
Dans la première étape, vous créez une application dont l'activité principale contient un bouton, "Send". Lorsque l'utilisateur clique sur ce bouton, votre activité principale utilise l'intention pour démarrer la deuxième activité.
Dans la deuxième étape, vous ajoutez une vue EditText
à l'activité principale. L'utilisateur entre un message et clique sur "Send". L'activité principale utilise l'intention pour démarrer la deuxième activité et d'envoyer le message de l'utilisateur à la deuxième activité. La deuxième activité affiche le message reçu.
Dans la dernière étape de la création de l'application "Two Activities", vous ajoutez EditText
et un bouton "Reply" à la deuxième activité. L'utilisateur peut désormais saisir un message de réponse, puis appuyez sur "Reply", et la réponse est affichée sur l'activité principale. À ce stade, vous utilisez une intention (Intent
) pour renvoyer la réponse de la deuxième activité à l'activité principale.
Dans cette tâche, vous configurez le projet initial en créant une activité (Activity
) principale, en définissant la mise en page et en définissant une méthode pour l'événement onClick
du bouton.
Nommez votre application "Two Activities" et choisissez les mêmes paramètres de Phone and Tablet que ceux que vous avez utilisés dans les travaux pratiques précédents. Le dossier du projet est automatiquement nommé TwoActivities
et le nom de l'application qui apparaît dans la barre des applications sera "Two Activities".
Activity
). Cliquez sur "Next".themes.xml (night)
TextView
(celui qui dit "Hello World") dans le volet Component Tree.Button
).wrap_content
et entrez Send pour le champ Text. La mise en page devrait maintenant ressembler à ceci:Button
):android:onClick="launchSecondActivity"
La valeur de l'attribut est soulignée en rouge car la méthode launchSecondActivity()
n'a pas encore été créée. Ignorer cette erreur pour l'instant; vous le corrigez dans la tâche suivante.
button_main
pour la ressource.Le code XML du bouton (Button
) devrait ressembler à ceci:
<Button
android:id="@+id/button_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:text="@string/button_main"
android:onClick="launchSecondActivity"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
Dans cette tâche, vous implémentez la méthode launchSecondActivity()
à laquelle vous avez fait référence dans la présentation (layout) pour l'attribut android:onClick
.
"
launchSecondActivity
"
dans le code XML activity_main.xml
.Le fichier MainActivity
s'ouvre et Android Studio génère une méthode squelette pour le gestionnaire launchSecondActivity()
.
launchSecondActivity()
, ajoutez une instruction de journal (Log
) indiquant "Button Clicked!".Log.d(LOG_TAG, "Button clicked!");
LOG_TAG
s'affiche en rouge. Vous ajoutez la définition de cette variable dans une étape ultérieure.
MainActivity
, ajoutez une constante pour la variable LOG_TAG
:private static final String LOG_TAG =
MainActivity.class.getSimpleName();
Cette constante utilise le nom de la classe elle-même comme étiqutte (tag).
Le code de MainActivity
devrait ressembler à ceci:
public class MainActivity extends AppCompatActivity {
private static final String LOG_TAG =
MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void launchSecondActivity(View view) {
Log.d(LOG_TAG, "Button clicked!");
}
}
Chaque nouvelle activité que vous ajoutez à votre projet a sa propre structure et ses propres fichiers Java, distincts de ceux de l'activité principale. Ils ont également leurs propres éléments
dans le fichier AndroidManifest.xml
. Comme pour l'activité principale, les nouvelles implémentations d'activité que vous créez dans Android Studio s'étendent également à partir de la classe AppCompatActivity
.
Chaque activité de votre application est uniquement liée vaguement à d'autres activités. Cependant, vous pouvez définir une activité en tant que parent d'une autre activité dans le fichier AndroidManifest.xml
. Cette relation parent-enfant permet à Android d'ajouter des astuces de navigation telles que des flèches orientées vers la gauche dans la barre de titre pour chaque activité.
Une activité communique avec d'autres activités (dans la même application et à travers différentes applications) avec une intention (Intent
). Une intention peut être explicite ou implicite:
Dans cette tâche, vous ajoutez une deuxième activité à notre application, avec sa propre mise en page (layout). Vous modifiez le fichier AndroidManifest.xml
pour définir l'activité principale en tant que parent de la deuxième activité. Ensuite, vous modifiez la méthode launchSecondActivity()
dans MainActivity
pour inclure une intention (Intent
) qui lance la deuxième activité lorsque vous cliquez sur le bouton.
activity_second
. Ne cochez pas l'option Launcher Activity.activity_second.xml
) et un nouveau fichier Java (SecondActivity.java
) à votre projet pour la nouvelle activité (Activity
). Il met également à jour le fichier AndroidManifest.xml
pour inclure la nouvelle activité.activity
créé par Android Studio pour la deuxième activité.<activity android:name=".SecondActivity"></activity>
activity
par ce qui suit:<activity android:name=".SecondActivity"
android:label = "Second Activity"
android:parentActivityName=".MainActivity">
</activity>
L'attribut label
ajoute le titre de l'activité à la barre des applications.
Avec l'attribut parentActivityName
, vous indiquez que l'activité principale est le parent de la deuxième activité. Cette relation est utilisée pour la navigation vers le haut dans votre application: la barre d'application de la deuxième activité comporte une flèche orientée vers la gauche pour permettre à l'utilisateur de naviguer "vers le haut" vers l'activité principale.
activity2_name
comme nom de ressource.Attribut | Valeur |
id | text_header |
Top margin | 16 |
Left margin | 8 |
layout_width | wrap_content |
layout_height | wrap_content |
text | Message Received |
textAppearance | @style/TextAppearance.AppCompat.Medium |
textStyle | bold |
La valeur de textAppearance est un attribut spécial du thème Android qui définit les styles de police de base.
La mise en page (layout) devrait maintenant ressembler à ceci:
text_header
.android:layout_marginLeft="8dp"
à TextView
pour compléter l'attribut layout_marginStart
pour les anciennes versions d'Android.Le code XML pour activity_second.xml
devrait être le suivant:
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context="com.example.twoactivities.SecondActivity">
<TextView
android:id="@+id/text_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="16dp"
android:text="@string/text_header"
android:textAppearance=
"@style/TextAppearance.AppCompat.Medium"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Dans cette tâche, vous ajoutez une intention (Intent
) explicite à l'activité (Activity
) principale. Cette intention (Intent
) est utilisée pour activer la deuxième activité lorsque l'utilisateur clique sur le bouton Send.
Intent
) dans la méthode launchSecondActivity()
.Le constructeur d'intention (Intent
) prend deux arguments pour une intention (Intent
) explicite: un contexte (Context
) d'application et le composant spécifique qui recevra cette intention (Intent
). Ici, vous devez utiliser this
en tant que contexte (Context
) et SecondActivity.class
en tant que classe spécifique:
Intent intent = new Intent(this, SecondActivity.class);
startActivity()
avec le nouvel Intent
comme argument.startActivity(intent);
Lorsque vous cliquez sur le bouton Send, MainActivity
envoie l'intention (Intent
) et le système Android lance SecondActivity
, qui apparaît à l'écran. Pour revenir à MainActivity
, cliquez sur le bouton Haut (Up la flèche gauche dans la barre d'application) ou sur le bouton Précédent (Back) en bas de l'écran.
Dans la dernière tâche, vous avez ajouté une intention explicite à MainActivity
qui a lancé SecondActivity
. Vous pouvez également utiliser une intention pour envoyer des données d'une activité à une autre lors de son lancement.
Votre objet d'intention peut transmettre des données à l'activité cible de deux manières: dans le champ de données ou dans les extras d'intention (intent extras). Les données d'intention sont un URI indiquant les données spécifiques sur lesquelles il faut agir. Si les informations que vous souhaitez transmettre à une activité par le biais d'une intention ne sont pas un URI ou si vous souhaitez envoyer plus d'une information, vous pouvez insérer ces informations supplémentaires dans les extras.
Les extras d'intention (Intent
) sont des paires clé / valeur dans un Bundle
. Un Bundle
est un ensemble de données stockées sous forme de paires clé / valeur. Pour transmettre des informations d'une activité à une autre, vous devez insérer des clés et des valeurs dans le Bundle supplémentaire d'intention (Intent extras) à partir de l'activité d'envoi, puis les récupérer dans l'activité de réception.
Dans cette tâche, vous modifiez l'intention (Intent
) explicite dans MainActivity
afin d'inclure des données supplémentaires (dans ce cas, une chaîne de caractère entrée par l'utilisateur) dans un Bundle
supplémentaire de l'intention (Intent
). Vous modifiez ensuite SecondActivity
pour extraire ces données du Bundle
supplémentaire de l'intention et les afficher à l'écran.
Attribut | Valeur |
id | editText_main |
Right margin | 8 |
Left margin | 8 |
Bottom margin | 16 |
layout_width | match_constraint |
layout_height | wrap_content |
inputType | textLongMessage |
hint | Enter Your Message Here |
text | (Supprimer tout texte dans ce champ 👀) |
La nouvelle présentation dans activity_main.xml
ressemble à ceci:
editText_main
.Le code XML de la mise en page (layout) doit ressembler à ce qui suit:
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context="com.example.twoactivities.MainActivity">
<Button
android:id="@+id/button_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginRight="16dp"
android:text="@string/button_main"
android:onClick="launchSecondActivity"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<EditText
android:id="@+id/editText_main"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:ems="10"
android:hint="@string/editText_main"
android:inputType="textLongMessage"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/button_main"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Les extras d'intention (Intent
) sont des paires clé / valeur dans un Bundle
. Un Bundle
est un ensemble de données stockées sous forme de paires clé / valeur. Pour transmettre des informations d'une activité à une autre, vous devez insérer des clés et des valeurs dans le Bundle
supplémentaire d'Intention (Intent
) à partir de l'activité d'envoi, puis les récupérer à nouveau dans l'activité de réception.
public
) en haut de la classe pour définir la clé de l'extra de l'intention:public static final String EXTRA_MESSAGE = "key.for.extra.MESSAGE";
EditText
:private EditText mMessageEditText;
onCreate()
, utilisez findViewById()
pour obtenir une référence à EditText
et l'affecter à cette variable privée:mMessageEditText = findViewById(R.id.editText_main);
launchSecondActivity()
, juste sous le nouvel Intent
, obtenez le texte de EditText
sous la forme d'une chaîne de caractère:String message = mMessageEditText.getText().toString();
Intent
) en tant qu'extra avec la constante EXTRA_MESSAGE
en tant que clé et la chaîne en tant que valeur:intent.putExtra(EXTRA_MESSAGE, message);
La méthode onCreate()
dans MainActivity
devrait maintenant ressembler à ceci:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMessageEditText = findViewById(R.id.editText_main);
}
La méthode launchSecondActivity()
dans MainActivity
devrait maintenant ressembler à ceci:
public void launchSecondActivity(View view) {
Log.d(LOG_TAG, "Button clicked!");
Intent intent = new Intent(this, SecondActivity.class);
String message = mMessageEditText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}
activity_second.xml
.TextView
vers la présentation (layout) sous text_header
, puis ajoutez des contraintes à gauche et à la fin de text_header
.TextView
dans le volet Attributes comme suit:Attribut | Valeur |
id | text_message |
Top margin | 8 |
Left margin | 8 |
layout_width | wrap_content |
layout_height | wrap_content |
text | (Supprimer tout texte dans ce champ 👀) |
textAppearance | @style/TextAppearance.AppCompat.Medium |
La nouvelle présentation (layout) a la même apparence que dans la tâche précédente, car la nouvelle TextView
ne contient pas (encore) de texte et n'apparaît donc pas à l'écran.
Le code XML de la présentation (layout) activity_second.xml
devrait ressembler à ceci:
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context="com.example.twoactivities.SecondActivity">
<TextView
android:id="@+id/text_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:text="@string/text_header"
android:textAppearance=
"@style/TextAppearance.AppCompat.Medium"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/text_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_header" />
</androidx.constraintlayout.widget.ConstraintLayout>
onCreate()
.Intent
) qui a activé cette activité (Activity
):Intent intent = getIntent();
Intent
) en utilisant la variable statique MainActivity.EXTRA_MESSAGE
en tant que clé:String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
findViewByID()
pour obtenir une référence à TextView
pour le message à partir de la présentation (layout):TextView textView = findViewById(R.id.text_message);
TextView
sur la chaîne extraite de l'intention (Intent
):textView.setText(message);
MainActivity
et cliquez sur Send, SecondActivity
démarre et affiche le message.La méthode onCreate()
de SecondActivity
devrait ressembler à ceci:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
TextView textView = findViewById(R.id.text_message);
textView.setText(message);
}
Maintenant que vous avez une application qui lance une nouvelle activité et lui envoie des données, la dernière étape consiste à renvoyer les données de la deuxième activité à l'activité principale. Pour ce faire, vous utilisez également une intention et des extras d'intention.
EditText
que vous ajouterez à SecondActivity
:<string name="button_second">Reply</string>
<string name="editText_second">Enter Your Reply Here</string>
EditText
et Button
du fichier de mise en forme (layout) activity_main.xml
et collez-les dans la mise en forme (layout) activity_second.xml
.activity_second.xml
, modifiez les valeurs d'attribut du bouton comme suit:Ancien attribut | Nouvelle valeur d'attribut |
android:id="@+id/button_main" | android:id="@+id/button_second" |
android:onClick= "launchSecondActivity" | android:onClick="returnReply" |
android:text= "@string/button_main" | android:text= "@string/button_second" |
activity_second.xml
, modifiez les valeurs d'attribut pour EditText
comme suit:Ancien attribut | Nouvelle valeur d'attribut |
android:id="@+id/editText_main" | android:id="@+id/editText_second" |
app:layout_constraintEnd_toStartOf ="@+id/button" | app:layout_constraintEnd_toStartOf ="@+id/button_second" |
android:hint= "@string/editText_main" | android:hint= "@string/editText_second" |
Android Studio génère une méthode squelette pour le gestionnaire returnReply()
. Vous implémentez cette méthode dans la tâche suivante.
La nouvelle mise en page (layout) pour activity_second.xml
ressemble à ceci:
Le code XML du fichier de mise en page (layout) activity_second.xml
est le suivant:
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context="com.example.twoactivities.SecondActivity">
<TextView
android:id="@+id/text_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="16dp"
android:text="@string/text_header"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/text_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_header" />
<Button
android:id="@+id/button_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginRight="16dp"
android:text="@string/button_second"
android:onClick="returnReply"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<EditText
android:id="@+id/editText_second"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:ems="10"
android:hint="@string/editText_second"
android:inputType="textLongMessage"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/button_second"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Les données de réponse de la deuxième activité à l'activité principale sont envoyées dans l'extra d'une intention (Intent
). Vous construisez cette intention (Intent
) de retour et y insérez les données de la même manière que vous le feriez pour l'intention d'envoi.
Intent
extra:public static final String EXTRA_REPLY = "key.for.extra.REPLY";
EditText
.private EditText mReply;
onCreate()
, avant le code d'intention (Intent), utilisez findViewByID()
pour obtenir une référence à EditText
et l'affecter à cette variable privée:mReply = findViewById(R.id.editText_second);
returnReply()
, obtenez le texte de EditText
en tant que chaîne de caractère:String reply = mReply.getText().toString();
returnReply()
, créez une nouvelle intention (Intent
) pour la réponse. Ne réutilisez pas l'intention que vous avez reçue de la demande d'origine.Intent replyIntent = new Intent();
replyIntent.putExtra(EXTRA_REPLY, reply);
RESULT_OK
pour indiquer que la réponse a abouti. La classe d'activité (Activity
) définit les codes de résultat, y compris RESULT_OK
et RESULT_CANCELLED
.setResult(RESULT_OK,replyIntent);
finish()
pour fermer l'activité et revenir à MainActivity
.finish();
Le code de SecondActivity
devrait maintenant être le suivant:
public class SecondActivity extends AppCompatActivity {
public static final String EXTRA_REPLY = "key.for.extra.REPLY";
private EditText mReply;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mReply = findViewById(R.id.editText_second);
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
TextView textView = findViewById(R.id.text_message);
textView.setText(message);
}
public void returnReply(View view) {
String reply = mReply.getText().toString();
Intent replyIntent = new Intent();
replyIntent.putExtra(EXTRA_REPLY, reply);
setResult(RESULT_OK, replyIntent);
finish();
}
}
MainActivity
a besoin d'un moyen d'afficher la réponse envoyée par SecondActivity
. Dans cette tâche, vous allez ajouter des éléments TextView
à la présentation (layout) activity_main.xml
pour afficher la réponse dans MainActivity
.
Pour faciliter cette tâche, vous copiez les éléments TextView
que vous avez utilisés dans SecondActivity
.
strings.xml
et ajoutez une ressource de chaîne pour l'en-tête de réponse:<string name="text_header_reply">Reply Received</string>
activity_main.xml
et activity_second.xml
.TextView
du fichier de mise en page (layout) activity_second.xml
et collez-les dans la mise en page (layout) activity_main.xml
au-dessus du bouton.activity_main.xml
, modifiez les valeurs d'attribut pour le premier TextView
comme suit:Ancien attribut | Nouvelle valeur d'attribut |
android:id="@+id/text_header" | android:id="@+id/text_header_reply" |
android:text= "@string/text_header" | android:text= "@string/text_header_reply" |
activity_main.xml
, modifiez les valeurs d'attribut pour le deuxième TextView
a comme suit:Ancien attribut | Nouvelle valeur d'attribut |
android:id="@+id/text_message" | android:id= "@+id/text_message_reply" |
app:layout_constraintTop_toBottomOf ="@+id/text_header" | app:layout_constraintTop_toBottomOf ="@+id/text_header_reply" |
android:visibility
à chaque TextView
pour les rendre initialement invisibles. (Après les avoir visibles à l'écran, mais sans aucun contenu, peut être source de confusion pour l'utilisateur.)android:visibility="invisible"
Vous rendrez ces éléments TextView
visibles une fois que les données de réponse auront été renvoyées de la deuxième activité.
La présentation (layout) activity_main.xml
est identique à celle de la tâche précédente, bien que vous ayez ajouté deux nouveaux éléments TextView
à la présentation (layout). Parce que vous définissez ces éléments sur invisible, ils n'apparaissent pas à l'écran.
Voici le code XML du fichier activity_main.xml
:
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context="com.example.twoactivities.MainActivity">
<TextView
android:id="@+id/text_header_reply"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="16dp"
android:text="@string/text_header_reply"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textStyle="bold"
android:visibility="invisible"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/text_message_reply"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:visibility="invisible"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_header_reply" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginRight="16dp"
android:text="@string/button_main"
android:onClick="launchSecondActivity"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<EditText
android:id="@+id/editText_main"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:ems="10"
android:hint="@string/editText_main"
android:inputType="textLongMessage"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/button2"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Lorsque vous utilisez une intention (Intent
) explicite pour démarrer une autre activité, vous ne pouvez pas vous attendre à récupérer des données. Vous activez simplement cette activité. Dans ce cas, vous utilisez startActivity()
pour démarrer la nouvelle activité, comme vous l'avez fait précédemment dans cette pratique. Si vous souhaitez récupérer les données de l'activité activée, vous devez le démarrer avec startActivityForResult()
.
Dans cette tâche, vous modifiez l'application pour que SecondActivity
attend un résultat, pour extraire ces données renvoyées de l'intention (Intent) et pour afficher ces données dans les éléments TextView
que vous avez créés dans la dernière tâche.
public static final int TEXT_REQUEST = 1;
TextView
de réponse:private TextView mReplyHeadTextView;
private TextView mReplyTextView;
onCreate()
, utilisez findViewByID()
pour obtenir des références de la disposition (Layout) vers l'en-tête de réponse et les éléments TextView
de réponse. Affectez ces instances de vue aux variables privées:mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
La méthode complète onCreate()
devrait maintenant ressembler à ceci:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
}
launchSecondActivity()
, remplacez l'appel startActivity()
par startActivityForResult()
et incluez la clé TEXT_REQUEST
en tant qu'argument:startActivityForResult(intent, TEXT_REQUEST);
onActivityResult()
par cette signature:@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
}
Les trois arguments de onActivityResult()
contiennent toutes les informations nécessaires pour gérer les données de retour: le requestCode
que vous avez défini lorsque vous avez lancé Activity
avec startActivityForResult()
, le resultCode
défini dans l'activité lancée (généralement l'un des RESULT_OK
ou RESULT_CANCELED
), et les données d'intention (Intent
) contenant les données renvoyées par l'activité de lancement.
onActivityResult()
, appelez super.onActivityResult()
:super.onActivityResult(requestCode, resultCode, data);
TEXT_REQUEST
afin de vous assurer de traiter le bon résultat de l'intention (Intent), s'il en existe plusieurs. Testez également RESULT_OK
pour vous assurer que la requête a abouti:if (requestCode == TEXT_REQUEST) {
if (resultCode == RESULT_OK) {
}
}
La classe d'activité (Activity
) définit les codes de résultat. Le code peut être RESULT_OK
(la requête a abouti), RESULT_CANCELED
(l'utilisateur a annulé l'opération) ou RESULT_FIRST_USER
(pour définir vos propres codes de résultat).
Intent
) de la réponse (data
). Ici, la clé pour l'extra est la constante EXTRA_REPLY
de SecondActivity
:String reply = data.getStringExtra(SecondActivity.EXTRA_REPLY);
mReplyHeadTextView.setVisibility(View.VISIBLE);
TextView
de "reply
" sur la réponse et définissez sa visibilité sur true:mReplyTextView.setText(reply);
mReplyTextView.setVisibility(View.VISIBLE);
La méthode complète onActivityResult()
devrait maintenant ressembler à ceci:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == TEXT_REQUEST) {
if (resultCode == RESULT_OK) {
String reply =
data.getStringExtra(SecondActivity.EXTRA_REPLY);
mReplyHeadTextView.setVisibility(View.VISIBLE);
mReplyTextView.setText(reply);
mReplyTextView.setVisibility(View.VISIBLE);
}
}
}
Désormais, lorsque vous envoyez un message à la deuxième activité et obtenez une réponse, l'activité principale se met à jour pour afficher la réponse.
Vue d'ensemble:
Activity
) est un composant d'application qui fournit un seul écran centré sur une tâche à un seul utilisateur.android:visibility
.Pour implémenter une activité:
Activity
), implémentez une interface utilisateur (UI) de base pour l'activité dans un fichier de présentation (layout) XML associé et déclarez la nouvelle activité dans AndroidManifest.xml
.Intent
:
Intent
) vous permet de demander une action à un autre composant de votre application, par exemple, pour démarrer une activité à partir d'une autre. Une intention (Intent
) peut être explicite ou implicite.extras
) d'intention.Les extras d'intention (Intent
) sont des paires clé / valeur dans un Bundle
qui sont envoyées avec l'intention.
Documentation d'Android Studio:
Documentation développeur Android:
Ouvrez l'application HelloToast que vous avez créée dans une pratique antérieure.
Toast
en Say Hello.Quelles modifications sont apportées lorsque vous ajoutez une deuxième activité à votre application en choisissant File > New > Activity et un modèle d'activité? Choisissez-en un:
AndroidManifest.xml
est modifié pour déclarer une deuxième activité.AndroidManifest.xml
est modifié pour déclarer une deuxième activité.Que se passe-t-il si vous supprimez les éléments android:parentActivityName
et
de la deuxième déclaration d'activité du fichier AndroidManifest.xml
? Choisissez-en un:
Intent
) explicite.Quelle méthode de constructeur utilisez-vous pour créer une nouvelle intention (Intent
) explicite? Choisissez-en un:
new Intent()
new Intent(Context context, Class> class)
new Intent(String action, Uri uri)
new Intent(String action)
Dans l'application HelloToast (du Travail à faire), comment ajoutez-vous la valeur actuelle du comptage à l'intention (Intent)? Choisissez-en un:
Intent
)TEXT_REQUEST
de l'intention (Intent
)Intent
)Intent
)Dans l'application HelloToast (du Travail à faire), comment afficher le nombre actuel dans la deuxième activité "Hello"? Choisissez-en un:
Intent
) avec laquelle l'activité a été lancée.TextView
pour le comptage.Vérifiez que l'application dispose des éléments suivants:
MainActivity
.TextView
, l'un avec la chaîne "Hello!" et le second avec le compte.MainActivity
).onCreate()
pour la deuxième activité et met à jour le décompte TextView
avec le décompte de MainActivity
.