[解決済み] 編集テキストをクリックした後、ソフトキーボードを隠すには?
質問
キーボードを隠すには実装が必要なのは誰でも知っていることです。
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
しかし、ここで重要なのは、ユーザが
EditText
またはソフトキーボードを使用しますか?
を使おうとしたのですが
onTouchEvent()
を親にして
Activity
が、これはユーザーが他のビューの外側をタッチし、スクロールビューがない場合にのみ機能します。
タッチ、クリック、フォーカスのリスナーを実装しようとしましたが、成功しませんでした。
タッチイベントをインターセプトするために独自のスクロールビューを実装しようとしましたが、イベントの座標を取得するだけで、クリックされたビューを取得することはできません。
標準的な方法はありますか?iPhoneではとても簡単でした。
解決方法は?
以下のスニペットは、単にキーボードを非表示にするものです。
public static void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager =
(InputMethodManager) activity.getSystemService(
Activity.INPUT_METHOD_SERVICE);
if(inputMethodManager.isAcceptingText()){
inputMethodManager.hideSoftInputFromWindow(
activity.getCurrentFocus().getWindowToken(),
0
);
}
}
これをユーティリティクラスに設置するか、アクティビティ内で定義する場合は、アクティビティパラメータを避けるか、あるいは
hideSoftKeyboard(this)
.
一番厄介なのは、いつ呼び出すかです。メソッドを書いて、すべての
View
であるかどうかをチェックします。
instanceof EditText
を登録していない場合は
setOnTouchListener
をそのコンポーネントに追加すれば、すべてがうまくいくでしょう。どうやったらそんなことができるのかと思われるかもしれませんが、実はとても簡単なことなのです。次のような再帰的なメソッドを書けばいいのだ。以下はそのメソッドです。
public void setupUI(View view) {
// Set up touch listener for non-text box views to hide keyboard.
if (!(view instanceof EditText)) {
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
hideSoftKeyboard(MyActivity.this);
return false;
}
});
}
//If a layout container, iterate over children and seed recursion.
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
View innerView = ((ViewGroup) view).getChildAt(i);
setupUI(innerView);
}
}
}
の後にこのメソッドを呼び出すだけです。
setContentView
を作成します。どのようなパラメータを渡すのか気になる方のために説明しますと、それは
id
親コンテナの 親コンテナの
id
のように親コンテナに
<RelativeLayoutPanel android:id="@+id/parent"> ... </RelativeLayout>
と呼びます。
setupUI(findViewById(R.id.parent))
以上です。
これを効果的に使いたい場合は、拡張された
Activity
を作成し、このメソッドを配置し、アプリケーション内の他のすべてのアクティビティがこのアクティビティを継承し、このメソッドの
setupUI()
の中で
onCreate()
メソッドを使用します。
お役に立てれば幸いです。
複数のアクティビティを使用する場合は、次のように親レイアウトに共通のIDを定義します。
<RelativeLayout android:id="@+id/main_parent"> ... </RelativeLayout>
そして
Activity
を定義し
setupUI(findViewById(R.id.main_parent))
その
OnResume()
の代わりに、このクラスを拡張してください。
in your program
上記の関数のKotlin版です。
@file:JvmName("KeyboardUtils")
fun Activity.hideSoftKeyboard() {
currentFocus?.let {
val inputMethodManager = ContextCompat.getSystemService(this, InputMethodManager::class.java)!!
inputMethodManager.hideSoftInputFromWindow(it.windowToken, 0)
}
}
関連
-
アプリはGoogle検索でインデックスされません Androidmanifestのクソみたいな黄色い警告
-
例外「指定された子にはすでに親がいます」の解決方法。removeViewを呼び出す必要があります" の解決方法(ソースコード付き例)
-
android block certificate validation CertPathValidatorException: 認証パスのトラストアンカーが見つかりません
-
Error:A problem occurred configuring project ':app'. > ビルドを見つけられませんでした。
-
Android カスタムスピナーコントロールのドロップダウン・ボックスの実装
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] AndroidのListViewで画像を遅延ロードする方法
-
[解決済み] 新しくインスタンス化されたスピナーで、onItemSelectedを起動させないようにするにはどうすればよいですか?
-
[解決済み】編集テキストにフォーカスが当たっている時にソフトキーボードを表示させる方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
android.os の NetworkOnMainThreadException。
-
AndroidエミュレーターのADBサーバーがACKしない問題
-
Gradle の同期に失敗しました。com.android.tools.build:gradle が見つかりませんでした。
-
アンドロイドスタジオでJunitのエラー問題を解決する
-
telnet'が内部コマンドまたは外部コマンドとして認識されない 解決方法
-
GoogleMapと連携し、位置情報の取得が可能
-
Windowsのadbシェルでデータディレクトリにアクセスするとパーミッションが拒否される
-
Androidプロセス生存のためのソリューション
-
android bluetooth--Bluetooth on、検索、ペアリング、接続
-
アンドロイドにおけるトークンの利用