---
tags: LPDIM
title: Android
---
# TP2 --- Android Basics :lollipop:
## Les concepts de base
### Getting started
:::info
Question 1 :point_right: Qu’est ce que AVD ? Que faut-il faire pour utiliser votre smartphone en tant qu’appareil de test pour votre app ?
:::
:::success
Un AVD signifie ***Android Virtual Device***, c'est un appareil virtuel qui définit les caractéristiques d'un téléphone, tablette, Wear OS, Android TV ou Automotive OS Android.
:::
Pour utiliser notre smartphone en tant qu’appareil de test pour notre application, il faut le connecté en USB sur notre ordinateur et activer les ***options développeurs*** sur notre smartphone.
---
:::info
Question 2 :point_right: A quoi servent les dossiers suivants :
> layout, values, drawable, strings, colors, styles, java, generatedJava, le fichier AndroidManifest.xml.
:::
* **Layout :** le layaout contient les vues des classes (`view.xml`).
* **Values :** les values contiennent toutes les variables utilisables des vues.
* **Drawable :** le drawable contient les images.
* **Strings :** les strings permettent de stocker des chaînes de caractères que l'on va réutiliser dans l'application.
* **Colors :** les colors contiennent et définissent les couleurs que l'on veut utiliser dans l'application.
* **Styles :** les styles contiennet les classes de design.
* **Java :** le java contient les codes principales de l'application.
* **GeneratedJava :** le GeneratedJava contient les classes dont lesquelles le projet sera construit.
* **Le fichier AndroidManifest.xml :** ce fichier permet de donner des détails sur la configuration de l'application Android et on inclut nos activitées (`Activity`) :
<?xml version="1.0" encoding="utf-8"?>
```kotlin=
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testannecygo">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.TestAnnecyGo">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
```
---
### Le binding
:::info
Question 3 :point_right: Pour expérimenter tout cela du bout de vos doigts, réalisez le second tutoriel (1.2) Codelabs jusqu’à l’étape 5 en utilisant le data binding, puis faites valider par l’enseignant.
:::

***MainAcivity.kt***
```kotlin=
package com.example.diceroller
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.roll_button)
rollButton.setOnClickListener { rollDice() }
}
private fun rollDice() {
/*Toast.makeText(this, "button clicked",
Toast.LENGTH_SHORT).show()*/
val resultText: TextView = findViewById(R.id.result_text)
val randomInt = (1..6).random()
resultText.text = randomInt.toString()
}
}
```
---
:::info
Question 4 :point_right: Comment faites vous pour que le click d’un bouton sur l’interface lance une fonction de votre code ? Quel concept de la programmation objet est utilisé dans ce cas ?
:::
Pour que le click d’un bouton sur l’interface lance une fonction de notre code, on utilise le **data binding**. Le data bindingpermet d'utiliser un élément visuel (`text`, `button`, ...), grâce à son `ID`. Il permet aussi de faire la liaison entre le modèle et la vue.
---
### L’interface
:::info
Question 5 :point_right: Faites un peu de recherche sur les différents composants disponibles et leurs propriétés. Et réalisez l’interface suivante uniquement en XML en utilisant les linear layouts. (Vous êtes libre sur les couleurs). “Same day messenger service”
est un toast.
:::
---
:::info
Question 6 :point_right: Réalisez cette interface en utilisant des constraints layouts
:::

```kotlin=
<?xml version="1.0" encoding="utf-8"?>
<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=".MainActivity">
<TextView
android:id="@+id/Bottom"
android:layout_width="413dp"
android:layout_height="139dp"
android:background="#008000"
android:gravity="center"
android:text="Bottom of screen"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" />
<TextView
android:id="@+id/TopRight"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#008000"
android:gravity="center"
android:text="Top Right"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/TopLeft"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#008000"
android:gravity="center"
android:text="Top Left"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/Center"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#008000"
android:gravity="center"
android:text="Center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/TopCenter"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#ADFF2F"
android:gravity="center"
android:text="Top Middle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/Left"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginTop="200dp"
android:background="#ADFF2F"
android:gravity="center"
android:text="Left"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/Right"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginTop="200dp"
android:background="#ADFF2F"
android:gravity="center"
android:text="Right"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
```
---
### Les fragments
:::info
Question 7 :point_right: Que signifie le fait d’inflate l’interface lors de l’instanciation du fragment ?
:::
Le fait d’inflate l’interface lors de l’instanciation du fragment signifit que l'on va récupérer dans le layout pour créer un objet à partir du fragment.
---
:::info
Question 8 :point_right: Quel est l’équivalent Jetpack de la bibliothèque com.android.support:design que vous avez dû utiliser ? Comment avez vous trouvé cette information ?
:::
L’équivalent Jetpack de la bibliothèque ***com.android.support:design*** que nous avons dû utiliser est ***com.google.android.material*** de JetPack.
Pour trouver cette information, j'ai chercher sur internet.
---
:::info
Question 9 :point_right: Qu’est ce qui vous permet de facilement créer un chemin de navigation dans votre application ? Détaillez le processus.
:::
Ce qui nous permet de facilement créer un chemin de navigation dans votre application c'est le composant Navigation (Nav Graph).
---
### Le Lifecycle (ou cycle de la vie 🦁)
:::info
Question 11 :point_right: Quelle est la syntaxe native pour log une information dans la console ?
:::
La syntaxe native pour log une information dans la console c'est le `TAG` :
```kotlin=
private val TAG = "MainActivity"
Log.i(TAG, character?.name.toString())
```
---
:::info
Question 12 :point_right: Est-ce qu’un fragment possède un cycle de vie décorrelé d’une activity ou non ? Justifiez
:::
Un fragment représente une partie qui est réutilisable de l'interface utilisateur de l'application. Il définit et aussi il gère sa propre mise en page, a son propre cycle de vie et peut gérer ses propres événements d'entrée. On peut dire que les fragments ne peuvents pas vivre tout seul, ils doivents ainsi être hébergés par une Activity ou un autre fragment.
---
:::info
Question 13 :point_right: Décrivez les étapes par lequelles une application passe lorsqu’elle est coupée par un appel téléphonique entrant.
:::
Les étapes par lequelles une application passe lorsqu’elle est coupée par un appel téléphonique entrant c'est le `OnPause()` et le `OnResume()`.
:::success
Le OnPause() : c'est lorsque l'appel est en cours.
Le OnResume() : c'est lorsque l'appel est finit.
:::
---
Léa PORTIER - 25/01/2021.