web-dev-qa-db-ja.com

setSoftInputModeとInputMethodManager

私はAndroidのコーディング中に画面キーボードを非表示にする両方の方法を見て使用しました。

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

そして:

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

私は両方のドキュメントを読みましたが、どちらがどのように異なっているか、同じであるか、どちらがより良い方法または実践であるか、どの状況でどちらを使用するべきかについてはまだ不明です。

以下は、.setSoftInputModedocumentation からの抜粋です。

WindowManager.LayoutParams.softInputModeに従って、ウィンドウに使用する明示的なソフト入力モードを指定します。ここで「未指定」以外のものを指定すると、ウィンドウが通常テーマから取得する入力モードが上書きされます。

そして、これはほぼ同じことを言っているように見えるInputMethodManagerdocumentation からの抜粋です:

同じwindowSoftInputMode属性を使用して、ウィンドウの優先ソフト入力状態(オープン、クローズなど)を制御することもできます。

ここのAPIを通じて、IMFとそのIMEを直接操作するためのより詳細なコントロールを利用できます。入力領域の表示または非表示、ユーザーによる入力メソッドの選択などが可能です。

Androidソフトキーボードを非表示にするこれらの2つのオプションの違いは何ですか、そして1つは他よりも利点がありますか?もう1つは効率的ですか?それぞれの特定の用途は何ですか?

4
TronicZomB

InputMethodManagerのドキュメント で非常に明確になっていると思います:

  • このクラスで表現されるインプットメソッドマネージャーは、他のすべての部分間の相互作用を管理するシステムの中心的なポイントです。ここでは、各アプリケーションコンテキストに存在し、すべてのプロセス間の対話を管理するグローバルシステムサービスと通信するクライアント側APIとして表されます。
  • インプットメソッド(IME)は、ユーザーがテキストを生成できるようにする特定の対話モデルを実装します。システムは使用中の現在のインプットメソッドにバインドし、それを作成して実行させ、UIを非表示にして表示するタイミングを指示します。一度に実行されるIMEは1つだけです。

つまり、InputMethodManagerは「大きく」、setSoftInputModeよりもはるかに多くの責任を負っています。最初のものは

インプットシステムフレームワーク(IMF)アーキテクチャ全体に対する中央システムAPI。アプリケーションと現在のインプットメソッドとの間の相互作用を調停します。

一方、2番目は単なるセッターメソッドです。

8
Nahuel Barrios

setSoftInputModeは、アクティビティにフォーカスしたときにソフト入力ウィンドウを表示するか非表示にするかをフレームワークに指示します。フレームワークは、InputMethodManagerのメソッドを呼び出すことによってこの動作を実装します。引用したドキュメントで触れたように、自動動作(SOFT_INPUT_STATE_UNCHANGED)を無効にし、InputMethodManagerを使用して必要な正確な動作を実装することにより、よりきめ細かい制御を実行できます。

0
j__m