NativeScript で入力範囲外タップでキーボードを非表示にする
はじめに
NativeScript で入力範囲外エリアのタップでキーボードを非表示にする方法
TL;DR
- Android:
dismissSoftInput()
を使う - iOS:
tns-core-modules/application/ios
を使ってios.nativeApp.sendActionToFromForEvent('resignFirstResponder', null, null, null)
ScrollView
あたりにtap
イベントのハンドラとして設定- iOS は以下の問題があるため使用に注意
- ロングタップによる入力補助が上手く効かなくなる
- iOS 12以下だと入力エリアへのフォーカスが効かなくなる
目次
環境・条件
1 | $ sw_vers |
詳細
何もしてないとキーボードが開きっぱなしになる(※)ので、範囲外をタップしたら閉じるようにしたい、というお話。
※returnKeyType="done"
にしておくと、改行(Enter)でキーボードを閉じることはできる。が、そうじゃなくてタップで閉じたいよね、という感じ。
対応方法
参考: [Feature] Helper to dismiss keyboard · Issue #4594 · NativeScript/NativeScript
Android は Utils の dismissSoftInput()
で閉じることができる。
iOS は tns-core-modules/application/ios
を使って ios.nativeApp.sendActionToFromForEvent('resignFirstResponder', null, null, null)
を実行すると閉じることができる。
以下、NativeScript-Vue での実装例。共通的に使うだろうということで mixin として定義。
ScrollView
に該当ハンドラを設定すると、iOS 12.x 系で入力エリアそのものへのフォーカスが効かなくなったので Platform
モジュールでバージョンを意識。
app/mixins/Utilities.js
1 | import { ad } from "tns-core-modules/utils/utils"; |
app/main.js
1 | import Vue from 'nativescript-vue' |
xxxx.vue
では、 ScrollView
あたりに tap
イベントのハンドラとして設定すれば良い。
1 | <template> |
ちなみに Platform
モジュールで取れる情報はこんな感じ。(iOS のみ取得)
1 | import { device } from "tns-core-modules/platform"; |
補足
前述の対応方法には以下の問題があるので注意。
※Android は問題なかった。
- iOS でロングタップによる入力テキストの選択などが上手く機能しなくなってしまう。
- iOS 12 以下だと入力エリアへのフォーカスが効かなくなる
別の対応方法など見つけたら、追記/更新 する予定。とりあえず、以下を軽く試したが(少なくとも自分の環境では)ダメだった。
https://github.com/NativeScript/NativeScript/issues/4594#issuecomment-433736057
軽く試したけどダメだった。(クラッシュした)
1 | utils.ios |
https://stackoverflow.com/a/60269199
軽く試したけどダメだった。(クラッシュした)
1 | import { frame } from "tns-core-modules/ui/frame"; |
https://stackoverflow.com/a/54670359
軽く試したけどダメだった。(クラッシュした)
1 | <TextField |
まとめ
- Android:
dismissSoftInput()
を使う - iOS:
tns-core-modules/application/ios
を使ってios.nativeApp.sendActionToFromForEvent('resignFirstResponder', null, null, null)
ScrollView
あたりにtap
イベントのハンドラとして設定- iOS は以下の問題があるため使用に注意
- ロングタップによる入力補助が上手く効かなくなる
- iOS 12以下だと入力エリアへのフォーカスが効かなくなる
その他・メモ
iOS シミュレータでキーボードが表示されない
参考: iOSシミュレータでキーボードが表示されない - paranitips
iOS シミュレータでキーボードを表示したい場合は、シミュレータを起動した後に↓を変更する。
Android でキーボード表示時に入力エリアが隠れないようにしたい
app/App_Resources/Android/src/main/AndroidManifest.xml
に android:windowSoftInputMode="stateHidden | adjustPan"
を追加する。
※何か副作用あると思われるので、自分のアプリに適切かは各自で判断。
1 | <?xml version="1.0" encoding="utf-8"?> |
参考文献
- [Feature] Helper to dismiss keyboard · Issue #4594 · NativeScript/NativeScript
- javascript - Hide Android keyboard in Nativescript on input field blur - Stack Overflow
- clearFocus not working · Issue #4755 · NativeScript/NativeScript
関連記事
- NativeScript, JsBarcode でバーコードを 生成/描画
- NativeScript でデバイスの輝度(明るさ)を制御する
- NativeScript-Vue で次入力欄にフォーカスする方法
- NativeScript で Locale を意識した DatePicker/TimePicker
- NativeScript-Vue でページ読み込み後にページ移動やダイアログの表示
- NativeScript で Dark Mode, Dark Theme 対応
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア