2. Ateliers
Créer une nouvelle Activity
Ecouter les événements
Fragments
Personnaliser une ListView
ContactProvider
Internationaliser vos applications Android
4. Le problème
Une Activity permet à l’utilisateur de faire …
… une activité
Une Activity est associé à une UI (un écran)
Quand on change d ’écran, on change d’Activity
Une application est composée de différentes activités
Comment créer ces activités ?
6. Créer une nouvelle Activity
Peut se faire à la suite d’une action dans la UI
Appuie sur un bouton par exemple
Dans l’activity parent :
Créer un ‘Intent’, spécifiant la classe de l’activité à créer
Peut passer des paramètres supplémentaires
startActivity(intent)
Intent intent = new Intent(this, DisplayMessageActivity.class);
intent.putExtra(EXTRA_MESSAGE, ‘A message’);
startActivity(intent);
Un ‘intent’ est un
message que l’on
passe au système.
Indique la classe
de l’Activity
Ajoute un objet
que l’on pourra
récupérer
Demande la
création de
l’Activity
7. Créer une nouvelle Activity
Ne pas oublier d’ajouter la nouvelle Activity au
Manifest
<activity
android:name="com.example.myfirstapp.DisplayMessageActivity"
android:label="@string/title_activity_display_message"
android:parentActivityName="com.example.myfirstapp.MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.myfirstapp.MainActivity" />
</activity>
8. Récupérer des paramètres
La nouvelle Activity peut récupérer les données
passées par le parent
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the message from the intent
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
}
9. Tutoriel
- Starting Another Activity
http://developer.android.com/training/basics/first
app/starting-activity.html
Intent intent = new Intent(this, DisplayMessageActivity.class);
intent.putExtra(EXTRA_MESSAGE, ‘A message’);
startActivity(intent);
Un ‘intent’ est un
message que l’on
passe au système.
Indique la classe
de l’Activity
Ajoute un objet
que l’on pourra
récupérer
Demande la
création de
l’Activity
11. Cycle de vie
d’une activité
Possibilité de
surcharger les
méthodes onCreate(),
onStart(), …
14. Le problème
Les éléments graphiques envoient des « évenements »
onClick, onTouch, …
Comment les exploiter ?
15. La solution
Ecouter les événements venant des éléments
graphiques (ou autres)
Utiliser le pattern Observateur/Observé
Votre code observe les éléments graphique
buttonPlus = (Button) findViewById(R.id.buttonPlus);
buttonPlus.setOnClickListener(eventListener);
16. Deux approches
Déclarer les listeners dans le code
Déclarer dans le .xml la méthode traitant l’événement
View.OnClickListener listener =
new View.OnClickListener() {
public void onClick(View v) {
plusClick();
}
};
public void onCreate(…) {
buttonPlus = (Button) findViewById(R.id.buttonPlus);
buttonPlus.setOnClickListener(listener);
}
public void plusClick() {
// Code a effectuer apres le click
}
17. Deux approches
Déclarer dans le layout.xml la méthode traitant
l’événement
public void onCreate(…) {
}
public void plusClick() {
// Code a effectuer apres le click
}
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_plus"
android:onClick=« plusClick" />
18. Events
onClick()
From View.OnClickListener. This is called when the user either touches the item (when in touch mode),
or focuses upon the item with the navigation-keys or trackball and presses the suitable "enter" key or
presses down on the trackball.
onLongClick()
From View.OnLongClickListener. This is called when the user either touches and holds the item (when
in touch mode), or focuses upon the item with the navigation-keys or trackball and presses and holds
the suitable "enter" key or presses and holds down on the trackball (for one second).
onFocusChange()
From View.OnFocusChangeListener. This is called when the user navigates onto or away from the item,
using the navigation-keys or trackball. onKey() From View.OnKeyListener. This is called when the user is
focused on the item and presses or releases a hardware key on the device.
onTouch()
From View.OnTouchListener. This is called when the user performs an action qualified as a touch event,
including a press, a release, or any movement gesture on the screen (within the bounds of the item).
onCreateContextMenu()
From View.OnCreateContextMenuListener. This is called when a Context Menu is being built (as the
result of a sustained "long click"). See the discussion on context menus in the Menus developer guide.
(from Android developers site)
http://developer.android.com/guide/topics/ui/ui-events.html
19. Tutoriel – Calculatrice
Faire une application calculatrice
http://a-
renouard.developpez.com/tutoriels/android/calculatric
e/
Modifier la calculatrice
pour spécifier les ‘écouteurs’ (listeners) dans le fichier de
layout.
Pour n’avoir qu’une méthode appelé lors de l’appuie sur
l’un des boutons ‘chiffres’
On peut retrouver à quel chiffre correspond le bouton à partir
du texte du bouton
22. Le problème
Comment avoir des parties de UI (d’écran) réutilisable
dans plusieurs écrans ?
Ex: tablette : deux parties côte à côte
petit écran : deux écrans
23. Fragment
C’est une partie de UI, associé à des comportements
Partie de UI
Déclarée dans un layout.xml
Ou dans le code
Comportements
Déclarés dans une classe étendant « Fragment »
(Android>3.x)
Peut être vue comme une Activity réutilisable
Doit être contenu dans une Activity parent
Réutilisable dans différentes Activity
24. En pratique
Le layout de l’activity parent déclare l’emplacement du
fragment, et la class du Fragment
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<fragment android:name="com.example.android.fragments.ArticleFragment "
android:id="@+id/headlines_fragment"
android:layout_weight="1"
android:layout_width="match_parent "
android:layout_height="0dp" />
</LinearLayout>
classe du
fragment
Emplacement
25. En pratique
Il faut créer la classe du Fragment
Bien retourner la View du fragment dans
onViewCreate()
public class ArticleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.article_view, container, false);
}
}
26. En pratique
Il faut créer le layout du Fragment
Comme un layout d’activité
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/book_detail"
style="?android:attr/textAppearanceLarge"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:textIsSelectable="true"/>
28. Biblio
Building a Dynamic UI with Fragments
http://developer.android.com/training/basics/fragments/index.html
Fragments
http://developer.android.com/guide/components/fragments.html
Utiliser les Fragments dans une application Android pour diviser l'écran
en plusieurs Activity
http://sberfini.developpez.com/tutoriaux/android/fragments/
Un tutorial avec une solution clé en main
http://www.vogella.com/tutorials/AndroidFragments/article.html#fragments_t
utorial
Supporting Different Screens
http://developer.android.com/training/basics/supporting-devices/screens.html
Exemple
Créer une nouvelle application Android, et choisir « master/detail flow »
30. Le problème
Comment afficher une liste d’éléments sur un même
écran ?
Ex: une liste de personnes avec leur email ?
31. Solution
Utiliser une ListView, un ListAdapter et un layout dédié pour afficher
un élément de la liste
ListView
élement graphique indiquant l’endroit dans la UI où doit être affiché la
liste
Dans mainLayout.xml (ou en code)
Layout pour un élément
Indique comment afficher un élément de la liste
ListView utilisera une instance de ce Layout pour chaque élément
Adapter
Classe faisant le lien entre:
ListView,
le Layout pour un élément,
la liste des éléments
36. Créer et associer l’adapter
(Dans l’activity)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Recherche la vue affichant la liste
ListView bookList = (ListView) findViewById(R.id.booklist);
// Crée la liste demandée par SimpleADapter
BookCollection books = new BookCollection();
List<Map<String, String>> listOfBook = new ArrayList<Map<String, String>>();
for( Book book : books.getBooks()) {
Map<String, String> bookMap = new HashMap<String, String>();
bookMap.put("img", String.valueOf(R.drawable.ic_launcher)); // use available img
bookMap.put("author", book.getAuthor());
bookMap.put("title", book.getTitle());
bookMap.put("isbn", book.getIsbn());
listOfBook.add(bookMap);
}
// Cree un adapter faisant le lien entre la liste d'élément et la ListView servant à l'affichage.
SimpleAdapter listAdapter = new SimpleAdapter(this.getBaseContext(), listOfBook, R.layout.book_detail,
new String[] {"img", "author", "title", "isbn"},
new int[] {R.id.img, R.id.author, R.id.title, R.id.isbn});
//Associe l’adapter et le ListView
bookList.setAdapter(listAdapter);
}
39. Biblio
Personnaliser une ListView
http://a-
renouard.developpez.com/tutoriels/android/personnali
ser-listview/
41. Probléme
On veut accéder à la liste des contacts existant dans le
smartphone.
42. Solution
Utiliser le « Contact Provider »
class ContactsContract
android.provider.ContactsContract
43. Content Provider
Permet de gérer l’accès à des données structurées
Exemple
ContactProvider
CalendarProvider
Votre application ;
doit demander le ContentProvider
Devient client du ContentProvider
44. ContentProvider :
Structure des données
Organisées en table
Une rangée (row) représente les données d’un objet
Une colonne représente les données du même attribut
On parcours les rangée à l’aide d’un ‘cursor’
On demande une valeur par le nom de sa colonne
46. Atelier
Créer une activité affichant tous les contacts dans un
unique TextView
Voir le tutoriel
http://examples.javacodegeeks.com/android/core/provi
der/android-contacts-example/
49. Memory
Definitions
http://fr.wikipedia.org/wiki/Memory_%28jeu%29
http://www.linternaute.com/jeu/classique/le-memory/
But du jeu
Le but du jeu est de retourner des cartes deux par deux,
et de retrouver les paires.
Réalisation
Points difficiles
Interface dynamique
Générateur aléatoire
50. Réflexions sur l’architecture
MainActivity
avec GridLayout
1x CardFragment
16 instances ?
paramétré par ce qui
doit être affiché ?
A A A A
A A A A
A A A A
A A A A
score : 0/8
57. Debuter
Introduction à la programmation sous Android
http://nbenbourahla.developpez.com/tutoriels/android
/introduction-programmation-android/
Introduction aux vues sous Android
http://nbenbourahla.developpez.com/tutoriels/an
droid/introduction-vues-sous-android/
59. Divers
Intégration Google Maps dans Android
http://michel-dirix.developpez.com/tutoriels/android/integration-
google-maps-android/
Personnaliser une ListView
http://a-
renouard.developpez.com/tutoriels/android/personnaliser-
listview/
Internationaliser vos applications Android
http://a-
renouard.developpez.com/tutoriels/android/internationalisation/
Construire dynamiquement ses IHM Android
http://mathias-
seguy.developpez.com/cours/android/construction-ihm-
dynamique/
60. Notifications
Utiliser les notifications pour avertir l'utilisateur
http://a-
renouard.developpez.com/tutoriels/android/notificatio
ns/
Les notifications sous Android
http://nbenbourahla.developpez.com/tutoriels/java/an
droid_notification/
61. Fragments
Building a Dynamic UI with Fragments
http://developer.android.com/training/basics/fragment
s/index.html
Utiliser les Fragments dans une application
Android pour diviser l'écran en plusieurs Activity
http://sberfini.developpez.com/tutoriaux/android/frag
ments/
Supporting Different Screens
http://developer.android.com/training/basics/supportin
g-devices/screens.html
62. Services
Les services sous Android
http://nbenbourahla.developpez.com/tutoriels/android
/services-sous-android/
63. Comment utiliser SQLite sous
Android
Comment utiliser SQLite sous Android
http://a-
renouard.developpez.com/tutoriels/android/sqlite/