Android 키보드에서 소프트웨어 키보드가 보이는지 어떻게 알 수 있습니까? 소프트웨어 (일명 “소프트”) 키보드가 화면에 표시되는지 감지하는

Android에서 소프트웨어 (일명 “소프트”) 키보드가 화면에 표시되는지 감지하는 방법이 있습니까?



답변

직접적인 방법은 없습니다 . Android 팀의 Dianne Hackborn이 응답 한 http://groups.google.com/group/android-platform/browse_thread/thread/1728f26f2334c060/5e4910f0d9eb898a를 참조하십시오 . 그러나 #onMeasure에서 창 크기가 변경되었는지 확인하여 간접적으로이를 감지 할 수 있습니다. Android에서 소프트웨어 키보드의 가시성을 확인하는 방법을 참조하십시오 . .


답변

이것은 나를 위해 작동합니다. 아마도 이것이 항상 모든 버전에 가장 적합한 방법 일 것 입니다 .

키보드 가시성의 속성을 만들고 onGlobalLayout 메소드가 여러 번 호출되므로 이러한 변경이 지연되는 것을 관찰하는 것이 효과적입니다. 또한 장치 회전을 확인하는 것이 좋지만 windowSoftInputMode그렇지 않습니다 adjustNothing.

boolean isKeyboardShowing = false;
void onKeyboardVisibilityChanged(boolean opened) {
    print("keyboard " + opened);
}

// ContentView is the root view of the layout of this activity/fragment    
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
            if (!isKeyboardShowing) {
                isKeyboardShowing = true
                onKeyboardVisibilityChanged(true)
            }
        }
        else {
            // keyboard is closed
            if (isKeyboardShowing) {
                isKeyboardShowing = false
                onKeyboardVisibilityChanged(false)
            }
        }
    }
});

답변

이 시도:

InputMethodManager imm = (InputMethodManager) getActivity()
            .getSystemService(Context.INPUT_METHOD_SERVICE);

    if (imm.isAcceptingText()) {
        writeToLog("Software Keyboard was shown");
    } else {
        writeToLog("Software Keyboard was not shown");
    }

답변

https://github.com/ravindu1024/android-keyboardlistener에 사용할 수있는 간단한 클래스를 만들었습니다 . 프로젝트에 복사하여 다음과 같이 사용하십시오.

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

답변

아주 쉽게

1. 루트보기에 ID를 넣으십시오.

rootView이 경우 내 루트보기를 가리키는보기 일뿐입니다 relative layout.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/addresses_confirm_root_view"
                android:background="@color/WHITE_CLR">

2. 활동에서 루트보기를 초기화하십시오.

RelativeLayout rootView = (RelativeLayout) findViewById(R.id.addresses_confirm_root_view);

3. 키보드를 사용하여 키보드가 열렸는지 닫혔는지 감지 getViewTreeObserver()

    rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int heightDiff = rootView.getRootView().getHeight() - rootView.getHeight();

                if (heightDiff > 100) {
                    Log.e("MyActivity", "keyboard opened");
                } else {
                    Log.e("MyActivity", "keyboard closed");
                }
            }
        });

답변

나는 이것을 기본으로 사용했습니다 : http://www.ninthavenue.com.au/how-to-check-if-the-software-keyboard-is-shown-in-android

/**
* To capture the result of IMM hide/show soft keyboard
*/
public class IMMResult extends ResultReceiver {
     public int result = -1;
     public IMMResult() {
         super(null);
}

@Override
public void onReceiveResult(int r, Bundle data) {
    result = r;
}

// poll result value for up to 500 milliseconds
public int getResult() {
    try {
        int sleep = 0;
        while (result == -1 && sleep < 500) {
            Thread.sleep(100);
            sleep += 100;
        }
    } catch (InterruptedException e) {
        Log.e("IMMResult", e.getMessage());
    }
    return result;
}
}

그런 다음이 방법을 썼습니다.

public boolean isSoftKeyboardShown(InputMethodManager imm, View v) {

    IMMResult result = new IMMResult();
    int res;

    imm.showSoftInput(v, 0, result);

    // if keyboard doesn't change, handle the keypress
    res = result.getResult();
    if (res == InputMethodManager.RESULT_UNCHANGED_SHOWN ||
            res == InputMethodManager.RESULT_UNCHANGED_HIDDEN) {

        return true;
    }
    else
        return false;

}

그런 다음이를 사용하여 소프트 키보드를 열었을 수있는 모든 필드 (EditText, AutoCompleteTextView 등)를 테스트 할 수 있습니다.

    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    if(isSoftKeyboardShown(imm, editText1) | isSoftKeyboardShown(imm, autocompletetextview1))
        //close the softkeyboard
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

물론 이상적인 솔루션은 아니지만 작업이 완료됩니다.


답변

showSoftInput () 및 hideSoftInput ()의 콜백 결과를 사용하여 키보드 상태를 확인할 수 있습니다. 자세한 내용 및 예제 코드

http://www.ninthavenue.com.au/how-to-check-if-the-software-keyboard-is-shown-in-android