WIESLAW ZIELONKA WWW.IRIF.UNIV-PARIS-DIDEROT.FR/~ZIELONKA PROGRAMMATION DE COMPOSANTS MOBILES (ANDROID)
WIESLAW ZIELONKA WWW.IRIF.UNIV-PARIS-DIDEROT.FR/~ZIELONKA
PROGRAMMATION DE COMPOSANTS MOBILES (ANDROID)
Messages log (débogage)
méthode type de message
Log.e() error
Log.w() warning
Log.i() information
Log.d() debug
Log.v() verbose
private static final string TAG=“MyApp“; Log.w(TAG, ’’compteur=“ + compteur);
Deux paramètres String: un tag et un massage.
Toast - afficher un message sur l’écranContext context = getApplicationContext();CharSequence message = "click plus"; Toast toast = Toast.makeText(context, message, Toast.LENGTH_LONG);toast.show();
Affiche le message en bas d’écran.
On peut changer la position avec la méthode setGravity()
toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0); toast.show();
Views• Button
• TextView - texte non-modifiable
• EditText — texte modifiable
EditText
<EditText android:id="@+id/rue" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="rue" android:lines="1" android:imeOptions="actionNext" android:inputType="text" />
• android:hint — un indice (message) initial affiché dans EditText • android:imeOptions — ime = input méthode, typiquement actionNext (le
curseur passe sur EditText suivant) ou actionSend, • android:inputType — type d’entrée : text, textPassword, number, numberDecimal, etc.
Mettre un texte dans EditText :
Mettre un texte dans EditText
EditText edittext = (EditText) findIdByName(R.id.rue); edittext.setText("Rivoli");
EditText — récupérer le contenu
La méthode getText() de EditText : Editable getText();
Pour obtenir un String appliquer toString().
L'objet Editable possède les méthodes:
• Editable append(CharSequence tx) • void clear() • Editable delete(int st, int end) • void setFilters(InputFilter[] filters) • Editable insert(int where, CharSequence text) • Editable replace(int st, int en, CharSequence tt) remplace le texte entre st et en par tt.
EditText - les filtres EditText edit = ( EditText ) findViewById(R.id.edit) ; edit.setFilters(new InputFilter[ ], new InputFilter.AllCaps( ) , new InputFilter.lengthFilter( 2 ) ) ;
Installation de deux filtres, le premier met les lettres en majuscules, le deuxième limite la longueur du texte à 2 caractères. Ce sont les deux seuls filtres déjà implémentés par Android. La class InputFilter possède la méthode
CharSequence filter (CharSequence source, int start, int end, Spanned dest, int dstart, int dend) permettant d'implémenter d'autres filtres par vos soins.
Installer un listener sur EditText
EditText numero, rue, ville, code; String ttNumero, ttRue, ttVille, ttCode;
rue = (EditText) findViewById(R.id.rue);
rue.setOnEditorActionListener( new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { Log.d(tag, "rue listener"); if (actionId == EditorInfo.IME_ACTION_NEXT) { Log.d(tag,"rue action next"); ttRue = rue.getText().toString(); numero.requestFocus(); return true; } return false; } } ); Il s'agit d'un listener activé par le bouton ENTER. Il existe d'autres listeners pour EditText.
Attributs obligatoires de layout ou view
• android:layout_width
• android:layout_height
Valeurs :
• match_parent — aussi grand que le parent (moins padding)
• wrap_content — suffisamment grand pour le contenu
• valeurs : 10dp (dp = densité indexent pixels), 30sp (sp - scalled pixels, pour la taille de texte),
Attributs margin (facultatif)
nom de l'attributs
android:layout_marginBottom
android:layout_marginTop
android:layout_marginLeft
android:layout_marginRight
android:layout_marginStart
android:layout_marginEnd
margin - spécifie la marge autour à l'extérieur d'un composant
Attributs padding (facultatif)
attributs padding
android:paddinngBottom
android:paddingTop
android:paddingLeft
android:paddingRight
android:paddingStart
android:paddingEnd
padding - la marge autour de contenu à l'intérieur de composant
LAYOUTS
Layout - gestionnaire de position, gère les positions des enfants (views, d'autres layouts)
• LinearLayout
• FrameLayout
• GridLayout
• RelativeLayout
LinearLayoutAttributs XML de LinearLayout:
android:orientation soit "vertical" soit "horizontal"
android:gravity spécifie comment l'objet positionne le contenu : top bottom left right center_vertical center_horizontal fill_vertical fill_horizontal center fill
android:weightSum
valeur : un flottant. En combinaison avec layout_weight d'un enfant permet de spécifier la part de l'enfant. Par exemple si weighSum="1.0" et layout_weight de l'enfant "0.5" alors ce enfant prendra 50% de l'espace de layout
LinearLayoutAttributs XML de l'enfant de LinearLayout:
android:layout_gravity les constantes que l'enfant passe au parent : top bottom left right center_vertical center_horizontal fill_vertical fill_horizontal center fill "top|left"
android:layout_weight Le poid de l'enfant.
RelativeLayoutRelativeLayout permet de spécifier les positions des enfants un par rapport à l'autre. On met les attributs spécifiques dans les enfants de RelativeLayout. La site des attributs pour les enfants se trouve dans RelativeLayout.LayoutParams.
Attributs XML à mettre dans les enfants de RelativeLayout:
android:layout_above android:layout_above="@id/toto" au-dessus d'un élément dont id est toto
android:layout_alignBottom Alignement de bottom avec la bottom d'un autre view.
android:layout_alignTop
android:layout_alignLeft
android:layout_alignRight le bord droit de ce view s'aligne avec le nord droit d'un autre view
RelativeLayoutAttributs XML à mettre dans les enfants de RelativeLayout:
android:layout_below android:layout_below="@id/toto" au-dessous d'un élément dont id est toto
android:layout_alignParentBottom valeurs : soit "true" soit "false
android:layout_alignParentTop idemandroid:layout_alignParentLeft idem
android:layout_alignParentRight idem
android:layout_toLeftOf android:layout_toLeftTo="@id/toto" à gauche de toto
android:layout_toRightOf idem à droite
SANS RÉSULTAT DE RETOUR
Démarrer une nouvelle activité
void startActivity(Intent intent)
void startActivity(Intent intent, Bundle options)
Les deux méthodes appartiennent à la class Context. Mais Activity hérite de la classe Context donc on peut appeler startActivity() dans Activity.
Intent — une sorte de message pour activer une nouvelle activité, contient "l'adresse de destinateur" et des données.
Préparer Intent explicite
Intent "explicite" pour activer une activité précise.
Constructeurs:
Intent()
Intent(Context context, Class<?> csl)
Démarrer une nouvelle activité
de la même applicationDans MainActivity (activité appelante):
Intent intent = new Intent();intent.setClassName("fr.liafa.zielonka.newactivity", "fr.liafa.zielonka.newactivity.Superposer");intent.putExtra(COLOR, s); intent.putExtra(ALPHA, alpha); startActivity(intent);
la méthode setClassName() permet de spécifier l'activité destinataire (c'est l'activité Superposer), deux paramètres :le nom du package et le nom de l'activité destinataire (avec le package).
putExtra(String key, ? valeur) ajoute les données sous forme (key,value) dans Intent
Démarrer une nouvelle activité
de la même application (une autre variante)
Dans MainActivity (activité appelante): à la place de
Intent intent = new Intent();intent.setClassName("fr.liafa.zielonka.newactivity", "fr.liafa.zielonka.newactivity.Superposer");
faire
Intent intent = new Intent(this, Superposer.class);
parce que Activity est dérivée de Context parce que Superposer est
la nouvelle activité
Dans l'activité appeléeprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_superposer);
/* récupérer Intent qui a démarré cette activité*/ Intent intent = getIntent(); /* récupérer une donnée avec une méthode get appropriée*/ float alpha = intent.getFloatExtra(MainActivity.ALPHA, 1.0f); String s = intent.getStringExtra(MainActivity.COLOR);
Pour récupérer les valeurs qui se trouvent dans Intent les méthodes :
TypeValeur getTypeValeurExtra(String clé, valeur_par_defaut)
où TypeValeur dépend du type de la valeur stockée dans Extra. Intent contient aussi la méthode
Bundle getExtras()
qui retourne un Bundle avec tous les extras.
SpinnerDans le fichier layout : <Spinner android:id="@+id/spin1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:entries="@array/hex" />
l'attribut :android:entries="@array/hex" indique que les Strings affichés dans Spinner viennent d'un tableau de resources, app/res/values/strings.xml contient
<string-array name="hex"> <item>F</item><item>E</item><item>D</item><item>C</item> <item>B</item><item>A</item> <item>9</item><item>8</item><item>7</item><item>6</item> <item>5</item><item>4</item> <item>3</item><item>2</item><item>1</item><item>0</item> </string-array>
SpinnerDans java :
Spinner spin1; spin1 = (Spinner) findViewById(R.id.spin1);
/* pour récupérer le String sélectionné dans Spinner */
String dig1 = spin1.getSelectedItem().toString();
CheckBox
Dans layout :
<CheckBox android:id="@id/red" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/text" android:textSize="@dimen/tailleText" android:text="@string/red" />
pour avoir les dimensions des textes uniformes dans app/res/values/dimens.xml
on ajoute la ligne :<dimen name="tailleText">30sp</dimen>
CheckBoxDans java :
CheckBox red = (CheckBox) findViewById(R.id.red); String s = "#"; s += red.isChecked() ? "FF" : "00";
isChecked() est true si CheckBox sélectionné.