Lecture1_Linear_SVM_Primal.pdf

Lecture1_Linear_SVM_Primal.pdf - Revenir à l'accueil

 

SVM and Kernel machine Lecture 1: Linear SVM Stéphane Canu stephane.canu@litislab.eu Sao Paulo 2014 March 12, 2014Road map 1 Linear SVM Separating hyperplanes The margin Linear SVM: the problem Linear programming SVM 0 0 0 margin "The algorithms for constructing the separating hyperplane considered above will be utilized for developing a battery of programs for pattern recognition." in Learning with kernels, 2002 - from V .Vapnik, 1982Hyperplanes in 2d: intuition It’s a line!Hyperplanes: formal definition Given vector v ∈ IRd and bias a ∈ IR Hyperplane as a function h, h : IRd −→ IR x 7−→ h(x) = v ⊤x + a Hyperplane as a border in IRd (and an implicit function) ∆(v, a) = {x ∈ IRd v ⊤x + a = 0} The border invariance property ∀k ∈ IR, ∆(kv, ka) = ∆(v, a) ∆ = {x ∈ IR2 | v ⊤x + a = 0} the decision border ∆ (x, h(x)) = v ⊤x + a) (x, 0) h(x) d(x, ∆)Separating hyperplanes Find a line to separate (classify) blue from red D(x) = sign v ⊤x + a Separating hyperplanes Find a line to separate (classify) blue from red D(x) = sign v ⊤x + a  the decision border: v ⊤x + a = 0Separating hyperplanes Find a line to separate (classify) blue from red D(x) = sign v ⊤x + a  the decision border: v ⊤x + a = 0 there are many solutions... The problem is ill posed How to choose a solution?This is not the problem we want to solve {(xi , yi); i = 1 : n} a training sample, i.i.d. drawn according to IP(x, y) unknown we want to be able to classify new observations: minimize IP(error)This is not the problem we want to solve {(xi , yi); i = 1 : n} a training sample, i.i.d. drawn according to IP(x, y) unknown we want to be able to classify new observations: minimize IP(error) Looking for a universal approach use training data: (a few errors) prove IP(error) remains small scalable - algorithmic complexityThis is not the problem we want to solve {(xi , yi); i = 1 : n} a training sample, i.i.d. drawn according to IP(x, y) unknown we want to be able to classify new observations: minimize IP(error) Looking for a universal approach use training data: (a few errors) prove IP(error) remains small scalable - algorithmic complexity with high probability (for the canonical hyperplane): IP(error) < IPb (error) | {z } =0 here + ϕ( 1 margin | {z } =kvk ) Vapnik’s Book, 1982Margin guarantees min i∈[1,n] dist(xi , ∆(v, a)) | {z } margin: m Theorem (Margin Error Bound) Let R be the radius of the smallest ball BR(a) =  x ∈ IRd | kx − ck < R , containing the points (x1, . . . , xn) i.i.d from some unknown distribution IP. Consider a decision function D(x) = sign(v ⊤x) associated with a separating hyperplane v of margin m (no training error). Then, with probability at least 1 − δ for any δ > 0, the generalization error of this hyperplane is bounded by IP(error) ≤ 2 r R2 n m2 + 3 r ln(2/δ) 2n R v’x = 0 m theorem 4.17 p 102 in J Shawe-Taylor, N Cristianini Kernel methods for pattern analysis, Cambridge 2004Statistical machine learning – Computation learning theory (COLT) {xi , yi} {xi , yi} i = 1, n A f = v ⊤x + a x yp = f (x) IPb (error) = 1 n L(f (xi), yi) Loss L Vapnik’s Book, 1982Statistical machine learning – Computation learning theory (COLT) {xi , yi} {xi , yi} i = 1, n A f = v ⊤x + a x yp = f (x) IPb (error) = 1 n L(f (xi), yi) y Loss L IP(error) = IE(L) ∀IP ∈ P P IP Prob  ≤ + ϕ(kvk) ≥ δ Vapnik’s Book, 1982linear discrimination Find a line to classify blue and red D(x) = sign v ⊤x + a  the decision border: v ⊤x + a = 0 there are many solutions... The problem is ill posed How to choose a solution ? ⇒ choose the one with larger marginRoad map 1 Linear SVM Separating hyperplanes The margin Linear SVM: the problem Linear programming SVM 0 0 0 marginMaximize our confidence = maximize the margin the decision border: ∆(v, a) = {x ∈ IRd v ⊤x + a = 0} 0 0 0 margin maximize the margin max v,a min i∈[1,n] dist(xi , ∆(v, a)) | {z } margin: m Maximize the confidence    max v,a m with min i=1,n |v ⊤xi + a| kvk ≥ m the problem is still ill posed if (v, a) is a solution, ∀ 0 < k (kv, ka) is also a solution. . .Margin and distance: details Theorem (The geometrical margin) Let x be a vector in IRd and ∆(v, a) = {s ∈ IRd v ⊤s + a = 0} an hyperplane. The distance between vector x and the hyperplane ∆(v, a)) is dist(xi , ∆(v, a)) = |v⊤x+a| kvk Let sx be the closest point to x in ∆ , sx = arg min s∈∆ kx − sk. Then x = sx + r v kvk ⇔ r v kvk = x − sx So that, taking the scalar product with vector v we have: v ⊤r v kvk = v ⊤(x − sx ) = v ⊤x − v ⊤sx = v ⊤x + a − (v ⊤sx + a) | {z } =0 = v ⊤x + a and therefore r = v⊤x + a kvk leading to: dist(xi , ∆(v, a)) = min s∈∆ kx − sk = r = |v⊤x + a| kvkGeometrical and numerical margin ∆ = {x ∈ IR2 | v ⊤x + a = 0} the decision border ∆ d(x, ∆) = |v ⊤x + a| kvk the geometrical margin d(xb, ∆) (xr, v ⊤xr + a) (xr, 0) mr d(xr, ∆) (xb, v ⊤xb + a) mb (xb, 0) m = |v ⊤x + a| the numerical marginFrom the geometrical to the numerical margin +1 ï1 ï1/|w| 1/|w| {x | wT x = 0} <ï ï marge > x w T x Valeur de la marge dans le cas monodimensionnel Maximize the (geometrical) margin    max v,a m with min i=1,n |v ⊤xi + a| kvk ≥ m if the min is greater, everybody is greater (yi ∈ {−1, 1})    max v,a m with yi(v ⊤xi + a) kvk ≥ m, i = 1, n change variable: w = v mkvk and b = a mkvk =⇒ kwk = 1 m    max w,b m with yi(w⊤xi + b) ≥ 1 ; i = 1, n and m = 1 kwk    min w,b kwk 2 with yi(w⊤xi + b) ≥ 1 i = 1, nThe canonical hyperplane ( min w,b kwk 2 with yi(w⊤xi + b) ≥ 1 i = 1, n Definition (The canonical hyperplane) An hyperplane (w, b) in IRd is said to be canonical with respect the set of vectors {xi ∈ IRd , i = 1, n} if min i=1,n |w ⊤xi + b| = 1 so that the distance min i=1,n dist(xi , ∆(w, b)) = |w⊤x + b| kwk = 1 kwk The maximal margin (=minimal norm) canonical hyperplaneRoad map 1 Linear SVM Separating hyperplanes The margin Linear SVM: the problem Linear programming SVM 0 0 0 marginLinear SVM: the problem The maximal margin (=minimal norm) canonical hyperplane 0 0 0 margin Linear SVMs are the solution of the following problem (called primal) Let {(xi , yi); i = 1 : n} be a set of labelled data with x ∈ IRd , yi ∈ {1, −1} A support vector machine (SVM) is a linear classifier associated with the following decision function: D(x) = sign w⊤x + b  where w ∈ IRd and b ∈ IR a given thought the solution of the following problem: ( min w∈IRd , b∈IR 1 2 kwk 2 with yi(w⊤xi + b) ≥ 1 , i = 1, n This is a quadratic program (QP): ( min z 1 2 z ⊤Az − d ⊤z with Bz ≤ eSupport vector machines as a QP The Standart QP formulation ( min w,b 1 2 kwk 2 with yi(w⊤xi + b) ≥ 1, i = 1, n ⇔ ( min z∈IRd+1 1 2 z ⊤Az − d ⊤z with Bz ≤ e z = (w, b) ⊤, d = (0, . . . , 0) ⊤, A =  I 0 0 0  , B = −[diag(y)X, y] and e = −(1, . . . , 1) ⊤ Solve it using a standard QP solver such as (for instance) % QUADPROG Quadratic programming . % X = QUADPROG (H ,f ,A ,b ) attempts to solve the quadratic programming problem : % % min 0.5* x ’* H*x + f ’* x subject to : A*x <= b % x % so that the solution is in the range LB <= X <= UB For more solvers (just to name a few) have a look at: plato.asu.edu/sub/nlores.html#QP-problem www.numerical.rl.ac.uk/people/nimg/qp/qp.htmlRoad map 1 Linear SVM Separating hyperplanes The margin Linear SVM: the problem Linear programming SVM 0 0 0 marginOther SVMs: Equivalence between norms L1 norm variable selection (especially with redundant noisy features) Mangassarian, 1965    max m,v,a m with yi(v ⊤xi + a) ≥ m kvk2 ≥ m 1 √ d kvk1 i = 1, n 1-norm or Linear Programming-SVM (LP SVM) ( min w,b kwk1 = Pp j=1 |wj | with yi(w ⊤xi + b) ≥ 1 ; i = 1, n Generalized SVM (Bradley and Mangasarian, 1998) ( min w,b kwk p p with yi(w ⊤xi + b) ≥ 1 ; i = 1, n p = 2: SVM, p = 1: LPSVM (also with p = ∞), p = 0: L0 SVM, p= 1 and 2: doubly regularized SVM (DrSVM)Linear support vector support (LP SVM) ( min w,b kwk1 = Pp j=1 w + j + w − j with yi(w ⊤xi + b) ≥ 1 ; i = 1, n w = w + − w − with w + ≥ 0 and w − ≥ 0 The Standart LP formulation    min x f ⊤x with Ax ≤ d and 0 ≤ x x = [w +; w −; b] f = [1 . . . 1; 0] d = −[1 . . . 1] ⊤ A = [−yiXi yiXi − yi] % linprog (f ,A ,b , Aeq , beq ,LB , UB ) % attempts to solve the linear programming problem : % min f ’* x subject to : A* x <= b % x % so that the solution is in the range LB <= X <= UBAn example of linear discrimination: SVM and LPSVM true line QP SVM LPSVM Figure: SVM and LP SVMThe linear discrimination problem from Learning with Kernels, B. Schölkopf and A. Smolla, MIT Press, 2002.Conclusion SVM = Separating hyperplane (to begin with the simpler) + Margin, Norm and statistical learning + Quadratic and Linear programming (and associated rewriting issues) + Support vectors (sparsity) SVM preforms the selection of the most relevant data pointsBibliography V. Vapnik, the generalized portrait method p 355 in Estimation of dependences based on empirical data, Springer, 1982 B. Boser, I. Guyon & V. Vapnik, A training algorithm for optimal margin classifiers. COLT, 1992 P. S. Bradley & O. L. Mangasarian. Feature selection via concave minimization and support vector machines. ICML 1998 B. Schölkopf & A. Smolla, Learning with Kernels, MIT Press, 2002 M. Mohri, A. Rostamizadeh & A. Talwalkar, Foundations of Machine Learning, MIT press 2012 http://agbs.kyb.tuebingen.mpg.de/lwk/sections/section72.pdf http://www.cs.nyu.edu/~mohri/mls/lecture_4.pdf http://en.wikipedia.org/wiki/Quadratic_programming Stéphane Canu (INSA Rouen - LITIS) March 12, 2014 25 / 25 Understanding SVM (and associated kernel machines) through the development of a Matlab toolbox Stephane Canu To cite this version: Stephane Canu. Understanding SVM (and associated kernel machines) through the development of a Matlab toolbox. Ecole d’ing´enieur. Introduction to Support Vector Machines (SVM), ´ Sao Paulo, 2014, pp.33. HAL Id: cel-01003007 https://cel.archives-ouvertes.fr/cel-01003007 Submitted on 8 Jun 2014 HAL is a multi-disciplinary open access archive for the deposit and dissemination of scientific research documents, whether they are published or not. The documents may come from teaching and research institutions in France or abroad, or from public or private research centers. L’archive ouverte pluridisciplinaire HAL, est destin´ee au d´epˆot et `a la diffusion de documents scientifiques de niveau recherche, publi´es ou non, ´emanant des ´etablissements d’enseignement et de recherche fran¸cais ou ´etrangers, des laboratoires publics ou priv´es.Lecture 8: Multi Class SVM Stéphane Canu stephane.canu@litislab.eu Sao Paulo 2014 April 10, 2014Roadmap 1 Multi Class SVM 3 different strategies for multi class SVM Multi Class SVM by decomposition Multi class SVM Coupling convex hulls 1.5 1.5 1.5 1.5 1.5 1.5 2.5 2.5 2.5 −0.5 0 0.5 1 1.5 0 0.5 1 1.5 23 different strategies for multi class SVM 1 Decomposition approaches ◮ one vs all: winner takes all ◮ one vs one: ⋆ max-wins voting ⋆ pairwise coupling: use probability ◮ c SVDD 2 global approach (size c × n), ◮ formal (different variations)    min f ∈H,α0,ξ∈IRn 1 2 Xc ℓ=1 kfℓk 2 H + C p Xn i=1 Xc ℓ=1,ℓ6=yi ξ p iℓ with fyi (xi) + byi ≥ fℓ(xi) + bℓ + 2 − ξiℓ and ξiℓ ≥ 0 for i = 1, ..., n; ℓ = 1, ..., c; ℓ 6= yi non consistent estimator but practically useful ◮ structured outputs 3 A coupling formulation using the convex hulls3 different strategies for multi class SVM 1 Decomposition approaches ◮ one vs all: winner takes all ◮ one vs one: ⋆ max-wins voting ⋆ pairwise coupling: use probability – best results ◮ c SVDD 2 global approach (size c × n), ◮ formal (different variations)    min f ∈H,α0,ξ∈IRn 1 2 Xc ℓ=1 kfℓk 2 H + C p Xn i=1 Xc ℓ=1,ℓ6=yi ξ p iℓ with fyi (xi) + byi ≥ fℓ(xi) + bℓ + 2 − ξiℓ and ξiℓ ≥ 0 for i = 1, ..., n; ℓ = 1, ..., c; ℓ 6= yi non consistent estimator but practically useful ◮ structured outputs 3 A coupling formulation using the convex hullsMulticlass SVM: complexity issues n training data n = 60, 000 for MNIST c class c = 10 for MNIST approach problem size number of sub problems discrimination rejection 1 vs. all n c ++ - 1 vs. 1 2n c c(c−1) 2 ++ - c SVDD n c c - ++ all together n × c 1 ++ - coupling CH n 1 + +Roadmap 1 Multi Class SVM 3 different strategies for multi class SVM Multi Class SVM by decomposition Multi class SVM Coupling convex hulls 1.5 1.5 1.5 1.5 1.5 1.5 2.5 2.5 2.5 −0.5 0 0.5 1 1.5 0 0.5 1 1.5 2Multi Class SVM by decomposition One-Against-All Methods → winner-takes-all strategy One-vs-One: pairwise methods → max-wins voting → directed acyclic graph (DAG) → error-correcting codes → post process probabilities Hierarchical binary tree for multi-class SVM http://courses.media.mit.edu/2006fall/ mas622j/Projects/aisen-project/SVM and probabilities (Platt, 1999) The decision function of the SVM is: sign f (x) + b  log IP(Y = 1|x) IP(Y = −1|x) should have (almost) the same sign as f (x) + b log IP(Y = 1|x) IP(Y = −1|x) = a1(f (x) + b) + a2 IP(Y = 1|x) = 1 − 1 1 + expa1(f (x)+b)+a2 a1 et a2 estimated using maximum likelihood on new data max a1,a2 L with L = Yn i=1 IP(Y = 1|xi) yi + (1 − IP(Y = 1|xi))(1−yi ) and log L = Pn i=1 yi log(IP(Y = 1|xi)) + (1 − yi)log(1 − IP(Y = 1|xi)) = Pn i=1 yi log IP(Y =1|xi ) 1−IP(Y =1|xi )  + log(1 − IP(Y = 1|xi)) = Pn i=1 yi a1(f (xi) + b) + a2  − log(1 + expa1(f (xi )+b)+a2 ) = Pn i=1 yi a ⊤zi  − log(1 + expa ⊤zi) Newton iterations: a new ← a old − H −1∇logLSVM and probabilities (Platt, 1999) max a∈IR2 log L = Xn i=1 yi a ⊤zi  − log(1 + expa ⊤zi) Newton iterations a new ← a old − H −1∇logL ∇logL = Xn i=1 yi zi − expa ⊤z 1 + expa⊤z zi = Xn i=1 yi − IP(Y = 1|xi)  zi = Z ⊤(y − p) H = − Xn i=1 zi z ⊤ i IP(Y = 1|xi) 1 − IP(Y = 1|xi)  = −Z ⊤WZ Newton iterations a new ← a old + (Z ⊤WZ) −1Z ⊤(y − p)SVM and probabilities: practical issues y −→ t =    1 − ε+ = n+ + 1 n+ + 2 if yi = 1 ε− = 1 n− + 2 if yi = −1 1 in: X, y, f /out: p 2 t ← 3 Z ← 4 loop until convergence 1 p ← 1 − 1 1+expa⊤z 2 W ← diag p(1 − p)  3 a new ← a old + (Z ⊤WZ) −1Z ⊤(t − p)SVM and probabilities: pairwise coupling From pairwise probabilities IP(cℓ , cj) to class probabilities pℓ = IP(cℓ |x) min p Xc ℓ=1 X ℓ−1 j=1 IP(cℓ , cj) 2 (pℓ − pj) 2  Q e e ⊤ 0  p µ  =  0 1  with Qℓj =  IP(cℓ , cj) 2 P ℓ 6= j i IP(cℓ , ci) 2 ℓ = j The global procedure : 1 (Xa, ya, Xt, yt) ← split(X, y) 2 (Xℓ, yℓ, Xp, yp) ← split(Xa, ya) 3 loop for all pairs (ci , cj) of classes 1 modeli,j ← train_SVM(Xℓ, yℓ,(ci , cj)) 2 IP(ci , cj) ← estimate_proba(Xp, yp, model) % Platt estimate 4 p ← post_process(Xt, yt,IP) % Pairwise Coupling Wu, Lin & Weng, 2004, Duan & Keerti, 05SVM and probabilities Some facts SVM is universally consistent (converges towards the Bayes risk) SVM asymptotically implements the bayes rule but theoretically: no consistency towards conditional probabilities (due to the nature of sparsity) to estimate conditional probabilities on an interval (typically[ 1 2 − η, 1 2 + η]) to sparseness in this interval (all data points have to be support vectors) Bartlett & Tewari, JMLR, 07SVM and probabilities (2/2) An alternative approach g(x) − ε −(x) ≤ IP(Y = 1|x) ≤ g(x) + ε +(x) with g(x) = 1 1+4−f (x)−α0 non parametric functions ε − and ε + have to verify: g(x) + ε +(x) = exp−a1(1−f (x)−α0)++a2 1 − g(x) − ε −(x) = exp−a1(1+f (x)+α0)++a2 with a1 = log 2 and a2 = 0 Grandvalet et al., 07Roadmap 1 Multi Class SVM 3 different strategies for multi class SVM Multi Class SVM by decomposition Multi class SVM Coupling convex hulls 1.5 1.5 1.5 1.5 1.5 1.5 2.5 2.5 2.5 −0.5 0 0.5 1 1.5 0 0.5 1 1.5 2Multi class SVM: the decision function One hyperplane by class fℓ(x) = w ⊤ ℓ x + bℓ ℓ = 1, c Winner takes all decision function D(x) = Argmax ℓ=1,c w ⊤ 1 x + b1, w ⊤ 2 x + b2, . . . , w ⊤ ℓ x + bℓ , . . . , w ⊤ c x + bc  We can revisit the 2 classes case in this setting c × (d + 1) unknown variables (wℓ, bℓ); ℓ = 1, cMulti class SVM: the optimization problem The margin in the multidimensional case m = min ℓ6=yi v ⊤ yi xi − ayi − v ⊤ ℓ xi + aℓ  = v ⊤ yi xi + ayi − max ℓ6=yi v ⊤ ℓ xi + aℓ  The maximal margin multiclass SVM    max vℓ,aℓ m with v ⊤ yi xi + ayi − v ⊤ ℓ xi − aℓ ≥ m for i = 1, n; ℓ = 1, c; ℓ 6= yi and 1 2 Xc ℓ=1 kvℓk 2 = 1 The multiclass SVM    min wℓ,bℓ 1 2 Xc ℓ=1 kwℓk 2 with x ⊤ i (wyi − wℓ) + byi − bℓ ≥ 1 for i = 1, n; ℓ = 1, c; ℓ 6= yiMulti class SVM: KKT and dual form: The 3 classes case    min wℓ,bℓ 1 2 X 3 ℓ=1 kwℓk 2 with w⊤ yi xi + byi ≥ w⊤ ℓ xi + bℓ + 1 for i = 1, n; ℓ = 1, 3; ℓ 6= yi    min wℓ,bℓ 1 2 kw1k 2 + 1 2 kw2k 2 + 1 2 kw3k 2 with w⊤ 1 xi + b1 ≥ w⊤ 2 xi + b2 + 1 for i such that yi = 1 w⊤ 1 xi + b1 ≥ w⊤ 3 xi + b3 + 1 for i such that yi = 1 w⊤ 2 xi + b2 ≥ w⊤ 1 xi + b1 + 1 for i such that yi = 2 w⊤ 2 xi + b2 ≥ w⊤ 3 xi + b3 + 1 for i such that yi = 2 w⊤ 3 xi + b3 ≥ w⊤ 1 xi + b1 + 1 for i such that yi = 3 w⊤ 3 xi + b3 ≥ w⊤ 2 xi + b2 + 1 for i such that yi = 3 L = 1 2 (kw1k 2 + kw2k 2 + kw3k 2 ) −α ⊤ 12(X1(w1 − w2) + b1 − b2 − 1) −α ⊤ 13(X1(w1 − w3) + b1 − b3 − 1) −α ⊤ 21(X2(w2 − w1) + b2 − b1 − 1) −α ⊤ 23(X2(w2 − w3) + b2 − b3 − 1) −α ⊤ 31(X3(w3 − w1) + b3 − b1 − 1) −α ⊤ 32(X3(w3 − w2) + b3 − b2 − 1)Multi class SVM: KKT and dual form: The 3 classes case L = 1 2 kwk 2 − α ⊤(XMw + Ab − 1) with w =   w1 w2 w3   ∈ IR3d M = M ⊗ I =   I −I 0 I 0 −I −I I 0 0 I −I −I 0 I 0 −I I   a 6d × 3d matrix where I the identity matrix and X =   X1 0 0 0 0 0 0 X1 0 0 0 0 0 0 X2 0 0 0 0 0 0 X2 0 0 0 0 0 0 X3 0 0 0 0 0 0 X3   a 2n × 6d matrix with input data X =   X1 X2 X3   n × dMulti class SVM: KKT and dual form: The 3 classes case KKT Stationality conditions = ∇wL = w − M⊤X ⊤α ∇bL = A ⊤α The dual min α∈IR2n 1 2 α ⊤Gα − e ⊤α with Ab = 0 and 0 ≤ α With G = XMM⊤X ⊤ = X (M ⊗ I)(M ⊗ I) ⊤X ⊤ = X (MM⊤ ⊗ I)X ⊤ = (MM⊤ ⊗ I). × XX ⊤ = (MM⊤ ⊗ I). × 1I K 1I⊤ and M =   1 −1 0 1 0 −1 −1 1 0 0 1 −1 −1 0 1 0 −1 1  Multi class SVM and slack variables (2 variants) A slack for all (Vapnik & Blanz, Weston & Watkins 1998)    min wℓ,bℓ,ξ∈IRcn 1 2 Xc ℓ=1 kwℓk 2 + C Xn i=1 Xc ℓ=1,ℓ6=yi ξiℓ with w⊤ yi xi + byi − w⊤ ℓ xi − bℓ ≥ 1 − ξiℓ and ξiℓ ≥ 0 for i = 1, n; ℓ = 1, c; ℓ 6= yi The dual min α∈IR2n 1 2 α ⊤Gα − e ⊤α with Ab = 0 and 0 ≤ α ≤ C Max error, a slack per training data (Cramer and Singer, 2001)    min wℓ,bℓ,ξ∈IRn 1 2 Xc ℓ=1 kwℓk 2 + C Xn i=1 ξi with (wyi − wℓ) ⊤xi ≥ 1 − ξi for i = 1, n; ℓ = 1, c; ℓ 6= yi X i=1 and ξi ≥ 0 for i = 1, nMulti class SVM and Kernels    min f ∈H,α0,ξ∈IRcn 1 2 Xc ℓ=1 kfℓk 2 H + C Xn i=1 Xc ℓ=1,ℓ6=yi ξiℓ with fyi (xi) + byi − fℓ(xi) − bℓ ≥ 1 − ξiℓ Xn i=1 and ξiℓ ≥ 0 for i = 1, n; ℓ = 1, c; ℓ 6= yi The dual min α∈IR2n 1 2 α ⊤Gα − e ⊤α with Ab = 0 and 0 ≤ α≤ C where G is the multi class kernel matrixOther Multi class SVM Lee, Lin & Wahba, 2004    min f ∈H λ 2 Xc ℓ=1 kfℓk 2 H + 1 n Xn i=1 Xc ℓ=1,ℓ6=yi (fℓ(xi) + 1 c − 1 )+ with Xc ℓ=1 fℓ(x) = 0 ∀x Structured outputs = Cramer and Singer, 2001 MSVMpack : A Multi-Class Support Vector Machine Package Fabien Lauer & Yann GuermeurRoadmap 1 Multi Class SVM 3 different strategies for multi class SVM Multi Class SVM by decomposition Multi class SVM Coupling convex hulls 1.5 1.5 1.5 1.5 1.5 1.5 2.5 2.5 2.5 −0.5 0 0.5 1 1.5 0 0.5 1 1.5 2One more way to derivate SVM Minimizing the distance between the convex hulls    min α ku − vk 2 with u(x) = X {i|yi =1} αi(x ⊤ i x), v(x) = X {i|yi =−1} αi(x ⊤ i x) and X {i|yi =1} αi = 1, X {i|yi =−1} αi = 1, 0 ≤ αi i = 1, nThe multi class case    min α Xc ℓ=1 Xc ℓ ′=1 kuℓ − uℓ ′k 2 with uℓ(x) = X {i|yi =ℓ} αi,ℓ(x ⊤ i x), ℓ = 1, c and X {i|yi =ℓ} αi,ℓ = 1, 0 ≤ αi,ℓ i = 1, n; ℓ = 1, cBibliography Estimating probabilities ◮ Platt, J. (2000). Probabilistic outputs for support vector machines and comparison to regularized likelihood methods. In Advances in large margin classifiers. MIT Press. ◮ T. Lin, C.-J. Lin, R.C. Weng, A note on Platt’s probabilistic outputs for support vector machines, Mach. Learn. 68 (2007) 267–276 ◮ http://www.cs.cornell.edu/courses/cs678/2007sp/platt.pdf Multiclass SVM ◮ K.-B. Duan & S. Keerthi (2005). "Which Is the Best Multiclass SVM Method? An Empirical Study". ◮ T.-F. Wu, C.-J. Lin, R.C. Weng, Probability estimates for multi-class classification by pairwise coupling, JMLR. 5 (2004) 975–1005. ◮ K. Crammer & Y. Singer (2001). "On the Algorithmic Implementation of Multiclass Kernel-based Vector Machines". JMLR 2: 265–292. ◮ Lee, Y.; Lin, Y.; and Wahba, G. (2001). "Multicategory Support Vector Machines". Computing Science and Statistics 33. ◮ http://www.loria.fr/~guermeur/NN2008_M_SVM_YG.pdf ◮ http://jmlr.org/papers/volume12/lauer11a/lauer11a.pdf Stéphane Canu (INSA Rouen - LITIS) April 10, 2014 25 / 25 https://hal.inria.fr/cel-01082588v2/document Tutoriel Android - TP de prise en main Dima Rodriguez To cite this version: Dima Rodriguez. Tutoriel Android - TP de prise en main. Ecole d’ing´enieur. France. 2014, ´ pp.51. HAL Id: cel-01082588 https://hal.archives-ouvertes.fr/cel-01082588v2 Submitted on 26 Nov 2014 HAL is a multi-disciplinary open access archive for the deposit and dissemination of scientific research documents, whether they are published or not. The documents may come from teaching and research institutions in France or abroad, or from public or private research centers. L’archive ouverte pluridisciplinaire HAL, est destin´ee au d´epˆot et `a la diffusion de documents scientifiques de niveau recherche, publi´es ou non, ´emanant des ´etablissements d’enseignement et de recherche fran¸cais ou ´etrangers, des laboratoires publics ou priv´es.Tutoriel Android TM TP de prise en main Dima RodriguezPolytech’ Paris Sud Tutoriel AndroidTM Dima Rodriguez Novembre 2014 TP de prise en mainTable des matières Préambule 4 1 Installation de l’IDE 5 2 Configuration de l’IDE 6 Installation des paquets supplémentaires et des mises à jours . . . . . . 6 Configuration d’un émulateur . . . . . . . . . . . . . . . . . . . . . . . 6 3 Notre première application Android 10 Création d’un projet et d’une application “Hello World” . . . . . . . . . 10 Exécution de l’application . . . . . . . . . . . . . . . . . . . . . . . . . 11 Se repérer dans le projet . . . . . . . . . . . . . . . . . . . . . . . . . 14 Modification de l’interface utilisateur . . . . . . . . . . . . . . . . . . . 16 Répondre aux évènements . . . . . . . . . . . . . . . . . . . . . . . . . 21 Créer et lancer une autre activité . . . . . . . . . . . . . . . . . . . . . 22 Créer des animations . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Créer un View personnalisé pour gérer un jeu . . . . . . . . . . . . . . 32 Temporisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Rajouter un bouton sur la barre d’action . . . . . . . . . . . . . . . . . 40 Lancement d’une autre application . . . . . . . . . . . . . . . . . . . . 41 Changement de langue . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Annexes 46 Explication du code généré par défaut pour la classe Principale . . . . . 46 Cycle de vie d’une activité . . . . . . . . . . . . . . . . . . . . . . . . 49 2Table des figures 2.1 SDK Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2 Android Virtual Device Manager . . . . . . . . . . . . . . . . . . 8 2.3 Création d’un appareil virtuel . . . . . . . . . . . . . . . . . . . . 9 3.1 Création d’un projet . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.2 Créer une activité . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.3 Nouvelle activité . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.4 Exécution de l’application . . . . . . . . . . . . . . . . . . . . . . 13 3.5 Aperçu de l’interface Eclipse . . . . . . . . . . . . . . . . . . . 14 3.6 Hiérarchie de LinearLayout . . . . . . . . . . . . . . . . . . . . . 17 3.7 Premier test de l’application modifiée . . . . . . . . . . . . . . . . 20 3.8 Champ de saisie et bouton . . . . . . . . . . . . . . . . . . . . . 21 3.9 Création d’une nouvelle activité . . . . . . . . . . . . . . . . . . . 23 3.10 Nouveau xml pour définir une animation . . . . . . . . . . . . . . 28 3.11 Animation en LinearLayout . . . . . . . . . . . . . . . . . . . . . 30 3.12 Animation en RelativeLayout . . . . . . . . . . . . . . . . . . . . 31 3.13 Création de la classe MonViewPerso . . . . . . . . . . . . . . . . 33 3.14 Ajout d’un bouton pour lancer le jeu . . . . . . . . . . . . . . . . 36 3.15 Activité avec vue personnalisée . . . . . . . . . . . . . . . . . . . 39 3.16 Barre d’action . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.17 Cycle de vie d’une activité . . . . . . . . . . . . . . . . . . . . . 50 3Préambule Le système d’exploitation Android est actuellement l’OS le plus utilisé dans le monde faisant tourner des smartphones, tablettes, montres connectées, liseuses électroniques, télévisions interactives, et bien d’autres. C’est un système, open source qui utilise le noyau Linux. Il a été créée par Android, Inc. qui fut rachetée par Google en 2005. Le développement d’applications pour Android s’effectue en Java en utilisant des bibliothèques spécifiques. Le but de ce tutoriel est de vous familiariser avec l’esprit de développement Android et ses bibliothèques. Nous introduirons les concepts de bases de création d’application en mettant en œuvre quelques fonctionnalités simples. Ce tutoriel n’est en aucun cas exhaustive, le potentiel des applications Android est beaucoup plus ample, les exemples cités dans ce document ne devront pas brider votre imagination ni votre curiosité. Sur le site officiel pour les développeurs Android vous trouverez la documentation des classes, des tutoriels ainsi que les lignes directrices pour préparer une distribution Google Play. Un lexique à la fin de ce document définit quelques mot du vocabulaire Android utilisé dans ce tutoriel. 41 Installation de l’IDE Dans cette section nous allons décrire la procédure d’installation d’un environnement de développement Android. Attention : Il faut exécuter les étapes dans l’ordre cité ci-dessous. a. Téléchargez le JDK7 (Java Development Kit) que vous pouvez trouver sur le site d’Oracle 1 . b. Désinstallez des éventuelles versions antérieures du JDK c. Installez le nouveau JDK d. Téléchargez le paquet ADT (Android Developer Tools). Il contient le SDK (Software Development Kit) Android et une version d’Eclipse avec ADT intégré. e. Pour installer l’IDE, il faut juste placer le dossier téléchargé dans le répertoire où vous avez l’habitude d’installer vos programmes (ou directement sur votre partition principale) et le dé-zipper. Vous pouvez également lui changer de nom si vous souhaitez, mais veillez à ne pas mettre des espaces ou des accents quand vous le renommez. f. Dans le dossier dé-zippé vous trouverez un exécutable Eclipse que vous pouvez désormais lancer pour commencer la configuration de votre environnement. i Au moment de l’écriture de ce document, Eclipse est le seul IDE (Integrated Development Environment) officiellement supporté. Un nouvel environnement, Android Studio, est en cours de développement mais est encore en version bêta pas très stable. Si vous souhaitez utiliser une version d’Eclipse que vous avez déjà sur votre machine il faudrait prendre le SDK et un plugin ADT et configurer Eclipse pour son utilisation. 1. Ce tutoriel a été réalisé avec JDK7u60 52 Configuration de l’IDE Installation des paquets supplémentaires et des mises à jours a. Lancez Eclipse b. On commencera par s’assurer que l’environnement installé est à jour. Dans le menu Help sélectionnez Check for Updates et installez les mises à jour le cas échéant. c. Pour vérifier la version du SDK installé, allez dans le menu Window > Android SDK Manager et lancez le gestionnaire du SDK. Dans le gestionnaire (fig.2.1) vous verrez la version du SDK installé (avec les mises jour disponibles) et aussi la version de l’API (Application Programming Interface) installée et la version du OS pour laquelle elle vous permettra de développer. Installez les paquets proposés par défaut. i Si vous voulez développer pour des versions Android plus anciennes il faut installer les versions API correspondantes. Configuration d’un émulateur Un émulateur permet de reproduire le comportement d’un appareil réel d’une façon virtuelle. L’utilisation d’un émulateur nous évite d’avoir à charger à chaque fois l’application dans un appareil pour la tester. On pourra ainsi lancer l’application dans l’IDE et elle s’exécutera sur un appareil virtuel appelé Android Virtual Device AVD qui émule le comportement d’un téléphone, une tablette ou autre. Eclipse ne propose pas d’émulateur par défaut, avant de commencer à créer notre application il faut en configurer un. 6Tutoriel Android 7 Figure 2.1 – SDK Manager Dans cet exemple, il existe une mise à jour disponible pour le SDK. L’API installée est la version 20 qui permet un développement pour Android 4.4, mais il existe une API plus récente pour Android 5.0. Polytech’ Paris Sud Dima RodriguezTutoriel Android 8 Figure 2.2 – Android Virtual Device Manager Allez dans le menu Window > Android Virtual Device Manager, une fois le gestionnaire ouvert cliquez sur le bouton Create (fig. 2.2). Une fenêtre de configuration s’affiche (fig. 2.3a). On propose de configurer un émulateur Nexus One avec les paramètres indiqués (fig.2.3b). Notez qu’à la création de l’appareil sa résolution vous est signalée. Dans cet exemple l’appareil a une résolution 480x800 qui correspond à hdpi (high density dots per inch). Ceci est important à noter pour l’intégration d’images dans l’application. i Notez que pour certains émulateurs proposés le processeur n’est pas installé par défaut, pour pouvoir les créer il faut installer un processeur adapté dans le SDK Manager. Polytech’ Paris Sud Dima RodriguezTutoriel Android 9 (a) Fenêtre de création AVD (b) Création d’un appareil Nexus One Figure 2.3 – Création d’un appareil virtuel Polytech’ Paris Sud Dima Rodriguez3 Notre première application Android Création d’un projet et d’une application “Hello World” a. Dans le menu File > New, sélectionnez Android Application Project , et renseignez les informations comme dans la figure 3.1 Application name : c’est le nom qui va apparaitre dans la liste des applications sur l’appareil et dans le Play Store. Project name : c’est le nom utilisé par Eclipse (typiquement le même que celui de l’application). Package name : il est utilisé comme identifiant de l’application, il permet de considérer différentes versions d’une application comme étant une même application. Minimum required SDK : c’est la version Android la plus ancienne sur laquelle l’application peut tourner. Il faut éviter de remonter trop en arrière ça réduirait les fonctionnalités que vous pourriez donner à votre application. Target SDK : c’est la version pour laquelle l’application est développée et testée. Typiquement la dernière version API que vous avez installée. 1 Compile with : c’est la version d’API à utiliser pour la compilation. Typiquement la dernière version du SDK installée. Theme : c’est l’apparence par défaut qu’aura votre application. 1. Ce tutoriel a été réalisé avec la version 4.4.2 10Tutoriel Android 11 b. Cliquez sur Next et laissez les choix par défaut. Vous pouvez éventuellement modifier l’emplacement de votre projet en décochant Create Project in Workspace et parcourir le disque pour sélectionner un autre dossier. c. Cliquez sur Next. La fenêtre suivante vous propose de définir une icône pour votre application. Nous laisserons l’icône proposée par défaut. Vous pourrez ultérieurement créer votre propre icône pour vos applications. Remarquez que l’image doit être proposée avec différentes résolutions pour s’adapter aux différents appareils. d. Cliquez sur Next. Nous arrivons à la création d’une activité (un écran avec une interface graphique). Sélectionnez Blank Activity (fig. 3.2) et cliquez Next. e. Selon la version de l’ADT que vous avez, vous verrez soit la fenêtre de la figure 3.3a ou celle de la figure 3.3b. La dernière version impose l’utilisation de fragments. Chaque activité dispose d’un layout qui définit la façon dont les composants seront disposés sur l’écran. Une activité peut être divisée en portions (ou fragments) chacune ayant son propre layout. La notion de fragment a été introduite pour favoriser la ré-utilisabilité de morceaux d’activité (un fragment peut être définit une fois et réutilisé dans plusieurs activités). Renseignez les champs comme indiqué dans la figure. f. Cliquez sur Finish, le projet est crée. ! Si vous créez un fragment ce sera le fichier fragment_principale.xml que vous devriez modifier dans la suite du tutoriel sinon vous modi- fierez le fichier activite_principale.xml. Exécution de l’application Sur l’émulateur Appuyez sur le bouton d’exécution (fig.3.4 ) et sélectionnez Android Application dans la fenêtre qui s’affiche. L’émulateur se lance, ça peut prendre quelques minutes soyez patients. Rassurez-vous, vous n’aurez pas à le relancer à chaque fois que vous compilez votre projet, laissez-le ouvert et à chaque fois que vous compilez et relancez votre application, elle sera rechargée dans l’émulateur en cours. Polytech’ Paris Sud Dima RodriguezTutoriel Android 12 Figure 3.1 – Création d’un projet Figure 3.2 – Créer une activité Polytech’ Paris Sud Dima RodriguezTutoriel Android 13 (a) Création d’activité sans fragment (b) Création d’activité avec fragment Figure 3.3 – Nouvelle activité Figure 3.4 – Exécution de l’application Polytech’ Paris Sud Dima RodriguezTutoriel Android 14 Explorateur Palette des composants graphiques Navigateur des fichiers ouverts Liste des composants de l'activité Propritétés du composant selectionné Navigation entre vue graphique et xml Output Aperçu de l'activité Debug et Execution Figure 3.5 – Aperçu de l’interface Eclipse Sur un appareil réel Connectez l’appareil par câble USB à l’ordinateur et installez le pilote si nécessaire. Activez l’option de débogage USB sur votre appareil (en général sous Settings > Applications > Development). Lancez l’application depuis Eclipse comme précédemment. Eclipse charge l’application sur votre appareil et la lance. i Une fois que votre application est compilée, un fichier MonAppli.apk est créé dans le dossier bin de votre répertoire de travail. C’est l’exé- cutable de votre application. C’est ce fichier que vous devez déployer pour distribuer votre application. Le contenu de ce fichier peut être inspecté à l’aide de n’importe quel logiciel standard de compression/- décompression de fichiers. Se repérer dans le projet La figure 3.5 montre les principaux éléments de l’interface Eclipse. Tout projet Android doit respecter une hiérarchie bien précise qui permettra au compilateur de retrouver les différents éléments et ressources lors de la génération de l’application. Cette hiérarchie favorise la modularité des applications Android. A la création du projet, Eclipse crée automatiquement des dossiers pour contenir Polytech’ Paris Sud Dima RodriguezTutoriel Android 15 les fichiers de code Java, les fichiers XML, et les fichiers multimédias. L’explorateur de projet vous permettra de naviguer dans ces dossiers. Les dossiers que nous utiliserons le plus sont src et res. Le premier contient le code Java qui définit le comportement de l’application et le second comporte des sous dossiers où sont stockés les ressources qui définissent l’interface de l’application (l’apparence). i La séparation entre fonctionnalité et apparence est un point essentiel de la philosophie Android. Le code de la classe principale de l’application (Principale.java) est situé dans le sous dossier polytech.android.monappli de src. Vous trouverez en annexe une brève explication du code qui y est généré par défaut. C’est dans le dossier src que seront enregistrées toutes les classes que nous allons créer dans ce projet. Par ailleurs, tout ce qui touche à l’interface utilisateur sera intégré dans les sous dossiers de res, dont voici une brève description : layout regroupe les fichiers XML qui définissent la disposition des composants sur l’écran. Il contient déjà, dès la création du projet, le layout de l’activité principale que nous avons créée. drawable-**** contient tout élément qui peut être dessiné sur l’écran : images (en PNG de préférence), formes, animations, transitions, icône, etc.. Cinq dossiers drawable permettent aux développeurs de proposer des éléments graphiques pour tout genre d’appareil Android en fonction de sa résolution. En populant correctement ces dossiers on peut ainsi créer des applications avec une interface qui s’adapte à chaque résolution d’écran avec un seul fichier .apk. ldpi low-resolution dots per inch. Pour des images destinées à des écrans de basse résolution (~120dpi) mdpi pour des écrans de moyenne resolution (~160dpi) hdpi pour des écrans de haute résolution (~240dpi) xhdpi pour des écrans ayant une extra haute résolution (~320dpi) xxhdpi pour des écrans ayant une extra extra haute résolution (~480dpi). menu contient les fichiers XML définissant les menus Polytech’ Paris Sud Dima RodriguezTutoriel Android 16 values contient les fichiers XML qui définissent des valeurs constantes (des chaines de caractères, des dimensions, des couleurs, des styles etc.) Dans le dossier gen vous verrez du code java généré automatiquement par Eclipse. Nous nous intéresserons particulièrement au fichier R.java dans le package polytech.android.monappli. Ce fichier définit une classe R dans laquelle sont définis les identifiants des ressources de l’application. A chaque fois que vous rajouterez une ressource à votre application un identifiant sera généré automatiquement dans cette classe vous permettant par la suite de pouvoir le référencer pour l’utiliser dans votre code 2 . Vous trouverez également sur la racine du projet un fichier nommé AndroidManifest.xml. Ce fichier est obligatoire dans tout projet Android, et doit toujours avoir ce même nom. Ce fichier permet au système de reconnaitre l’application. Modification de l’interface utilisateur Pour l’instant notre application ne fait qu’afficher un message sur l’écran, dans cette section nous allons modifier l’interface pour y mettre un champ de saisie et un bouton. Une interface utilisateur est en général constituée de ce qu’on appelle des ViewGroups qui contiennent des objets de type View ainsi que d’autres ViewGroups. Un View est un composant, tel un bouton ou un champ de texte, et les ViewGroups sont des conteneurs qui définissent une disposition des composants (Views) qui y sont placés. ViewGroup définit la classe de base des différents layouts. Comprendre le layout La disposition de notre interface est définie dans le fichier fragment_principale.xml situé dans le dossier layout de res. (ou bien le fichier activite_principale.xml si vous n’avez pas définit de fragment à la création de votre projet). Ouvrez ce fichier. 2. A l’intérieur de classe R sont définies plusieurs classes, dites nichées, telles que string, drawable, layout, menu, id, etc. Une classe nichée est membre de la classe qui la contient. On a recours à ce genre de classe en général lorsqu’on veut définir une classe qui n’est utilisée qu’à l’intérieur d’une autre classe. Si on la déclare privée elle ne sera visible qu’a l’intérieur de la classe qui l’a définie. Par ailleurs cette dernière peut également accéder aux attributs privés de la classe nichée. C’est une façon d’améliorer la lisibilité du code en regroupant les fonctionnalités qui vont ensemble. Dans notre cas toutes les classes nichées dans R sont publiques, donc accessibles depuis l’extérieur, mais comme elles sont membres de la classe R, pour y accéder, il faut passer par R. On utilisera des notations telles que R.string puisque ces classes sont statiques. Polytech’ Paris Sud Dima RodriguezTutoriel Android 17 La première balise que vous retrouverez est qui définit le type du conteneur qui compose l’interface, il impose la façon dont les composants seront disposés. Plusieurs types de conteneurs existent, les plus communs sont RelativeLayout, LinearLayout, TableLayout, GridView, ListView. L’utilisation d’un RelativeLayout, par exemple, implique que les composants seront placés selon des positions relatives les uns par rapport aux autres. Un LinearLayout implique une disposition linéaire verticale ou horizontale, un GridView permet la disposition des éléments selon une grille qui peut défiler, etc. A l’intérieur de la balise vous verrez un ensemble d’attributs définis selon le format plateforme:caractéristique=”valeur” Par exemple le premier attribut xmlns:android précise où sont définis les balises Android utilisées dans ce fichier. La balise , fille de la balise , définit un composant texte qui sera placé sur le layout. En effet, c’est sur ce composant là qu’on écrit le “Hello World” qu’affiche notre application. Cette chaine de caractère est définie par l’attribut android:text. La notation "@string/hello_world" fait référence à une chaine de caractère qui s’appelle hello_world et qui est définie dans le fichier strings.xml (dans le dossier values). Modifier le type de layout Nous allons maintenant modifier le type du layout pour le transformer en LinearLayout. La figure 3.6 trace la dérivation de la classe LinearLayout. Nous rajouterons ensuite nos composants sur ce layout dans une disposition linéaire. Figure 3.6 – Hiérarchie de LinearLayout Les layouts sont des ViewGroup qui sont eux mêmes des View [1] Dans le fichier fragment_principale.xml Polytech’ Paris Sud Dima RodriguezTutoriel Android 18 . supprimez l’élément . remplacez l’élément par . rajoutez l’attribut android:orientation et mettre sa valeur à “horizontal” Le code dans le fichier devient ainsi Rajouter d’un champ de saisie . Rajoutez un élément dans le tel que Nous avons ainsi placé un champ de saisie avec les attributs suivants : android :id permet de donner un identifiant unique à ce View qu’on utilisera pour référencer cet objet à l’intérieur de notre code. Le symbol @ est nécessaire pour faire référence à un objet ressource à partir d’un fichier XML. id est le type de ressource et chp_saisie est le nom qu’on donne à notre ressource. Le symbole + est utilisé pour définir un ID pour la première fois. Il indique aux outils du SDK qu’il faudrait générer un ID dans le fichier R.java pour référencer cet objet. Un attribut public static final chp_saisie sera défini dans la classe id.Le symbole + ne doit être utilisé qu’une seule fois au moment où on déclare la ressource pour la première fois. Par la suite si on veut faire référence à cet élément, à partir d’un XML, il suffira d’écrire @id/chp_saisie. Polytech’ Paris Sud Dima RodriguezTutoriel Android 19 android :layout_width permet de spécifier la largeur de élément. “wrap_content” signifie que le View doit être aussi large que nécessaire pour s’adapter à la taille de son contenu. Si en revanche on précise “match_parent” comme on l’avait fait pour le LinearLayout, dans ce cas le EditText occuperait toute la largeur de l’écran puisque sa largeur sera celle de son parent c-à-d le LinearLayout android :layout_height idem que pour le layout_width mais pour la hauteur android :hint précise le texte par défaut à afficher dans le champ de saisie quand il est vide. Nous aurions pu préciser directement la chaine de caractère ici codée en dur, mais on préfère utiliser plutôt une ressource qu’on définira dans strings.xml . Noter que l’utilisation de + ici n’est pas nécessaire parce qu’on fait référence à une ressource concrète (qu’on définira dans le fichier xml) et non pas à un identifiant que le SDK doit créer dans la classe R. i Privilégiez toujours l’utilisation des ressources strings plutôt que des chaines de caractères codées en dur. Cela permet de regrouper tout le texte de votre interface dans un seul endroit pour simplifier la recherche et la mise à jour du texte, de plus ceci est indispensable pour que votre application puisse être multilingue. l’IDE vous affichera un avertissement en cas de non respect de cette recommandation. Après la modification du code que nous venons de faire, quand vous sauvegarderez le fichier, un message d’erreur vous indiquera que l’identifiant str_chp_saisie n’est pas connu. Nous allons donc le définir. . Ouvrez le fichier strings.xml qui se trouve dans res>values . Rajoutez une nouvelle string nommée str_chp_saisie et dont la valeur est “Entrer un texte” . Vous pouvez éventuellement supprimer la ligne qui définit “hello_world” Votre fichier strings.xml ressemblera donc à ceci MonAppli Entrer un texte Polytech’ Paris Sud Dima RodriguezTutoriel Android 20 Figure 3.7 – Premier test de l’application modifiée Settings . Une fois que vos modifications sont sauvegardées vous remarquerez la création de deux attributs dans le fichier R.java. • Un attribut constant nommé chp_saisie dans la classe id. C’est un numéro unique qui identifie l’élément EditText que nous venons de rajouter. Cet identifiant nous permettra de manipuler l’élément à partir du code. • Un attribut constant nommé str_chp_saisie dans la classe string. Il fait référence à la chaine de caractère et nous permettra de l’utiliser dans le code. Lancez l’application, l’émulateur affichera un écran tel que dans la figure 3.7. Tapez un texte et remarquez comment la taille du champ de saisie s’adapte à la longueur du texte. Polytech’ Paris Sud Dima RodriguezTutoriel Android 21 (a) Disposition par défaut (b) Le EditText a un poids de 1 Figure 3.8 – Champ de saisie et bouton Rajouter un bouton . Dans le fichier strings.xml rajoutez une chaine de caractère qui s’appelle "btn_envoyer" et qui vaut Envoi. . Dans le fichier du layout rajoutez un élément