Académique Documents
Professionnel Documents
Culture Documents
Semaine 5
Semaine 5
Barre d’action
Avant Android 3.0 (API 11), les actions d’une application étaient
lancées avec un bouton de menu, mécanique. Depuis, elles sont
déclenchées par la barre d’action. C’est presque la même chose.
Le principe général : un menu est une liste d’items qui apparaît soit quand
on appuie sur le bouton menu, soit sur la barre d’action.
Certains de ces items sont présents en permanence dans la barre d’action.
La sélection d’un item déclenche une callback.
Docs Android sur la barre d’action et sur les menus
Il faut définir :
un fichier res/menu/nom_du_menu.xml,
des thèmes pour afficher soit la barre d’action, soit des menus, deux
callbacks pour gérer les menus : création et activation.
Android - Semaine 5
Barre d’action et menus
Créer res/menu/nom_du_menu.xml:
<menu xmlns:android="..." >
<item android:id="@+id/menu_creer"
android:icon="@drawable/ic_menu_creer"
android:showAsAction="ifRoom"
android:title="@string/menu_creer"/>
<item android:id="@+id/menu_chercher" . . . />
...
</menu>
Menus en cascade
Menus contextuels
lv.setOnCreateContextMenuListener(this);
Android - Semaine 5
Barre d’action et menus
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo)
{
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.main_context, menu);
}
Dans le cas d’un RecyclerView, c’est un peu plus compliqué car le menu
ne se déclenche pas. Il faut ajouter un écouteur à l’adaptateur :
@Override
public void onBindViewHolder(final PlaneteView h, final int pos)
{
// définir un écouteur pour les clics longs avec une lambda
h.itemView.setOnLongClickListener(view -> {
setClickedPosition(pos);
return false;
});
// définir un écouteur pour le menu contextuel (clic long)
h.itemView.setOnCreateContextMenuListener(mMenuListener);
}
Android - Semaine 5
Barre d’action et menus
Une expression lambda est une sorte d’objet-méthode sans nom, par exemple
un écouteur anonyme sur un bouton.
Au lieu d’écrire ceci :
btn.setOnClickListener(
new View.OnClickListener() { public
void onClick(View v) {
// faire quelque chose
}
});
On nelaisse que les noms des paramètres, sans parenthèses s’il est seul,
et le corps. On peut même supprimer les {} s’il n’y a qu’une seule instruction.
La syntaxe lambda, paramètre -> instruction ou (paramètres) -> {
instructions; } est possible lorsqu’il s’agit de la seule méthode d’une
interface :
switch (item.getItemId()) {
...
}
return false;
}
NB: ce n’est encore pas une bonne solution quand les items ont un
identifiant et non une position, voir le TP sur Realm.
Android - Semaine 5
Annonces et dialogues
Annonces et dialogues
Android - Semaine 5
Annonces et dialogues
Annonces : toasts
Annonces personnalisées
Dialogues
Un dialogue est une petite fenêtre qui apparaît au dessus d’un écran pour
afficher ou demander quelque chose d’urgent à l’utilisateur, par exemple une
confirmation.
Dialogue d’alerte
Dialogues personnalisés
Il faut définir le layout du dialogue incluant tous les textes, sauf le titre, et
au moins un bouton pour valider, sachant qu’on peut fermer le dialogue
avec le bouton back.
Affichage du dialogue
// créer le dialogue (final car utilisé dans les écouteurs) final Dialog
dialog = new Dialog(this); dialog.setView(R.layout.edit_dialog);
dialog.setTitle("Création d 'u n type");
// bouton valider
Button btnValider = dialog.findViewById(R.id.dlg_btn_valider);
btnValider.setOnClickListener(v -> {
// récupérer et traiter les infos
...
// ne surtout pas oublier de fermer le dialogue
dialog.dismiss();
}
});
// afficher le dialogue
dialog.show();
Android - Semaine 5
Fragments et activités
Fragments et activités
Android - Semaine 5
Fragments et activités
Fragments
Depuis Android 4, les dialogues doivent être gérés par des instances de
DialogFragment qui sont dessortes de fragments.
Cela va plus loin que les dialogues. Toutes les parties des interfaces d’une
application sont susceptibles de devenir des fragments :
liste d’items
affichage desinfos d’un item
édition d’un item
Tablettes, smartphones...
Une interface devient plus souple avec des fragments. Selon la taille d’écran,
on peut afficher une liste et les détails, ou séparer les deux.
Android - Semaine 5
Fragments et activités
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup
container, Bundle savedInstanceState)
{
return inflater.inflate( R.layout.infos_fragment,
container, false);
}
}
Android - Semaine 5
Fragments et activités
ListFragment
// layout du fragment
return inflater.inflate(android.R.layout.list_content, container,
false);
}
Android - Semaine 5
Fragments et activités
ListFragment, suite
Menus de fragments
FragmentManager
// transaction
FragmentTransaction trans = manager.beginTransaction();
res/layout-land/main_activity.xml en paysage :
<LinearLayout xmlns:android="..."
android:orientation="horizontal" . . . >
<fragment android:id="@+id/frag_liste" . . . />
<fragment android:id="@+id/frag_infos" . . . />
</LinearLayout>
Android - Semaine 5
Fragments et activités
Écouteur du fragment
Écouteur de l’activité
Voici maintenant l’écouteur de l’activité principale :
@Override public void onItemSelected(Item item)
{
FragmentManager manager = getFragmentManager();
InfosFragment frag_infos = (InfosFragment)
manager.findFragmentById(R.id.frag_infos);
if (frgInfos != null && frgInfos.isVisible()) {
// le fragment est présent, alors lui fournir l'item
frgInfos.setItem(item);
} else {
// lancer InfosActivity pour afficher l'item
Intent intent = new Intent(this, InfosActivity.class);
intent.putExtra("item", item);
startActivity(intent);
}
}
Android - Semaine 5
Fragments et activités
À méditer, partie 2
Une 2e classe en tant qu’écouteur des événements d’un objet de
Classe1, elle implémente l’interface et se déclare auprès de l’objet.
public class Classe2 implements Classe1.OnEvenementListener
{
private Classe1 objet1;
public Classe2() {
...
objet1.setOnEvenementListener(this);
}