{"id":294,"date":"2021-08-27T15:28:59","date_gmt":"2021-08-27T15:28:59","guid":{"rendered":"https:\/\/www.louismarchand.me\/?page_id=294"},"modified":"2022-08-30T15:05:54","modified_gmt":"2022-08-30T15:05:54","slug":"android-les-layouts","status":"publish","type":"page","link":"https:\/\/www.louismarchand.me\/index.php\/android-les-layouts\/","title":{"rendered":"Les \u00ab\u00a0Layouts\u00a0\u00bb Android"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>Le syst\u00e8me Android utilise une m\u00e9canique MVC dont les vues sont enti\u00e8rement g\u00e9n\u00e9r\u00e9es par des librairies et des fichiers de configuration. L&rsquo;id\u00e9e est d&rsquo;utiliser le plus possible les fichiers de configuration pour g\u00e9n\u00e9rer l&rsquo;interface graphique et d&rsquo;utiliser le moins possible la programmation pour cette t\u00e2che.<\/p>\n<h2>Les \u00ab\u00a0layouts\u00a0\u00bb<\/h2>\n<p>Android utilise un syst\u00e8me de positionnement Android qu&rsquo;on appelle \u00ab\u00a0Layout\u00a0\u00bb. Il s&rsquo;agit d&rsquo;une ressource qu&rsquo;on peut utiliser et modifier \u00e0 l&rsquo;aide de la programmation d&rsquo;Activit\u00e9. Ces \u00ab\u00a0layouts\u00a0\u00bb sont configur\u00e9s dans un fichier XML, et sont li\u00e9s aux activit\u00e9s par la m\u00e9thode \u00ab\u00a0setContentView\u00a0\u00bb.<\/p>\n<p>Les \u00ab\u00a0layouts\u00a0\u00bb sont organis\u00e9s en arbre dans lequel les feuilles sont des vues et les autres noeuds sont des groupes de vues.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10301 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/arbre_vues.png\" alt=\"\" width=\"603\" height=\"583\" \/><\/p>\n<p>Les vues sont les \u00ab\u00a0widget\u00a0\u00bb graphiques comme des boutons ou des boites de texte. Les groupes de vues sont des \u00ab\u00a0layouts\u00a0\u00bb en soi. Donc, les \u00ab\u00a0layouts\u00a0\u00bb contiennent d&rsquo;autres \u00ab\u00a0layouts\u00a0\u00bb et des \u00ab\u00a0widgets\u00a0\u00bb.<\/p>\n<p>L&rsquo;\u00e9diteur Android Studio permet de modifier les \u00ab\u00a0layouts\u00a0\u00bb de mani\u00e8re graphique ou en \u00e9ditant directement la configuration XML. La version graphique peut \u00eatre plus facile, mais il est important de consid\u00e9rer que cette version n&rsquo;est pas particuli\u00e8rement fiable. L&rsquo;affichage tel que visible dans Android Studio ne correspond pas n\u00e9cessairement \u00e0 l&rsquo;affichage qui sera visible sur un appareil Android. L&rsquo;\u00e9dition XML peut sembler plus difficile \u00e0 premi\u00e8re vue, mais donne g\u00e9n\u00e9ralement un r\u00e9sultat plus fiable une fois sur l&rsquo;appareil Android.<\/p>\n<p>Voici le visuel graphique:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10304\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/layout_desing.png\" alt=\"\" width=\"1205\" height=\"699\" \/><\/p>\n<p>Voici le visuel d&rsquo;\u00e9dition de configuration:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10303\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/layout_code.png\" alt=\"\" width=\"1205\" height=\"699\" \/><\/p>\n<p>Et voici un affichage \u00ab\u00a0split\u00a0\u00bb:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10305\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/layout_split.png\" alt=\"\" width=\"1205\" height=\"699\" \/><\/p>\n<p>Cet affichage permet de voir graphiquement les modifications effectu\u00e9es dans le code XML. La principale probl\u00e9matique de ce type d&rsquo;affichage est l&rsquo;espace n\u00e9cessaire pour \u00eatre \u00e0 l&rsquo;aise.<\/p>\n<h2>Les groupes de vues<\/h2>\n<p>Il existe une grande quantit\u00e9 de groupe de vues (\u00ab\u00a0layouts\u00a0\u00bb). Je ne ferai pas le tour de toutes ces classes et si vous voulez en savoir plus, je vous recommande d&rsquo;aller voir la documentation <a href=\"https:\/\/developer.android.com\/reference\/android\/view\/ViewGroup\">ici<\/a>. Les \u00ab\u00a0layouts\u00a0\u00bb pr\u00e9sent\u00e9s ici sont les plus g\u00e9n\u00e9raux et permettent de faire une grande majorit\u00e9 des mises en pages standards.<\/p>\n<h3>Les \u00ab\u00a0layouts\u00a0\u00bb lin\u00e9aires<\/h3>\n<p>Les \u00ab\u00a0layouts\u00a0\u00bb lin\u00e9aires sont une mani\u00e8re standard, rapide et adaptative de faire des interfaces mobiles. Il existe deux (2) types de \u00ab\u00a0layouts\u00a0\u00bb lin\u00e9aires: les \u00ab\u00a0layouts\u00a0\u00bb lin\u00e9aires verticaux et les \u00ab\u00a0layouts\u00a0\u00bb lin\u00e9aires horizontaux. Par exemple, voici une configuration de \u00ab\u00a0layout\u00a0\u00bb lin\u00e9aire horizontal:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cp\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;<\/span>\r\n<span class=\"nt\">&lt;LinearLayout<\/span> <span class=\"na\">xmlns:android=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res\/android\"<\/span>\r\n    <span class=\"na\">xmlns:app=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res-auto\"<\/span>\r\n    <span class=\"na\">xmlns:tools=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/tools\"<\/span>\r\n    <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">android:orientation=<\/span><span class=\"s\">\"horizontal\"<\/span>\r\n    <span class=\"na\">tools:context=<\/span><span class=\"s\">\".MainActivity\"<\/span><span class=\"nt\">&gt;<\/span>\r\n    <span class=\"nt\">&lt;Button<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/button1\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n        <span class=\"na\">android:text=<\/span><span class=\"s\">\"Button\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;Button<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/button2\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n        <span class=\"na\">android:text=<\/span><span class=\"s\">\"Button\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;Button<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/button3\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n        <span class=\"na\">android:text=<\/span><span class=\"s\">\"Button\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;Button<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/button4\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n        <span class=\"na\">android:text=<\/span><span class=\"s\">\"Button\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n<span class=\"nt\">&lt;\/LinearLayout&gt;<\/span>\r\n<\/pre>\n<\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10313\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/horizontal_linear_linear.png\" alt=\"\" width=\"388\" height=\"685\" \/><\/p>\n<p>Et voici un exemple de \u00ab\u00a0layout\u00a0\u00bb lin\u00e9aire vertical:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cp\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;<\/span>\r\n<span class=\"nt\">&lt;LinearLayout<\/span> <span class=\"na\">xmlns:android=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res\/android\"<\/span>\r\n    <span class=\"na\">xmlns:app=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res-auto\"<\/span>\r\n    <span class=\"na\">xmlns:tools=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/tools\"<\/span>\r\n    <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">android:orientation=<\/span><span class=\"s\">\"vertical\"<\/span>\r\n    <span class=\"na\">tools:context=<\/span><span class=\"s\">\".MainActivity\"<\/span><span class=\"nt\">&gt;<\/span>\r\n    <span class=\"nt\">&lt;Button<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/button1\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n        <span class=\"na\">android:text=<\/span><span class=\"s\">\"Button\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;Button<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/button2\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n        <span class=\"na\">android:text=<\/span><span class=\"s\">\"Button\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;Button<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/button3\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n        <span class=\"na\">android:text=<\/span><span class=\"s\">\"Button\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;Button<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/button4\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n        <span class=\"na\">android:text=<\/span><span class=\"s\">\"Button\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n<span class=\"nt\">&lt;\/LinearLayout&gt;<\/span>\r\n<\/pre>\n<\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10314\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/vertical_linear_linear.png\" alt=\"\" width=\"385\" height=\"683\" \/><\/p>\n<p>Il est \u00e9galement possible d&#8217;emboiter des \u00ab\u00a0layouts\u00a0\u00bb dans d&rsquo;autres \u00ab\u00a0layouts\u00a0\u00bb. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cp\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;<\/span>\r\n<span class=\"nt\">&lt;LinearLayout<\/span> <span class=\"na\">xmlns:android=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res\/android\"<\/span>\r\n    <span class=\"na\">xmlns:app=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res-auto\"<\/span>\r\n    <span class=\"na\">xmlns:tools=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/tools\"<\/span>\r\n    <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">android:orientation=<\/span><span class=\"s\">\"vertical\"<\/span>\r\n    <span class=\"na\">tools:context=<\/span><span class=\"s\">\".MainActivity\"<\/span><span class=\"nt\">&gt;<\/span>\r\n    <span class=\"nt\">&lt;LinearLayout<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n        <span class=\"na\">android:orientation=<\/span><span class=\"s\">\"horizontal\"<\/span><span class=\"nt\">&gt;<\/span>\r\n        <span class=\"nt\">&lt;Button<\/span>\r\n            <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/button1\"<\/span>\r\n            <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n            <span class=\"na\">android:text=<\/span><span class=\"s\">\"Button1\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;Button<\/span>\r\n            <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/button2\"<\/span>\r\n            <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n            <span class=\"na\">android:text=<\/span><span class=\"s\">\"Button2\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/LinearLayout&gt;<\/span>\r\n    <span class=\"nt\">&lt;Button<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/button3\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n        <span class=\"na\">android:text=<\/span><span class=\"s\">\"Button3\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;LinearLayout<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n        <span class=\"na\">android:orientation=<\/span><span class=\"s\">\"horizontal\"<\/span><span class=\"nt\">&gt;<\/span>\r\n        <span class=\"nt\">&lt;Button<\/span>\r\n            <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/button4\"<\/span>\r\n            <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n            <span class=\"na\">android:text=<\/span><span class=\"s\">\"Button4\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;LinearLayout<\/span>\r\n            <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n            <span class=\"na\">android:orientation=<\/span><span class=\"s\">\"vertical\"<\/span><span class=\"nt\">&gt;<\/span>\r\n            <span class=\"nt\">&lt;Button<\/span>\r\n                <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/button5\"<\/span>\r\n                <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n                <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n                <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n                <span class=\"na\">android:text=<\/span><span class=\"s\">\"Button5\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n            <span class=\"nt\">&lt;Button<\/span>\r\n                <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/button6\"<\/span>\r\n                <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n                <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n                <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n                <span class=\"na\">android:text=<\/span><span class=\"s\">\"Button6\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;\/LinearLayout&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/LinearLayout&gt;<\/span>\r\n<span class=\"nt\">&lt;\/LinearLayout&gt;<\/span>\r\n<\/pre>\n<\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10316\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/multiple_linear_layout.png\" alt=\"\" width=\"403\" height=\"715\" \/><\/p>\n<h3>Les \u00ab\u00a0layouts\u00a0\u00bb de contraintes<\/h3>\n<p>Les \u00ab\u00a0layouts\u00a0\u00bb de contraintes sont des \u00ab\u00a0layouts\u00a0\u00bb qui sont beaucoup plus puissant que les \u00ab\u00a0layouts\u00a0\u00bb lin\u00e9aires, mais qui sont \u00e9galement beaucoup plus complexe \u00e0 monter. Ce type de \u00ab\u00a0layouts\u00a0\u00bb est bas\u00e9 sur la position relative des objets par rapport aux autres. Ce type de \u00ab\u00a0layout\u00a0\u00bb remplace les \u00ab\u00a0layouts\u00a0\u00bb relatifs qui \u00e9tait utilis\u00e9s dans les pr\u00e9c\u00e9dentes versions d&rsquo;Android. \u00c9galement, les \u00ab\u00a0layouts\u00a0\u00bb de contraintes peuvent permettre des d\u00e9placements et animations d&rsquo;objets.<\/p>\n<p>Voici ce qui a \u00e0 conna\u00eetre dans l&rsquo;utilisation des \u00ab\u00a0layouts\u00a0\u00bb de contrainte:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Afin que l&rsquo;objet apparaisse bel et bien \u00e0 l&rsquo;endroit pr\u00e9cis\u00e9 une fois ex\u00e9cut\u00e9 sur l&rsquo;appareil mobile, il faut s&rsquo;assurer que chaque objet a une contrainte verticale et une contrainte horizontale;<\/li>\n<li>Les contraintes peuvent \u00eatre par rapport aux autres objets graphiques, ou bien par rapport au bord de l&rsquo;\u00e9cran;<\/li>\n<li>Afin de cr\u00e9er une contrainte, on peut utiliser les poign\u00e9es attach\u00e9es \u00e0 chaque objet dans l&rsquo;\u00e9diteur visuel de \u00ab\u00a0layout\u00a0\u00bb.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10347\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/layout_contraints_handles.png\" alt=\"\" width=\"659\" height=\"386\" \/><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>La contrainte peut \u00eatre contr\u00f4l\u00e9e plus pr\u00e9cis\u00e9ment avec l&rsquo;outil de contrainte:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10348\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/layout_outil_contraintes.png\" alt=\"\" width=\"220\" height=\"162\" \/><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Vous pouvez \u00e9galement directement sp\u00e9cifier les contraintes dans la configuration XML en utilisant \u00ab\u00a0android:layout_marginTop\u00a0\u00bb, \u00ab\u00a0android:layout_marginBotton\u00a0\u00bb, \u00ab\u00a0android:layout_marginLeft\u00a0\u00bb et \u00ab\u00a0android:layout_marginRight\u00a0\u00bb.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"highlight\">\n<pre><span class=\"cp\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;<\/span>\r\n<span class=\"nt\">&lt;androidx.constraintlayout.widget.ConstraintLayout<\/span>\r\n    <span class=\"na\">xmlns:android=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res\/android\"<\/span>\r\n    <span class=\"na\">xmlns:app=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res-auto\"<\/span>\r\n    <span class=\"na\">xmlns:tools=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/tools\"<\/span>\r\n    <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">tools:context=<\/span><span class=\"s\">\".MainActivity\"<\/span><span class=\"nt\">&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;Button<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/button\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"88dp\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">android:layout_marginStart=<\/span><span class=\"s\">\"160dp\"<\/span>\r\n        <span class=\"na\">android:layout_marginLeft=<\/span><span class=\"s\">\"160dp\"<\/span>\r\n        <span class=\"na\">android:layout_marginBottom=<\/span><span class=\"s\">\"328dp\"<\/span>\r\n        <span class=\"na\">android:text=<\/span><span class=\"s\">\"Button\"<\/span>\r\n        <span class=\"na\">app:layout_constraintBottom_toBottomOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintStart_toStartOf=<\/span><span class=\"s\">\"parent\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n<span class=\"nt\">&lt;\/androidx.constraintlayout.widget.ConstraintLayout&gt;<\/span>\r\n<\/pre>\n<\/div>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Il y a trois types de contraintes possibles:\n<ul>\n<li>La contrainte fixe permet de sp\u00e9cifier pr\u00e9cis\u00e9ment la distance entre 2 objets. Repr\u00e9sent\u00e9 par le symbole: <img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-10350 alignnone\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/layout_constraint_fixed.png\" alt=\"\" width=\"25\" height=\"16\" \/> .<\/li>\n<li>La contrainte d\u2019emballage (\u00ab\u00a0wrap\u00a0\u00bb) permet de s&rsquo;adapter afin que le contenu d&rsquo;un objet soit enti\u00e8rement affich\u00e9. Repr\u00e9sent\u00e9 par le symbole <img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-10352 alignnone\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/layout_constraint_wrap.png\" alt=\"\" width=\"23\" height=\"16\" \/> .<\/li>\n<li>La contrainte d&rsquo;\u00e9tendue (\u00ab\u00a0match\u00a0\u00bb) permet de prendre le maximum d&rsquo;espace possible dans l&rsquo;espace disponible. Repr\u00e9sent\u00e9 par le symbole <img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-10351 alignnone\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/layout_constraint_match.png\" alt=\"\" width=\"24\" height=\"15\" \/> .<\/li>\n<\/ul>\n<\/li>\n<li>On utilise g\u00e9n\u00e9ralement les contraintes afin de cr\u00e9er des chaines d&rsquo;objets (vertical ou horizontal). Voici les types de chaines qu&rsquo;on peut cr\u00e9er avec le syst\u00e8me de contrainte:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10354\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/layout_constraint_chain.png\" alt=\"\" width=\"502\" height=\"362\" \/><\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ol>\n<li>Chaine \u00e9tendue (\u00ab\u00a0Spread chain\u00a0\u00bb): les objets s&rsquo;\u00e9tendent \u00e9galement sur toute la surface disponible.<\/li>\n<li>Chaine \u00e9tendue \u00e0 l&rsquo;int\u00e9rieur (\u00ab\u00a0Spread inside chain\u00a0\u00bb): Les objets sur les bords sont fixes, mais ceux \u00e0 l&rsquo;int\u00e9rieur s&rsquo;\u00e9tendent \u00e9galement.<\/li>\n<li>Chaine avec poids (Weighted): Chaine dont les espaces entre les sous-chaines \u00e9tendues ou \u00e9tendues \u00e0 l&rsquo;int\u00e9rieur sont remplis d&rsquo;objets interm\u00e9diaires. Ces objets peuvent avoir un poids diff\u00e9rent qui fait en sorte de s&rsquo;\u00e9tendre de mani\u00e8re plus ou moins importante en fonction de ce poids.\n<ol>\n<li>\u00c0 noter: pour \u00e9tablir un poids diff\u00e9rent entre les objets, on peut utiliser l&rsquo;attribut \u00ab\u00a0layout_constraintHorizontal_weight\u00a0\u00bb et \u00ab\u00a0layout_constraintVertical_weight\u00a0\u00bb.<\/li>\n<\/ol>\n<\/li>\n<li>Cha\u00eene en paquet (\u00ab\u00a0Packed chain\u00a0\u00bb): Les objets sont plac\u00e9s en paquet d&rsquo;objets.<\/li>\n<\/ol>\n<\/li>\n<li>Certains outils peuvent \u00eatre tr\u00e8s utiles dans l&rsquo;\u00e9diteur visuel en utilisant le bouton de droit de la souris sur un ou plusieurs objets s\u00e9lectionn\u00e9s\n<ul>\n<li>Effacer les contraintes;<\/li>\n<li>Aligner des objets;<\/li>\n<li>Cr\u00e9er des chaines;<\/li>\n<li>etc.<\/li>\n<\/ul>\n<\/li>\n<li>Il est recommand\u00e9 d&rsquo;exp\u00e9rimenter afin de savoir tout ce que ce type de \u00ab\u00a0layout\u00a0\u00bb permet de faire.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h2>La programmation<\/h2>\n<p>Malgr\u00e9 que la majorit\u00e9 du travail de cr\u00e9ation graphique Android repose dans l&rsquo;utilisation des outils de \u00ab\u00a0layout\u00a0\u00bb d&rsquo;Android Studio; il est important d&rsquo;\u00eatre capable d&rsquo;utiliser les vues cr\u00e9\u00e9es dans le code de l&rsquo;activit\u00e9. Voici donc ce que vous devez savoir pour utiliser les vues de vos \u00ab\u00a0layouts\u00a0\u00bb dans la programmation Java de vos activit\u00e9s Android.<\/p>\n<h3>Acc\u00e9der \u00e0 une vue<\/h3>\n<p>Pour acc\u00e9der \u00e0 une vue d&rsquo;un \u00ab\u00a0layout\u00a0\u00bb, il faut utiliser la m\u00e9thode d&rsquo;activit\u00e9 \u00ab\u00a0findViewById\u00a0\u00bb. Cette m\u00e9thode prend un identificateur num\u00e9rique de vue (ou ID) et retourne la vue en question. Pour avoir acc\u00e8s au ID de la vue, on utilise \u00ab\u00a0R.id\u00a0\u00bb. Par exemple, supposons que j&rsquo;ai cr\u00e9\u00e9 un TextView dans mon \u00ab\u00a0layout\u00a0\u00bb identifi\u00e9 par \u00ab\u00a0texte_message\u00a0\u00bb. Voici le code pour avoir acc\u00e8s \u00e0 la vue:<\/p>\n<pre>TextView lTexteMessage = findViewById(R.id.texte_message);<\/pre>\n<p>Une fois qu&rsquo;on a l&rsquo;objet Vue en Java, on peut utiliser les getters et les setters de la classe afin d&rsquo;avoir acc\u00e8s ou de modifier les attributs de cet objet:<\/p>\n<pre>lTexteMessage.setText(\"Salut tout le monde\");<\/pre>\n<h3>Les \u00e9v\u00e9nements des vues<\/h3>\n<p>Certaines vues doivent envoyer des \u00e9v\u00e9nements au code Java (par exemple, lorsqu&rsquo;on clique sur un bouton). Les vues doivent \u00eatre assign\u00e9es \u00e0 une m\u00e9thode de l&rsquo;activit\u00e9 afin de pouvoir \u00eatre utilis\u00e9es. En Android, toutes les m\u00e9thodes d&rsquo;\u00e9v\u00e9nements de vue doivent avoir cette signature:<\/p>\n<pre>public void monEvenement(View vue)<\/pre>\n<p>Voici un exemple. Dans cet exemple, l&rsquo;utilisateur doit entrer son nom dans une boite texte (EditText) identifi\u00e9e par \u00ab\u00a0entree_texte_nom\u00a0\u00bb et appuyer sur un bouton. Le bouton est associ\u00e9 \u00e0 l&rsquo;\u00e9v\u00e9nement Java \u00ab\u00a0boutonAppuyezClique\u00a0\u00bb. Ensuite, le message \u00ab\u00a0Bonjour LeNomEntr\u00e9e\u00a0\u00bb sera affich\u00e9 dans la vue de texte (TextView) idientifi\u00e9 \u00ab\u00a0texte_message\u00a0\u00bb. Noter que la chaine \u00ab\u00a0Bonjour \u00a0\u00bb est plac\u00e9e dans la ressource des constants textes \u00ab\u00a0strings.xml\u00a0\u00bb avec l&rsquo;identificateur: \u00ab\u00a0message\u00a0\u00bb. Voici l&rsquo;\u00e9v\u00e9nement Java du bouton:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">boutonAppuyezClique<\/span><span class=\"p\">(<\/span><span class=\"n\">View<\/span> <span class=\"n\">vue<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">TextView<\/span> <span class=\"n\">lTexteMessage<\/span> <span class=\"o\">=<\/span> <span class=\"n\">findViewById<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">id<\/span><span class=\"p\">.<\/span><span class=\"na\">texte_message<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">CharSequence<\/span> <span class=\"n\">lMessage<\/span> <span class=\"o\">=<\/span> <span class=\"n\">getString<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">string<\/span><span class=\"p\">.<\/span><span class=\"na\">message<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">EditText<\/span> <span class=\"n\">lEntreeNom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">findViewById<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">id<\/span><span class=\"p\">.<\/span><span class=\"na\">entree_texte_nom<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">CharSequence<\/span> <span class=\"n\">lNom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lEntreeNom<\/span><span class=\"p\">.<\/span><span class=\"na\">getText<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"n\">lTexteMessage<\/span><span class=\"p\">.<\/span><span class=\"na\">setText<\/span><span class=\"p\">(<\/span><span class=\"n\">lMessage<\/span><span class=\"p\">.<\/span><span class=\"na\">toString<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lNom<\/span><span class=\"p\">.<\/span><span class=\"na\">toString<\/span><span class=\"p\">());<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Voici les fichiers de ressources XML qui pourraient vous servir \u00e0 tester cet exemple:<\/p>\n<p>Le fichier \u00ab\u00a0strings.xml\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"nt\">&lt;resources&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"app_name\"<\/span><span class=\"nt\">&gt;<\/span>Mon Application<span class=\"nt\">&lt;\/string&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"bouton_texte\"<\/span><span class=\"nt\">&gt;<\/span>Appuyez<span class=\"nt\">&lt;\/string&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"message\"<\/span><span class=\"nt\">&gt;<\/span>Bonjour\\u0020<span class=\"nt\">&lt;\/string&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"label_nom\"<\/span><span class=\"nt\">&gt;<\/span>Nom:<span class=\"nt\">&lt;\/string&gt;<\/span>\r\n<span class=\"nt\">&lt;\/resources&gt;<\/span>\r\n<\/pre>\n<\/div>\n<p>Notez que le \u00ab\u00a0\\u0020\u00a0\u00bb repr\u00e9sente le code Unicode pour un espace. C&rsquo;est la seule fa\u00e7on de forcer une constante \u00e0 d\u00e9buter ou terminer une chaine par un (ou plusieurs) espace. \u00c9galement, si vous d\u00e9sirez mettre plusieurs espaces cons\u00e9cutifs ou une tabulation dans une constante String, vous devrez utiliser des codes Unicodes similaires.<\/p>\n<p>Le fichier de \u00ab\u00a0layout\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cp\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;<\/span>\r\n<span class=\"nt\">&lt;androidx.constraintlayout.widget.ConstraintLayout<\/span> <span class=\"na\">xmlns:android=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res\/android\"<\/span>\r\n    <span class=\"na\">xmlns:app=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res-auto\"<\/span>\r\n    <span class=\"na\">xmlns:tools=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/tools\"<\/span>\r\n    <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">tools:context=<\/span><span class=\"s\">\".MainActivity\"<\/span><span class=\"nt\">&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;Button<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/bouton_appuyez\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">android:onClick=<\/span><span class=\"s\">\"boutonAppuyezClique\"<\/span>\r\n        <span class=\"na\">android:text=<\/span><span class=\"s\">\"@string\/bouton_texte\"<\/span>\r\n        <span class=\"na\">app:layout_constraintBottom_toTopOf=<\/span><span class=\"s\">\"@+id\/texte_message\"<\/span>\r\n        <span class=\"na\">app:layout_constraintEnd_toEndOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintHorizontal_bias=<\/span><span class=\"s\">\"0.5\"<\/span>\r\n        <span class=\"na\">app:layout_constraintStart_toStartOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintTop_toBottomOf=<\/span><span class=\"s\">\"@+id\/label_nom\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;TextView<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/label_nom\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">android:text=<\/span><span class=\"s\">\"@string\/label_nom\"<\/span>\r\n        <span class=\"na\">app:layout_constraintBottom_toTopOf=<\/span><span class=\"s\">\"@+id\/bouton_appuyez\"<\/span>\r\n        <span class=\"na\">app:layout_constraintEnd_toStartOf=<\/span><span class=\"s\">\"@+id\/entree_texte_nom\"<\/span>\r\n        <span class=\"na\">app:layout_constraintHorizontal_bias=<\/span><span class=\"s\">\"0.5\"<\/span>\r\n        <span class=\"na\">app:layout_constraintStart_toStartOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintTop_toTopOf=<\/span><span class=\"s\">\"parent\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;EditText<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/entree_texte_nom\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">android:ems=<\/span><span class=\"s\">\"10\"<\/span>\r\n        <span class=\"na\">android:inputType=<\/span><span class=\"s\">\"textPersonName\"<\/span>\r\n        <span class=\"na\">app:layout_constraintBottom_toBottomOf=<\/span><span class=\"s\">\"@+id\/label_nom\"<\/span>\r\n        <span class=\"na\">app:layout_constraintEnd_toEndOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintHorizontal_bias=<\/span><span class=\"s\">\"0.5\"<\/span>\r\n        <span class=\"na\">app:layout_constraintStart_toEndOf=<\/span><span class=\"s\">\"@+id\/label_nom\"<\/span>\r\n        <span class=\"na\">app:layout_constraintTop_toTopOf=<\/span><span class=\"s\">\"@+id\/label_nom\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;TextView<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/texte_message\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">app:layout_constraintBottom_toBottomOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintEnd_toEndOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintHorizontal_bias=<\/span><span class=\"s\">\"0.5\"<\/span>\r\n        <span class=\"na\">app:layout_constraintStart_toStartOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintTop_toBottomOf=<\/span><span class=\"s\">\"@+id\/bouton_appuyez\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n<span class=\"nt\">&lt;\/androidx.constraintlayout.widget.ConstraintLayout&gt;<\/span>\r\n<\/pre>\n<\/div>\n<h3>Programmer des \u00e9v\u00e9nements en Java<\/h3>\n<p>Il est \u00e9galement possible d&rsquo;assigner un \u00e9v\u00e9nement \u00e0 une vue directement dans la programmation Java. Pour nous permettre d&rsquo;effectuer cette t\u00e2che, Android utilise un syst\u00e8me d&rsquo;interface Java appel\u00e9 \u00ab\u00a0Listener\u00a0\u00bb.<\/p>\n<p>Nous allons donc refaire l&rsquo;exemple plus haut en utilisant un \u00ab\u00a0OnClickListener\u00a0\u00bb au lieu d&rsquo;assigner directement l&rsquo;\u00e9v\u00e9nement dans le \u00ab\u00a0Layout\u00a0\u00bb.<\/p>\n<p>Il est possible de faire un \u00e9v\u00e9nement \u00ab\u00a0OnClickListener\u00a0\u00bb de deux mani\u00e8res. Soit on impl\u00e9mente l&rsquo;interface \u00ab\u00a0OnClickListener\u00a0\u00bb dans l&rsquo;activit\u00e9 ou on cr\u00e9e une classe priv\u00e9e qui impl\u00e9mente \u00ab\u00a0OnClickListener\u00a0\u00bb dans l&rsquo;activit\u00e9.<\/p>\n<p>Donc, pour pr\u00e9senter les deux exemples, nous allons modifier le XML du layout pour retirer la propri\u00e9t\u00e9 \u00ab\u00a0onCLick\u00a0\u00bb du bouton:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cp\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;<\/span>\r\n<span class=\"nt\">&lt;androidx.constraintlayout.widget.ConstraintLayout<\/span> <span class=\"na\">xmlns:android=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res\/android\"<\/span>\r\n    <span class=\"na\">xmlns:app=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res-auto\"<\/span>\r\n    <span class=\"na\">xmlns:tools=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/tools\"<\/span>\r\n    <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">tools:context=<\/span><span class=\"s\">\".MainActivity\"<\/span><span class=\"nt\">&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;Button<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/bouton_appuyez\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">android:text=<\/span><span class=\"s\">\"@string\/bouton_texte\"<\/span>\r\n        <span class=\"na\">app:layout_constraintBottom_toTopOf=<\/span><span class=\"s\">\"@+id\/texte_message\"<\/span>\r\n        <span class=\"na\">app:layout_constraintEnd_toEndOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintHorizontal_bias=<\/span><span class=\"s\">\"0.5\"<\/span>\r\n        <span class=\"na\">app:layout_constraintStart_toStartOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintTop_toBottomOf=<\/span><span class=\"s\">\"@+id\/label_nom\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;TextView<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/label_nom\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">android:text=<\/span><span class=\"s\">\"@string\/label_nom\"<\/span>\r\n        <span class=\"na\">app:layout_constraintBottom_toTopOf=<\/span><span class=\"s\">\"@+id\/bouton_appuyez\"<\/span>\r\n        <span class=\"na\">app:layout_constraintEnd_toStartOf=<\/span><span class=\"s\">\"@+id\/entree_texte_nom\"<\/span>\r\n        <span class=\"na\">app:layout_constraintHorizontal_bias=<\/span><span class=\"s\">\"0.5\"<\/span>\r\n        <span class=\"na\">app:layout_constraintStart_toStartOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintTop_toTopOf=<\/span><span class=\"s\">\"parent\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;EditText<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/entree_texte_nom\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">android:ems=<\/span><span class=\"s\">\"10\"<\/span>\r\n        <span class=\"na\">android:inputType=<\/span><span class=\"s\">\"textPersonName\"<\/span>\r\n        <span class=\"na\">app:layout_constraintBottom_toBottomOf=<\/span><span class=\"s\">\"@+id\/label_nom\"<\/span>\r\n        <span class=\"na\">app:layout_constraintEnd_toEndOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintHorizontal_bias=<\/span><span class=\"s\">\"0.5\"<\/span>\r\n        <span class=\"na\">app:layout_constraintStart_toEndOf=<\/span><span class=\"s\">\"@+id\/label_nom\"<\/span>\r\n        <span class=\"na\">app:layout_constraintTop_toTopOf=<\/span><span class=\"s\">\"@+id\/label_nom\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;TextView<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/texte_message\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">app:layout_constraintBottom_toBottomOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintEnd_toEndOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintHorizontal_bias=<\/span><span class=\"s\">\"0.5\"<\/span>\r\n        <span class=\"na\">app:layout_constraintStart_toStartOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintTop_toBottomOf=<\/span><span class=\"s\">\"@+id\/bouton_appuyez\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n<span class=\"nt\">&lt;\/androidx.constraintlayout.widget.ConstraintLayout&gt;<\/span>\r\n<\/pre>\n<\/div>\n<p>La premi\u00e8re m\u00e9thode consiste en l&rsquo;impl\u00e9mentation de l&rsquo;interface \u00ab\u00a0OnClickListener\u00a0\u00bb directement dans l&rsquo;activit\u00e9. L&rsquo;interface \u00ab\u00a0OnClickListener\u00a0\u00bb n\u00e9cessite la cr\u00e9ation de la m\u00e9thode red\u00e9finie \u00ab\u00a0OnCLick(View)\u00a0\u00bb. Voici l&rsquo;activit\u00e9 utilisant l&rsquo;impl\u00e9mentation de l&rsquo;interface \u00ab\u00a0OnClickListener\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MainActivity<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">AppCompatActivity<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">View<\/span><span class=\"p\">.<\/span><span class=\"na\">OnClickListener<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">protected<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">onCreate<\/span><span class=\"p\">(<\/span><span class=\"n\">Bundle<\/span> <span class=\"n\">savedInstanceState<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">super<\/span><span class=\"p\">.<\/span><span class=\"na\">onCreate<\/span><span class=\"p\">(<\/span><span class=\"n\">savedInstanceState<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">setContentView<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">layout<\/span><span class=\"p\">.<\/span><span class=\"na\">activity_main<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">Button<\/span> <span class=\"n\">lBoutonAppuyer<\/span> <span class=\"o\">=<\/span> <span class=\"n\">findViewById<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">id<\/span><span class=\"p\">.<\/span><span class=\"na\">bouton_appuyez<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lBoutonAppuyer<\/span><span class=\"p\">.<\/span><span class=\"na\">setOnClickListener<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">onClick<\/span><span class=\"p\">(<\/span><span class=\"n\">View<\/span> <span class=\"n\">aVue<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">TextView<\/span> <span class=\"n\">lTexteMessage<\/span> <span class=\"o\">=<\/span> <span class=\"n\">findViewById<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">id<\/span><span class=\"p\">.<\/span><span class=\"na\">texte_message<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">CharSequence<\/span> <span class=\"n\">lMessage<\/span> <span class=\"o\">=<\/span> <span class=\"n\">getString<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">string<\/span><span class=\"p\">.<\/span><span class=\"na\">message<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">EditText<\/span> <span class=\"n\">lEntreeNom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">findViewById<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">id<\/span><span class=\"p\">.<\/span><span class=\"na\">entree_texte_nom<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">CharSequence<\/span> <span class=\"n\">lNom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lEntreeNom<\/span><span class=\"p\">.<\/span><span class=\"na\">getText<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">lTexteMessage<\/span><span class=\"p\">.<\/span><span class=\"na\">setText<\/span><span class=\"p\">(<\/span><span class=\"n\">lMessage<\/span><span class=\"p\">.<\/span><span class=\"na\">toString<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lNom<\/span><span class=\"p\">.<\/span><span class=\"na\">toString<\/span><span class=\"p\">());<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Voici maintenant le m\u00eame exemple qui utilise une classe priv\u00e9e qui impl\u00e9mente \u00ab\u00a0OnClickListener\u00a0\u00bb. De mani\u00e8re similaire, l&rsquo;impl\u00e9mentation de \u00ab\u00a0OnCLickListener\u00a0\u00bb n\u00e9cessite que la classe priv\u00e9e contienne la m\u00e9thode \u00ab\u00a0OnClick(View)\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MainActivity<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">AppCompatActivity<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">protected<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">onCreate<\/span><span class=\"p\">(<\/span><span class=\"n\">Bundle<\/span> <span class=\"n\">savedInstanceState<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">super<\/span><span class=\"p\">.<\/span><span class=\"na\">onCreate<\/span><span class=\"p\">(<\/span><span class=\"n\">savedInstanceState<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">setContentView<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">layout<\/span><span class=\"p\">.<\/span><span class=\"na\">activity_main<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">Button<\/span> <span class=\"n\">lBoutonAppuyer<\/span> <span class=\"o\">=<\/span> <span class=\"n\">findViewById<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">id<\/span><span class=\"p\">.<\/span><span class=\"na\">bouton_appuyez<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lBoutonAppuyer<\/span><span class=\"p\">.<\/span><span class=\"na\">setOnClickListener<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">BoutonAppuyerClickListener<\/span><span class=\"p\">());<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">BoutonAppuyerClickListener<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">View<\/span><span class=\"p\">.<\/span><span class=\"na\">OnClickListener<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nd\">@Override<\/span>\r\n        <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">onClick<\/span><span class=\"p\">(<\/span><span class=\"n\">View<\/span> <span class=\"n\">view<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">TextView<\/span> <span class=\"n\">lTexteMessage<\/span> <span class=\"o\">=<\/span> <span class=\"n\">findViewById<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">id<\/span><span class=\"p\">.<\/span><span class=\"na\">texte_message<\/span><span class=\"p\">);<\/span>\r\n            <span class=\"n\">CharSequence<\/span> <span class=\"n\">lMessage<\/span> <span class=\"o\">=<\/span> <span class=\"n\">getString<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">string<\/span><span class=\"p\">.<\/span><span class=\"na\">message<\/span><span class=\"p\">);<\/span>\r\n            <span class=\"n\">EditText<\/span> <span class=\"n\">lEntreeNom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">findViewById<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">id<\/span><span class=\"p\">.<\/span><span class=\"na\">entree_texte_nom<\/span><span class=\"p\">);<\/span>\r\n            <span class=\"n\">CharSequence<\/span> <span class=\"n\">lNom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lEntreeNom<\/span><span class=\"p\">.<\/span><span class=\"na\">getText<\/span><span class=\"p\">();<\/span>\r\n            <span class=\"n\">lTexteMessage<\/span><span class=\"p\">.<\/span><span class=\"na\">setText<\/span><span class=\"p\">(<\/span><span class=\"n\">lMessage<\/span><span class=\"p\">.<\/span><span class=\"na\">toString<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lNom<\/span><span class=\"p\">.<\/span><span class=\"na\">toString<\/span><span class=\"p\">());<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.louismarchand.me\/index.php\/programmation-android\/\">Retour<\/a><\/p>\n<hr \/>\n<p>Auteur: Louis Marchand<br \/>\n<a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/i.creativecommons.org\/l\/by\/4.0\/80x15.png\" alt=\"Creative Commons License\" \/><\/a><br \/>\nSauf pour les sections sp\u00e9cifi\u00e9es autrement, ce travail est sous licence <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\">Creative Commons Attribution 4.0 International<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Le syst\u00e8me Android utilise une m\u00e9canique MVC dont les vues sont enti\u00e8rement g\u00e9n\u00e9r\u00e9es par des librairies et des fichiers de configuration. L&rsquo;id\u00e9e est d&rsquo;utiliser le plus possible les fichiers de configuration pour g\u00e9n\u00e9rer l&rsquo;interface graphique et d&rsquo;utiliser le moins possible la programmation pour cette t\u00e2che. Les \u00ab\u00a0layouts\u00a0\u00bb Android utilise un syst\u00e8me de positionnement Android&hellip; <a class=\"more-link\" href=\"https:\/\/www.louismarchand.me\/index.php\/android-les-layouts\/\">Continue reading <span class=\"screen-reader-text\">Les \u00ab\u00a0Layouts\u00a0\u00bb Android<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-294","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/294","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/comments?post=294"}],"version-history":[{"count":6,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/294\/revisions"}],"predecessor-version":[{"id":667,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/294\/revisions\/667"}],"wp:attachment":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/media?parent=294"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}