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
はソフトキーボードを追跡するためのです。ハードウェアキーボードの場合も使用可能です。次の行では、InputMethodManager
のhideSoftInputFromWindow
メソッドを呼び出します。
重要なのは、トークンが必要です。後でそれについて詳しく話します。まずトークンを渡し、次にオプションフラグとして0
を渡します。
このコードの前後も見ていきましょう。おそらくフォーカスを持っているビューを使って以下のように記述することになると思います。
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
getCurrentFocus
メソッドを使用して対象のビューの参照を取得し、null
でないことを確認します。これでInputMethodManager
渡すためのウィンドウトークンが得られます。
また、オプションフラグの0
をInputMethodManager.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でお会いしましょう。
リソース
- Reto Meier and Community’s answer to “Close/hide the Android Soft Keyboard”
- memmons’s answer to “How to get the currently active UITextField/UITextView and resignFirstResponder?”
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.