{"id":13236,"date":"2018-02-06T17:29:35","date_gmt":"2018-02-06T16:29:35","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=13236"},"modified":"2018-02-06T17:29:35","modified_gmt":"2018-02-06T16:29:35","slug":"android-gestire-la-tastiera-software-mediante-inputmethodmanager","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/android-gestire-la-tastiera-software-mediante-inputmethodmanager\/","title":{"rendered":"Android: gestire la tastiera software mediante InputMethodManager"},"content":{"rendered":"<p>In Android, siamo abituati a vedere apparire una tastiera software all&#8217;atto di assegnare il focus ad una EditText per permetterci di digitare caratteri. Ci\u00f2 avviene in automatico ma pu\u00f2 essere utile saper <strong>esplicitamente invocare la sua apertura o chiusura<\/strong>: per questo, vediamo come funziona l&#8217;<strong>InputMethodManager<\/strong><\/p>\n<p>Qualora volessimo <strong>chiudere la tastiera software<\/strong> potremmo utilizzare le seguenti righe di codice:<\/p>\n<pre class=\"lang:java decode:true  \">InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);\r\nimm.hideSoftInputFromWindow(findViewById(R.id.activity_main).getWindowToken(), 0);<\/pre>\n<p>Con la prima riga, richiediamo il collegamento all&#8217;InputMethodManager che consiste in un servizio di sistema, con la seconda richiediamo esplicitamente di nascondere la tastiera. Si noti che il metodo <em>hideSoftInputFromWindow<\/em> riceve due parametri in input:<\/p>\n<ul>\n<li>un <em>WindowToken<\/em> che consiste in un identificativo univoco alla finestra. Per ottenerlo \u00e8 sufficiente richiederlo ad una View ad essa collegata. Qui abbiamo supposto di avere un layout con id <em>R.id.activity_main<\/em> ma, come si pu\u00f2 immaginare, l&#8217;oggetto View su cui eseguire l&#8217;invocazione dovr\u00e0 essere scelto in base al proprio progetto;<\/li>\n<li>il secondo \u00e8 un campo per un flag che pu\u00f2 valere 0 o essere impostato al valore HIDE_IMPLICIT_ONLY che specifica che la tastiera andrebbe chiusa solo se non esplicitamente invocata dall&#8217;utente.<\/li>\n<\/ul>\n<p>Esiste comunque un metodo per gestire <strong>apertura e chiusura della tastiera software<\/strong>, <em>toggleSoftInputFromWindow<\/em>, da usare nel modo seguente:<\/p>\n<pre class=\"lang:java decode:true \">InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);\r\nimm.toggleSoftInputFromWindow(\r\n                findViewById(R.id.activity_main).getApplicationWindowToken(),\r\n                InputMethodManager.SHOW_FORCED, 0);<\/pre>\n<p>Anche qui il primo parametro del metodo <em>toggleSoftInputFromWindow<\/em> \u00e8 un WindowToken mentre successivamente possiamo ospitare due flag: uno per quanto riguarda l&#8217;apertura, uno per la chiusura. Come flag di apertura, si pu\u00f2 usare 0 o i valori SHOW_IMPLICIT (l&#8217;azione non \u00e8 esplicita richiesta dell&#8217;utente) e SHOW_FORCED (la \u00a0tastiera non deve essere richiusa senza esplicita richiesta dell&#8217;utente). Per la chiusura, i flag possibili sono HIDE_IMPLICIT_ONLY (come sopra) e HIDE_NOT_ALWAYS (dovrebbe normalmente essere chiusa a meno che non aperta con SHOW_FORCED) oltre al valore neutro 0.<\/p>\n<p>Impostando, ad esempio, <strong>entrambi i flag a 0<\/strong>, il metodo\u00a0<em>toggleSoftInputFromWindow \u00a0<\/em>implementerebbe una sorta di interruttore per la tastiera permettendo di aprirla e chiuderla a comando. Qualora utilizzassimo invece <strong>SHOW_FORCED per l&#8217;apertura e HIDE_NOT_ALWAYS per la chiusura<\/strong> la tastiera verrebbe aperta con il metodo\u00a0<em>toggleSoftInputFromWindow \u00a0<\/em>ma potrebbe solo essere richiusa su richiesta esplicita dell&#8217;utente.<\/p>\n<p>Vi \u00e8 mai capitato di sentire il bisogno di gestire direttamente la tastiera ? Provate questi metodi e fateci sapere cosa ne pensate!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In Android, siamo abituati a vedere apparire una tastiera software all&#8217;atto di assegnare il focus ad una&#8230;<\/p>\n","protected":false},"author":561,"featured_media":13418,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1682,1],"tags":[1278,2011,2009,2010,2012],"class_list":["post-13236","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","category-tutorial-pratici","tag-android","tag-input-utente","tag-inputmethodmanager","tag-software-keyboad","tag-sviluppo-android"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/13236","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/561"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=13236"}],"version-history":[{"count":1,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/13236\/revisions"}],"predecessor-version":[{"id":13237,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/13236\/revisions\/13237"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/13418"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=13236"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=13236"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=13236"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}