[解決済み] Androidでソフトウェアキーボードの表示状態を確認する方法を教えてください。
2022-03-18 06:07:04
質問
とても簡単なことですが、ソフトウェアキーボードが表示されているかどうかを調べたいのです。これはAndroidで可能なのでしょうか?
解決方法を教えてください。
新しい答え 2012年1月25日追加
この回答を書いてから、ある方から、このようなものがあることを教えていただきました。 ViewTreeObserver といったAPIは、バージョン1からSDKに潜んでいたものです。
カスタムレイアウトタイプを必要とするよりも、もっと簡単な解決策は、アクティビティのルートビューに既知のIDを与えることです。
@+id/activityRoot
で、GlobalLayoutListener を ViewTreeObserver にフックし、そこからアクティビティのビュー ルートとウィンドウ サイズの間のサイズ差を計算します。
final View activityRootView = findViewById(R.id.activityRoot);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
if (heightDiff > dpToPx(this, 200)) { // if more than 200 dp, it's probably a keyboard...
// ... do something here
}
}
});
などのユーティリティを使用する。
public static float dpToPx(Context context, float valueInDp) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics);
}
簡単!
注意
アプリケーションは、Android Manifest でこのフラグを設定する必要があります。
android:windowSoftInputMode="adjustResize"
そうでない場合は、上記の解決策は機能しません。
オリジナル回答
はい、可能です。しかし、それは本来あるべき姿よりもはるかに難しいことなのです。
キーボードの表示・非表示を気にする必要がある場合(これはかなり頻繁にあります)、私はトップレベルのレイアウトクラスをカスタマイズして
onMeasure()
. 基本的なロジックは、レイアウトがウィンドウの総面積よりも大幅に小さい領域を占めている場合、ソフトキーボードが表示されている可能性があるということです。
import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.LinearLayout;
/*
* LinearLayoutThatDetectsSoftKeyboard - a variant of LinearLayout that can detect when
* the soft keyboard is shown and hidden (something Android can't tell you, weirdly).
*/
public class LinearLayoutThatDetectsSoftKeyboard extends LinearLayout {
public LinearLayoutThatDetectsSoftKeyboard(Context context, AttributeSet attrs) {
super(context, attrs);
}
public interface Listener {
public void onSoftKeyboardShown(boolean isShowing);
}
private Listener listener;
public void setListener(Listener listener) {
this.listener = listener;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = MeasureSpec.getSize(heightMeasureSpec);
Activity activity = (Activity)getContext();
Rect rect = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rect.top;
int screenHeight = activity.getWindowManager().getDefaultDisplay().getHeight();
int diff = (screenHeight - statusBarHeight) - height;
if (listener != null) {
listener.onSoftKeyboardShown(diff>128); // assume all soft keyboards are at least 128 pixels high
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
そして、Activityクラスで...
public class MyActivity extends Activity implements LinearLayoutThatDetectsSoftKeyboard.Listener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
LinearLayoutThatDetectsSoftKeyboard mainLayout = (LinearLayoutThatDetectsSoftKeyboard)findViewById(R.id.main);
mainLayout.setListener(this);
...
}
@Override
public void onSoftKeyboardShown(boolean isShowing) {
// do whatever you need to do here
}
...
}
関連
-
[解決済み】Android 8:クリアテキストのHTTPトラフィックが許可されない
-
アンドロイドプロジェクトのパッケージングにgradleを使用する際の問題点
-
問題 ---- Android ---- ActivityManager: Error: アクティビティクラス{xx/xx.MainActivity}が存在しない
-
[解決済み] android.os.NetworkOnMainThreadException' を修正するにはどうすればよいですか?
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] インスタンス状態の保存を使用してアクティビティ状態を保存するにはどうすればよいですか?
-
[解決済み] EclipseのAndroidプラグインで "Debug certificate expired "エラーが発生する。
-
[解決済み] Androidのローテーションでアクティビティを再開する
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ActionBarのサイズをピクセル単位で教えてください。
-
cygwinのダウンロード、インストールチュートリアル、およびCDTの「makeプログラムがパスに見つからない」バグの解消
-
android E/RecyclerView﹕ アダプタが接続されていないため、レイアウトをスキップする。
-
Android studioのインストールと問題発生、Emulator: PANIC: AVDのシステムパスが見つかりません。
-
Android TextViewにandroid:ellipsize=endのバグがある。
-
android studioが新しいプロジェクトを作成しますが、プロジェクトの同期に成功するまでデザインエディタが使用できません。
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み】Android端末でソフトウェアキーボードが表示されているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Androidのアクティビティでソフトキーボードを開閉するリスナー
-
[解決済み] android EditText - 入力終了イベント