{"id":618,"date":"2016-11-27T22:32:59","date_gmt":"2016-11-27T21:32:59","guid":{"rendered":"http:\/\/chezdom.net\/etu\/?page_id=618"},"modified":"2018-11-12T17:18:25","modified_gmt":"2018-11-12T16:18:25","slug":"android-tp1-2016","status":"publish","type":"page","link":"https:\/\/chezdom.net\/etu\/android-tp1-2016\/","title":{"rendered":"Android TP1 &#8211; 2018"},"content":{"rendered":"<p>Nous allons cr\u00e9er une premi\u00e8re application, dont le but est de convertir des nombres entiers en binaire.<\/p>\n<h2>Partie 1<\/h2>\n<h3>1. Cr\u00e9er un layout avec l&rsquo;assistant graphique<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-619 size-medium\" src=\"http:\/\/chezdom.net\/etu\/wp-content\/uploads\/sites\/3\/2016\/11\/layout-cours2-300x209.png\" alt=\"Layout appli conversion binaire\" width=\"300\" height=\"209\" srcset=\"https:\/\/chezdom.net\/etu\/wp-content\/uploads\/sites\/3\/2016\/11\/layout-cours2-300x209.png 300w, https:\/\/chezdom.net\/etu\/wp-content\/uploads\/sites\/3\/2016\/11\/layout-cours2-220x153.png 220w, https:\/\/chezdom.net\/etu\/wp-content\/uploads\/sites\/3\/2016\/11\/layout-cours2.png 482w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Indication : Le layout ci-dessus est form\u00e9 d\u2019un <strong>LinearLayout<\/strong> vertical, contenant :<\/p>\n<ul>\n<li>un <strong>LinearLayout<\/strong> horizontal, contenant lui-m\u00eame :\n<ul>\n<li>une \u00e9tiquette (<strong>TextView<\/strong>),<\/li>\n<li>et un champ de saisie <strong>EditText ;<\/strong><\/li>\n<\/ul>\n<\/li>\n<li>un Button,<\/li>\n<li>et un second <strong>LinearLayout<\/strong> horizontal, contenant aussi une \u00e9tiquette et un champ de saisie.<\/li>\n<\/ul>\n<p>On pourra aussi (dans l\u2019\u00e9diteur graphique), utiliser un champ de saisie qui n\u2019accepte que les nombres.<\/p>\n<h3>2. Cr\u00e9er les objets correspondants et les associer aux \u00e9l\u00e9ments du layout<\/h3>\n<pre class=\"brush: java; gutter: true\">import android.widget.Button;\npublic class MainActivity extends Activity {\n  private Button bGO;\n}\n@Override\npublic void onCreate(Bundle savedInstanceState) {\n  super.onCreate(savedInstanceState);\n  setContentView(R.layout.activity_main);\n\n  bGO = (Button) this.findViewById(R.id.button1);\n}<\/pre>\n<p>NB : Attention \u00e0 bien importer la classe Button du package android.widget (voir la premi\u00e8re ligne du code ci-dessus).<\/p>\n<p>On trouvera l\u2019ID du bouton dans le fichier XML \u201clayout\u201d.<\/p>\n<pre class=\"brush: xml; gutter: true\">&lt;Button\n  android:id=&quot;@+id\/button1&quot;\n  android:layout_width=&quot;match_parent&quot;\n  android:layout_height=&quot;wrap_content&quot;\n  android:text=&quot;Button&quot; \/&gt;<\/pre>\n<h3>3. La classe Activity impl\u00e9mente l\u2019interface de manipulation<\/h3>\n<pre class=\"brush: java; gutter: true\">import android.view.View.OnClickListener;\n\npublic class MainActivity extends Activity\n                          implements OnClickListener {\n  \/\/...\n  @Override\n  public void onClick(View v) {\n    \/\/ ...\n  }<\/pre>\n<p>NB : Attention \u00e0 bien importer l\u2019interface OnClickListener du package android.widget.View<\/p>\n<h3>4. Associer les objets widgets \u00e0 leur interface de manipulation<\/h3>\n<pre class=\"brush: java; gutter: true\">@Override\npublic void onCreate(Bundle savedInstanceState) {\n  super.onCreate(savedInstanceState);\n  setContentView(R.layout.activity_main);\n\n  bGO = (Button) this.findViewById(R.id.button1);\n  bGO.setOnClickListener(this);\n}<\/pre>\n<h3>5. Impl\u00e9menter les m\u00e9thodes de manipulation<\/h3>\n<pre class=\"brush: java; gutter: true\">import android.widget.Toast;\n  \/\/...\n  @Override\n  public void onClick(View v) {\n    if (v.getId()==R.id.button1)\n      Toast.makeText(getApplicationContext(),\n        &quot;Conversion !&quot;,\n        Toast.LENGTH_SHORT).show();\n  }<\/pre>\n<h3>6. R\u00e9cup\u00e9rer une valeur dans un champ de texte<\/h3>\n<p>On associe l\u2019objet EditText avec son champ de saisie, en utilisant l\u2019ID.<\/p>\n<pre class=\"brush: java; gutter: true\">import android.widget.EditText;\n\npublic class MainActivity extends Activity\n  implements OnClickListener {\n    \/\/...\n    private EditText tfDecimal, tfBinaire;\n\n    public void onCreate(Bundle savedInstanceState) {\n      \/\/..\n      tfDecimal=(EditText) this.findViewById(R.id.editText1);\n    }<\/pre>\n<pre class=\"brush: java; gutter: true\">  String chDecimal=tfDecimal.getText().toString();\n  int d=Integer.parseInt(chDecimal);<\/pre>\n<h3>7. \u00c9crire dans un champ de texte<\/h3>\n<p>Ne pas oublier d\u2019associer l\u2019objet EditText avec son champ de saisie, en utilisant l\u2019ID comme pr\u00e9c\u00e9demment.<\/p>\n<pre class=\"brush: java; gutter: true\">tfBinaire.setText(&quot;&quot;+convertInBinary(d));<\/pre>\n<h3>Rappel : Conversion en binaire<\/h3>\n<p>(voir TD intensifs)<\/p>\n<pre class=\"brush: text; gutter: true\">tantque n&gt;0 faire\n  si n%2=0 alors\n    bin = &quot;0&quot; + bin\n  sinon\n    bin = &quot;1&quot; + bin\n  finsi\n  n=n\/2\nfait<\/pre>\n<h2>Partie 2<\/h2>\n<h3>1. Ajouter un second bouton<\/h3>\n<p>On souhaite ajouter un second bouton pour faire la conversion inverse. Que va-t-il se passer ?<\/p>\n<h3>2. Diff\u00e9rencier le traitement des diff\u00e9rents boutons<\/h3>\n<p>Pour diff\u00e9rentier le bouton qui a d\u00e9clench\u00e9 un \u00e9v\u00e9nement, on utilise la m\u00e9thode <strong>getId()<\/strong> de l&rsquo;objet <strong>View<\/strong>&nbsp;pass\u00e9 en argument de <strong>onClick<\/strong> (ce view est en fait l&rsquo;objet qui a d\u00e9clench\u00e9 l&rsquo;action, c&rsquo;est \u00e0 dire l&rsquo;objet sur lequel on a cliqu\u00e9).<\/p>\n<pre class=\"brush: java; gutter: true\">public void onClick(View view) {\n  if (view.getId()==R.id.bBIN) {\n    \/\/ Traitement du bouton d&#039;ID &quot;bBIN&quot;\n  }\n   \/\/ etc... traiter les autres cas (autres boutons)\n}<\/pre>\n<h3>3. Terminer l&rsquo;interface<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-637 size-medium\" src=\"http:\/\/chezdom.net\/etu\/wp-content\/uploads\/sites\/3\/2016\/11\/tp2-layout-167x300.jpg\" alt=\"Layout appli conversion\" width=\"167\" height=\"300\" srcset=\"https:\/\/chezdom.net\/etu\/wp-content\/uploads\/sites\/3\/2016\/11\/tp2-layout-167x300.jpg 167w, https:\/\/chezdom.net\/etu\/wp-content\/uploads\/sites\/3\/2016\/11\/tp2-layout-220x395.jpg 220w, https:\/\/chezdom.net\/etu\/wp-content\/uploads\/sites\/3\/2016\/11\/tp2-layout.jpg 458w\" sizes=\"auto, (max-width: 167px) 100vw, 167px\" \/><\/p>\n<ul>\n<li>ajouter le second bouton pour convertir de binaire \u00e0 d\u00e9cimal<\/li>\n<li>puis ajouter un bouton pour effacer les 2 champs<\/li>\n<\/ul>\n<h3 style=\"clear: both;\">Rappel : convertir de binaire en d\u00e9cimal<\/h3>\n<p>On suppose que bin est une chaine en binaire<\/p>\n<pre class=\"brush: text; gutter: true\">d &lt;- 0\nx &lt;- 1\ni &lt;-longueur(bin)\ntantque i&gt;0 faire\n  i &lt;- i-1\n  if bin[i] = &#039;1&#039; alors d=d+x finsi\n  x &lt;- x*2\nfait<\/pre>\n<p>ou alors, plus simplement en java :<\/p>\n<pre class=\"brush: text; gutter: true\">int dec=parseInt(bin, 2)<\/pre>\n<h2>Partie 3<\/h2>\n<ul>\n<li>Remplacez toutes les cha\u00eenes de caract\u00e8res en dur dans votre appli par des r\u00e9f\u00e9rences \u00e0 des chaines situ\u00e9es dans le fichier <strong>strings.xml<\/strong><\/li>\n<li>Localisez votre appli en fran\u00e7ais, anglais et si possible une autre langue (que vous connaissez)<\/li>\n<li>Testez votre appli en changeant la langue de votre machine virtuelle<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Nous allons cr\u00e9er une premi\u00e8re application, dont le but est de convertir des nombres entiers en binaire. Partie 1 1. Cr\u00e9er un layout avec l&rsquo;assistant graphique Indication : Le layout ci-dessus est form\u00e9 d\u2019un LinearLayout vertical, contenant : un LinearLayout<span class=\"ellipsis\">&hellip;<\/span> <span class=\"read-more\"><a href=\"https:\/\/chezdom.net\/etu\/android-tp1-2016\/\">Lire la suite &#8250;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"jetpack_post_was_ever_published":false,"footnotes":""},"class_list":["post-618","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/P9qu1A-9Y","_links":{"self":[{"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/pages\/618","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/comments?post=618"}],"version-history":[{"count":16,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/pages\/618\/revisions"}],"predecessor-version":[{"id":868,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/pages\/618\/revisions\/868"}],"wp:attachment":[{"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/media?parent=618"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}