keyboard 取得 押し上げ - ソフトウェアキーボードがAndroidデバイスで表示されているかどうかを検出するにはどうすればよいですか?




11 Answers

これは私のために働く。 たぶん、これは常にすべてのバージョンにとって最良の方法です

onGlobalLayoutメソッドが何度も呼び出しているため、キーボードの可視性をプロパティにしてこの変更を遅らせることが有効です。 また、デバイスの回転を確認します。

contentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {

    Rect r = new Rect();
    contentView.getWindowVisibleDisplayFrame(r);
    int screenHeight = contentView.getRootView().getHeight();

    // r.bottom is the position above soft keypad or device button.
    // if keypad is shown, the r.bottom is smaller than that before.
    int keypadHeight = screenHeight - r.bottom;

    Log.d(TAG, "keypadHeight = " + keypadHeight);

    if (keypadHeight > screenHeight * 0.15) { // 0.15 ratio is perhaps enough to determine keypad height.
        // keyboard is opened
    }
    else {
        // keyboard is closed
    }
}
});
判定 イベント 検知

ソフトウェア(別名「ソフト」キーボード)が画面に表示されているかどうかを検出する方法はありますか?




私はこのために使用できるシンプルなクラスを作成しました: https://github.com/ravindu1024/android-keyboardlistener : https://github.com/ravindu1024/android-keyboardlistener 。 プロジェクトにコピーして、次のように使用してください:

KeyboardUtils.addKeyboardToggleListener(this, new KeyboardUtils.SoftKeyboardToggleListener()
{
    @Override
    public void onToggleSoftKeyboard(boolean isVisible)
    {
        Log.d("keyboard", "keyboard visible: "+isVisible);
    }
});






この回答を参照することができます - https://.com/a/24105062/3629912

それは毎回私のために働いた。

adb shell dumpsys window InputMethod | grep "mHasSurface"

ソフトウェアキーボードが表示されている場合はtrueを返します。




KeyboardShownが表示されている場合、このコードを試してみてください。この関数は真の値を返します....

private final String TAG = "TextEditor";
private TextView mTextEditor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_editor);
    mTextEditor = (TextView) findViewById(R.id.text_editor);
    mTextEditor.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            isKeyboardShown(mTextEditor.getRootView());
        }
    });
}

private boolean isKeyboardShown(View rootView) {
    /* 128dp = 32dp * 4, minimum button height 32dp and generic 4 rows soft keyboard */
    final int SOFT_KEYBOARD_HEIGHT_DP_THRESHOLD = 128;

    Rect r = new Rect();
    rootView.getWindowVisibleDisplayFrame(r);
    DisplayMetrics dm = rootView.getResources().getDisplayMetrics();
    /* heightDiff = rootView height - status bar height (r.top) - visible frame height (r.bottom - r.top) */
    int heightDiff = rootView.getBottom() - r.bottom;
    /* Threshold size: dp to pixels, multiply with display density */
    boolean isKeyboardShown = heightDiff > SOFT_KEYBOARD_HEIGHT_DP_THRESHOLD * dm.density;

    Log.d(TAG, "isKeyboardShown ? " + isKeyboardShown + ", heightDiff:" + heightDiff + ", density:" + dm.density
            + "root view height:" + rootView.getHeight() + ", rect:" + r);

    return isKeyboardShown;
}



私の場合、私は私のレイアウトで管理するEditTextが1つしかなかったので、私はthis解決策を思いついた。 それはうまくいきます、基本的には、フォーカスを聞いてフォーカスが変わった場合、または戻る/完了ボタンが押された場合にローカルブロードキャストを送信するカスタムEditTextです。 作業するには、 android:focusable="true"およびandroid:focusableInTouchMode="true"してレイアウトにダミーViewを配置する必要がありandroid:focusableInTouchMode="true"なぜなら、 clearFocus()を呼び出すと、フォーカスは最初のフォーカス可能なビューに再割り当てされるからです。 ダミービューの例:

<View
android:layout_width="1dp"
android:layout_height="1dp"
android:focusable="true"
android:focusableInTouchMode="true"/>

その他の情報

レイアウトの変更の違いを検出するソリューションは、画面の密度に強く依存するため、うまく機能しません。特定のデバイスでは100pxが多く、誤検出を起こす可能性があるためです。 また、ベンダーによって異なるキーボードがあります。




私はこれが古い質問だと思うが、今日はキーボードが開いているかどうかを確認するために良い図書館に出くわす。 だから私はここで共有しています。

私は同様の問題を抱えていて、これについて1つのライブラリが見つかりました。 それはaspectedのように働いています。 ここはキーボードライブラリです。




私も同様の問題がありました。 私は画面上のEnterボタン(キーボードを隠していた)に反応する必要がありました。 この場合、キーボードが持つテキストビューのOnEditorActionを購読することができます。複数の編集可能なボックスがある場合は、そのすべてをサブスクライブします。

あなたのアクティビティではキーボードを完全にコントロールしていますので、開いているかどうかに関わらず、すべての開始イベントと終了イベントを聴くと、問題に直面しません。




Androidでは、ADBシェルで検出できます。 私はこのメソッドを書いて使いました:

{
        JSch jsch = new JSch();
        try {
            Session session = jsch.getSession("<userName>", "<IP>", 22);
            session.setPassword("<Password>");
            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            session.connect();

            ChannelExec channel = (ChannelExec)session.openChannel("exec");
            BufferedReader in = new BufferedReader(new    
            InputStreamReader(channel.getInputStream()));
            channel.setCommand("C:/Android/android-sdk/platform-tools/adb shell dumpsys window 
            InputMethod | findstr \"mHasSurface\"");
            channel.connect();

            String msg = null;
            String msg2 = " mHasSurface=true";

            while ((msg = in.readLine()) != null) {
                Boolean isContain = msg.contains(msg2);
                log.info(isContain);
                if (isContain){
                    log.info("Hiding keyboard...");
                    driver.hideKeyboard();
                }
                else {
                    log.info("No need to hide keyboard.");
                }
            }

            channel.disconnect();
            session.disconnect();

        } catch (JSchException | IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}



私はこれを次のようにしましたが、その目的はkeyboadを閉じる/開くことだけです。

close example:(キーボードが既に閉じられているかどうかを確認する - 閉じていない場合)

imm.showSoftInput(etSearch, InputMethodManager.HIDE_IMPLICIT_ONLY, new ResultReceiver(null) {
                    @Override
                    protected void onReceiveResult(int resultCode, Bundle resultData) {
                        super.onReceiveResult(resultCode, resultData);
                        if (resultCode != InputMethodManager.RESULT_UNCHANGED_HIDDEN)
                            imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
                    }
                });



aは次のものを使用しています:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    Log.d(
    getClass().getSimpleName(), 
    String.format("conf: %s", newConfig));

    if (newConfig.hardKeyboardHidden != hardKeyboardHidden) {
        onHardwareKeyboardChange(newConfig.hardKeyboardHidden);

        hardKeyboardHidden = newConfig.hardKeyboardHidden;
    }

    if (newConfig.keyboardHidden != keyboardHidden) {
        onKeyboardChange(newConfig.keyboardHidden);

        keyboardHidden = newConfig.hardKeyboardHidden;
    }

}

public static final int KEYBOARDHIDDEN_UNDEFINED = 0;
public static final int KEYBOARDHIDDEN_NO = 1;
public static final int KEYBOARDHIDDEN_YES = 2;
public static final int KEYBOARDHIDDEN_SOFT = 3;

//todo
private void onKeyboardChange(int keyboardHidden) {

}

//todo
private void onHardwareKeyboardChange(int hardKeyboardHidden) {

}



Related