Dans cet article, nous aborderons les sujets suivants :
- les différents layouts que propose Android; un layout est un template qui décrit l'agencement des éléments d'un écran. Android désigne un écran par le terme Activité
- la notion d'intent qui permet de passer d'un écran à un autre, ou en terminologie Android, de passer d'une activité à une autre.
Les différents layout
Notions communes aux différents layout
- android:layout_gravity : pour positionner un élément à gauche, au milieu ou à droite par rapport à son conteneur (permet de centrer du texte au milieu de l'écran)
- android:inputType : les zones de saisie de texte peuvent être typées : simple texte , numéro de téléphone, adresse email, mot de passe, ....
Par exemple android:inputType="textPassword"
- android:hint : permet de saisir dans une zone de texte une explication sur la zone de texte. Par exemple, indiquer qu'il s'agit de saisir son login.
- android:layout_weight : permet de donner du poids à un élément, ce qui signifie que l'élément occupera plus ou moins d'espace
Le linearlayout
Dans ce layout, tous les composants ajoutés sont disposés à la suite. Via l'attribut orientation, on précise si les éléments seront disposés horizontalement ou verticalement.
Dans l'exemple ci dessous, une page de login (fichier activity_main_linearlayout.xml), est montré la mise en application des tags suivants :
- android:layout_gravity="center"
- android:inputType="textPassword" pour le mot de passe
- android:hint : pour indiquer à l'utilisateur ce qu'il a à faire. Ceci évite d'avoir à rajouter un TextView décrivant la zone de saisie
- android:layout_weight avec un bouton Annuler de taille disproportionnée
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="${relativePackage}.${activityClass}" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Page d'authentification" /> <EditText android:id="@+id/editTextLogin" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="votre login" android:ems="10" > <requestFocus /> </EditText> <EditText android:id="@+id/editTextPassword" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="votre mot de passe"
android:inputType="textPassword" android:ems="10" > </EditText> <Button android:id="@+id/buttonConnect" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Se connecter"
android:onClick="doConnect"/>/> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="0dp" android:text="Annuler" android:layout_weight="0.5"
android:onClick="doReset"/>/> </LinearLayout>
Le résultat est le suivant (obtenu via le simulateur de device d'éclipse):
Le relativelayout
Dans ce layout, les éléments sont positionnés relativement aux autres ou au conteneur. Quelques exemples de positionnement :
- android:layout_toRightOf="@+id/textView1" : le composant textViewLogin est placé à gauche de textView1
- composant buttonGoToTableLayout : placé sous le composant textViewLogin via android:layout_below="@+id/textViewLogin", placé au milieu de l'écran via android:layout_centerHorizontal="true"
L'exemple ci dessous (fichier activity_relativelayout.xml) correspond à une page d'accueil avec trois boutons. Ces trois boutons permettront de naviguer vers une autre activité, chaque activité utilisant un layout différent :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Bienvenue " /> <TextView android:id="@+id/textViewLogin" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/textView1" />
<Button android:id="@+id/buttonGoToTableLayout" style="?android:attr/buttonStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textViewLogin" android:layout_centerHorizontal="true" android:text="Vers tablelayout" android:onClick="goToTableLayout"/>
<Button android:id="@+id/buttonGoToGridLayout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/buttonGoToTableLayout" android:text="Vers exemple gridlayout" android:onClick="goToGridLayout"/>
<Button android:id="@+id/buttonGoToFrameLayout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/buttonGoToGridLayout" android:layout_alignParentRight="true" android:text="Vers exemple framelayout" android:onClick="goToFrameLayout"/> </RelativeLayout>
Le résultat est le suivant :
Le tablelayout
Ce layout permet de disposer les éléments dans un tableau. Par contre, il n'est pas possible du fusionner des cellules comme en html avec la balise table.
Ci-dessous un exemple de formulaire avec nom, prénom, email, téléphone (fichier activity_tablelayout.xml):
<?xml version="1.0" encoding="utf-8"?><TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TableRow android:id="@+id/tableRow1" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Nom" /> <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="5"> <requestFocus /> </EditText> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Prénom" /> <EditText android:id="@+id/editText2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="5"/> </TableRow> <TableRow android:id="@+id/tableRow2" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Mail" /> <EditText android:id="@+id/editText3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="5" android:inputType="textEmailAddress" /> <TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Numéro de téléphone" /> <EditText android:id="@+id/editText4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="5" android:inputType="phone" /> </TableRow> </TableLayout>
Le résultat est le suivant (obtenu via le simulateur de device d'éclipse et en se mettant en mode paysage Ctrl F12):
Le gridlayout
Ce layout vient compléter le tablelayout en proposant de fusionner des cellules. Ci-dessous un exemple avec une grille sur 4 colonnes et des fusions de colonne (fichier activity_gridlayout.xml) :
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:columnCount="4" tools:context="${relativePackage}.${activityClass}" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Nom" /> <EditText android:id="@+id/editTextNom" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="5" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Prénom" /> <EditText android:id="@+id/editTextPrenom" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="5" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Email" /> <EditText android:id="@+id/editTextEmail" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="5" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Téléphone" /> <EditText android:id="@+id/editTextTelephone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="5" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Adresse" /> <EditText android:id="@+id/editTextAdresse" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_columnSpan="3" android:ems="5" /> </GridLayout>
Ce qui donne le rendu suivant :
Le framelayout
Il s'agit du layout le plus basique. Il permet de superposer des éléments, par exemple le logo Android avec un texte sur cette image.
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:src="@drawable/android" android:scaleType="fitCenter" android:layout_height="fill_parent" android:layout_width="fill_parent"/> <TextView android:text="Tutorial Android" android:textSize="30sp" android:textStyle="bold" android:textColor="#003399" android:layout_height="fill_parent" android:layout_width="fill_parent" android:gravity="center"/> </FrameLayout>
Le résultat est le suivant :
Les intents
Sur nos boutons déclenchant une action, il faut créer un intent pointant vers l'activité voulue et lancer l'activité.
Ce qui donne dans le cas du passage de l'écran de login à l'écran d'accueil :
- on crée l'intent pointant vers l'activité voulue : Intent intent = new Intent(this, RelativelayoutActivity.class);
- on fournit à l'intent le login et le mot de passa afin que l'activité recevant l'intent ait ces informations : intent.putExtra(EXTRA_LOGIN, strUserName);
- on démarre l'activité : startActivity(intent);
Ci-dessous la méthode déclenchée par l'action de login, qui après vérification de la non nullité du login et du mot de passe, déclenche une autre activité :
public void doConnect(View view) { EditText txtUserName = (EditText) findViewById(R.id.editTextLogin); String strUserName = txtUserName.getText().toString(); EditText txtUserPasswd = (EditText) findViewById(R.id.editTextPassword); String strUserPasswd = txtUserPasswd.getText().toString(); if (TextUtils.isEmpty(strUserName)) { txtUserName.setError("Veuillez saisir votre login"); return; } if (TextUtils.isEmpty(strUserPasswd)) { txtUserName.setError("Veuillez saisir votre mot de passe"); return; } Toast.makeText(this, "doConnect", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(this, RelativelayoutActivity.class); intent.putExtra(EXTRA_LOGIN, strUserName); intent.putExtra(EXTRA_PASSWORD, strUserPasswd); startActivity(intent); }
Changement de l'orientation de l'écran
Suivant que l'écran de votre équipement est orienté en mode portrait ou paysage, il peut être bon de positionner un layout pour chacun de ces modes. Pour ce faire, il faudra créer une seconde vue à positionner dans le répertoire ...
Sous Eclipse, pour passer du mode portrait à paysage, il faut se servir des touches Ctrl F12.
AVD Manager
Pour tester votre code sous Eclipse, il faut décrire le device sur lequel exécuté votre application via Android Virtual Device.
Si ce menu n’apparaît pas, configurer Eclipse : Windows > Customize perspective > Command group availibility : android SDK and AVD Manager