# 2021-02-17 | Android | Vues
###### tags: `kotlin` `android` `gobelins`
# Introduction
* Une vue compose les interfaces du téléphone
* Champs de text, images, conteneurs, formulaires, boutons...
* Tout ce qui intervient dans l'interraction avec l'utilisateur final
> [color=#E35DDA]La vue est la super class pour tout les éléments d'une interface. Notion d'héritage.
# Attributs
* La vue attribut des attributs communs (couleurs, dimensions, interractions, positions, visibilité, marges, contraintes, identifiants) -> composants de la classe mère View
> [color=#E35DDA]On peut affecter aux attributs des valeurs statiques, dynamiques ou des références.
> [color=#E35DDA]Il faut utiliser l'auto complétion.
## Dimensions
### Dynamique
* **wrap_content** : s'adapte au contenu de la vue
* **match_parent** : s'adapte à la dimension du parent
* **0dp** : s'adapte aux contraintes
```xml=
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
... />
```
### Statique
* **dp** ou **dip** (Density and Dependant pixel) : valeur en pixel en fonction de la résolution de l'écran. On n'utilise pas directement les pixels dans nos valeurs.
* **sp** pour les textes
```xml=
<TextView
android:layout_width="10dp"
android:layout_height="25dip"
android:textSize="25sp"
... />
```
> [color=#E35DDA]Les valeurs statiques sont déconseillées (sauf pour les textes)
# Création des vues
1. Code (Java, XML)
2. JetPack Compose (Kotlin) -> créer des vues facilement sans le code
> [color=#E35DDA]Le XML est le moyen le plus courant pour créer des vues.
# Vues de groupe
* Conteneurs de vues
* Permet de gérer le positionnement des enfants
* Ils s'appellent xxxLayout
## LinearLayout
Positionnement linéaire. Il suffit de définir l'orientation des élements. L'ordre d'affichage des éléments dépend de l'ordre de création dans le code xml.
```xml=
<LinearLayout
...
android:orientation="vertical/horizontal"
...>
```
> [color=#E35DDA]Il est possible d'encapsuler un linearLayout dans un autre linearLayout.
## Relative layout
Les éléments sont positionnés les uns par rapport aux autres.
```xml=
<RelativeLayout ...>
```
### Contraintes de positionnement
```xml=
<TextView
android:id="@+id/tv1"
.../>
<TextView
...
android:layout_below="@id/tv1"
android:layout_toRightOf="@id/tv1"/>
```
Autres exemples :
```xml=
<TextView
...
android:layout_centerInParent="true"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"/>
```
## Constraint layout
Layout le plus utilisé. Il permet de faire le plus de choses sur l'interface. Il suffit d'ajouter des contraintes à tout les éléments.
> [color=#E35DDA] :warning: Les contraintes sont obligatoires. Le code va quand même être compilé, mais le résultat n'est pas garanti.
```xml=
<androidx.constraintlayout.widget.ConstraintLayout
...>
<TextView
android:id="@+id/tv1"
...
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
...
app:layout_constraintStart_toStartOf="@id/tv1"
app:layout_constraintEnd_toEndOf="parent"/>
```
Les constraintes peuvent faire dépendre un élement d'un autre. Si l'élement de référence change de position, alors l'élement associé bouge également.
> [color=#E35DDA] :warning: Pour les contraintes, il vaut mieux ne pas utiliser les Right et Left, mais préférer Start et End.
# Ressources
On peut charger toute les ressources disponibles avec la classe R.
```java=
R.string.app_name
R.color.black
R.drawable.ic_launcher_background
R.layout.activity_main
R.mipmap.ic_launcher
```
# Charger un layout
On peut récupérer la class R (= Ressource). La classe est chargée automatiquement. Elle permet de faire le lien entre le XML des ressources et le code Java/Kotlin de l'application.
On peut donc charger le layout avec la méthode setContentView().
```java=
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
```
## Récupérer les vues d'un layout
Il faut récupérer l'instance des objets. La méthode suivante retourne l'instance de l'objet, donc une classe Java, et permet de retrouver des méthodes liées à cet objet.
```java=
findViewById(R.id.tv1)
```
> [color=#E35DDA] :warning: Le Java est un langage fortement typé. La méthode utilise un type générique, mais il faut faire attention lors de l'instanciation des objets.
---
Il y a une autre solution plus légère à privilégier : [View Binding](https://developer.android.com/topic/libraries/view-binding)
```java=
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.count.setOnLongClickListener(new View.OnLongClickListener() {
...
});
}
}
```
# Evènements
Pour ajouter des évenements, il faut utiliser la méthode setOnClickListener de l'objet récupéré.
```java=
public class MainActivity extends AppCompatActivity {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = findViewById(R.id.btn1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "Clicked", Toast.LENGTH_SHORT).show();
}
});
btn.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Toast.makeText(MainActivity.this, "Looong Clicked", Toast.LENGTH_SHORT).show();
return false;
}
});
}
}
```