Tmi 4 keyboard?fm=jpg&fl=progressive&q=75&w=300

AndroidやiOSでのバーチャルキーボードの隠し方

TMIではMichael Helmbrechtがモバイルアプリケーションの開発でよくある質問に詳しくお答えします。

ネットで見つけた答えが詳しくないなものばかりで満足できなかったことはありませんか?第四回のエピソードでは、Michaelはユーザーにアプリケーションの素晴らしいコンテンツをもっと見てもらえるように、AndroidやiOSの邪魔なキーボードを隠す方法をたった2行のコードで説明します。Javaマスターの愛犬フランクも手を貸してくれます。🐶


みなさん、こんにちは! RealmのMichaelです。TMIでモバイルアプリケーションの開発についての質問をより詳しく答えるようにします。AndroidやiOSのアプリケーションを作る時にはよくある、どうやってバーチャルキーボードを消すのかということについてお答えします。

バーチャルキーボードは時々スクリーンの一部に被さってきます。そのバーチャルキーボードを隠したら、ユーザーたちにもっとアプリケーションのコンテンツを見てもらえるのです。Java、Objective-CやSwiftでどのようにすれば良いのか一緒に見ていきましょう。

Android

Androidではキーボードを消すのがとても簡単です。コードはたったの2行です。

記事の更新情報を受け取る

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);

まず、InputMethodManagerインスタンスを取得するためにgetSystemServiceを使っています。InputMethodManagerはソフトキーボードを追跡するためのです。ハードウェアキーボードの場合も使用可能です。次の行では、InputMethodManagerhideSoftInputFromWindowメソッドを呼び出します。

重要なのは、トークンが必要です。後でそれについて詳しく話します。まずトークンを渡し、次にオプションフラグとして0を渡します。

このコードの前後も見ていきましょう。おそらくフォーカスを持っているビューを使って以下のように記述することになると思います。

View view = this.getCurrentFocus();
if (view != null) {
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

getCurrentFocusメソッドを使用して対象のビューの参照を取得し、nullでないことを確認します。これでInputMethodManager渡すためのウィンドウトークンが得られます。

また、オプションフラグの0InputMethodManager.HIDE_IMPLICIT_ONLYに変えるのもよく使うもう一つのパータンです:

View view = this.getCurrentFocus();
if (view != null) {
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);
}

こうすることによって、暗黙的に表示されたキーボードのみを隠します。ユーザーがEditTextをクリックするとキーボードを表示して欲しいという明示的なアクションを起こしたことになるので、この場合はhideSoftInputFromWindowメソッドは何もしません。 自動的にビューがフォーカスを獲得したような場合にのみキーボードを隠します。このフラグを使用することで、ユーザーがキーボードを表示して欲しい場合にはそのままにし、それ以外の場合ではユーザーの邪魔をしないようにキーボードを隠すということができるようになります。

iOS

iOSの場合は、もっと簡単です。コードはたった1行です。

Objective-C

[self.view endEditing:YES];

Swift

self.view.endEditing(true);

どんなビューで endEditing をしてもいいです。Objective-Cでは、YESを渡しますが、Swiftではtrueにします。YES(あるいは true)というのは”force”を意味するブ―リアンです。こうすることで、ファースト・レスポンダーはキーボードを隠すことを拒否できなくなります。 このメソッドは、どのレスポンダーがキーボードを表示させているかを自動的に見つけ出し、非表示にするように伝えます。

この処理を自分で書くためにサブビューやビュー階層全体を辿るようなコードを沢山見かけますが、そのようなことをする必要はありません。 わざわざ自分で書かなくても、それをやってくれるendEditingが用意されています。キーボードを隠したいのであれば単にこのメソッドを呼び出すだけです。

その短いコードがお役立てば幸いです。それでは次のTMIでお会いしましょう。

リソース


This post is licensed under a Creative Commons BY-SA 3.0 license.

About the content

This content has been published here with the express permission of the author.

Michael Helmbrecht

Michael designs and builds things: apps, websites, jigsaw puzzles. He’s strongest where disciplines meet, and is excited to bring odd ideas to the table. But mostly he’s happy to exchange knowledge and ideas with people. Find him at your local meetup or ice cream shop, and trade puns.

4 design patterns for a RESTless mobile integration »

close