[解決済み】Androidで "仮想キーボードの表示/非表示 "イベントをキャプチャする方法は?
質問
バーチャルキーボードが表示されているかどうかでレイアウトを変えたいのですが、どうすればいいですか?APIや様々なブログで検索してみましたが、なかなか有用なものが見つかりません。
可能でしょうか?
ありがとうございます。
解決方法は?
2020年最新情報
これが可能になったのです。
Android 11では、以下のことが可能です。
view.setWindowInsetsAnimationCallback(object : WindowInsetsAnimation.Callback {
override fun onEnd(animation: WindowInsetsAnimation) {
super.onEnd(animation)
val showingKeyboard = view.rootWindowInsets.isVisible(WindowInsets.Type.ime())
// now use the boolean for something
}
})
また、キーボードの表示/非表示のアニメーションを聞いて、それに対応したトランジションを行うことも可能です。
を読むことをお勧めします。 Android 11 プレビュー と、それに対応する ドキュメント
Android 11以前
ただし、本作品では
Compat
のバージョンでは、ハックに頼る必要があります。
ウィンドウのインセットを取得し、下のインセットが(実験によって)合理的に良いと思われるある値よりも大きい場合、キーボードを表示しているとみなすことができます。これはあまり良い方法ではなく、場合によっては失敗する可能性もありますが、フレームワークのサポートはありません。
この質問に対する良い回答はこちらです。 https://stackoverflow.com/a/36259261/372076 . また、Android 11以前のバージョンでこれを実現するためのさまざまな方法を紹介しているページもあります。
備考
この解決策は、ソフトキーボードおよび
onConfigurationChanged
はソフト (仮想) では呼び出されません。 キーボード
設定変更に自分で対応する必要がある。
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
サンプルです。
// from the link above
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks whether a hardware keyboard is available
if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
Toast.makeText(this, "keyboard visible", Toast.LENGTH_SHORT).show();
} else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {
Toast.makeText(this, "keyboard hidden", Toast.LENGTH_SHORT).show();
}
}
そして、いくつかのビューの可視性を変更し、フィールドを更新し、レイアウトファイルを変更するだけです。
関連
-
[解決済み】Edit Textのandroid:ems属性とは何ですか?[重複しています]
-
[解決済み】Android Studioの初回起動。Android SDKアドオンリストにアクセスできない
-
[解決済み】レンダリングの問題 レンダリング中に発生した例外:com/android/util/PropertiesMap [重複].
-
[解決済み】Android 8:クリアテキストのHTTPトラフィックが許可されない
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] インスタンス状態の保存を使用してアクティビティ状態を保存するにはどうすればよいですか?
-
[解決済み] AndroidのListViewで画像を遅延ロードする方法
-
[解決済み] EditTextのアンダーバーを非表示にする方法
-
[解決済み] ソフトキーボードが表示されたときにレイアウトを調整する方法
最新
-
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 - SDKバージョン23のアップデート後、ACTION-VIEWインテントフィルタを持つアクティビティを少なくとも1つ追加する。
-
[解決済み】インストールエラー。インストールエラー:install_failed_older_sdk
-
[解決済み] [Solved] Unsupported method: ベースコンフィグ.getApplicationIdSuffix()
-
[解決済み】Android Studio。adbバージョン」の結果を取得できない
-
[解決済み] エラー - Android リソースのリンクに失敗しました (AAPT2 27.0.3 Daemon #0)
-
[解決済み] TypeError: cb.apply は関数ではありません。
-
[解決済み] Mockito lenient() を使用する場合
-
[解決済み] エラー - Android リソースのリンクに失敗しました (AAPT2 27.0.3 Daemon #0)
-
[解決済み] Android Fragment onAttach() 非推奨
-
[解決済み] Android M パーミッション : shouldShowRequestPermissionRationale()関数の使用方法について混乱しています。