프로그래밍 언어/Android

Android에서 소프트웨어 키보드가 표시되는지 확인하는 방법

Rateye 2021. 9. 30. 10:49
728x90
반응형
질문 : Android에서 소프트웨어 키보드의 가시성을 확인하는 방법은 무엇입니까?

아주 간단한 일을해야합니다. 소프트웨어 키보드가 표시되는지 확인합니다. Android에서도 가능합니까?

답변

NEW ANSWER 2012 년 1 월 25 일 추가됨

아래 답변을 작성한 이후 누군가가 ViewTreeObserver 와 버전 1부터 SDK에 숨어있는 API의 존재에 대해 저를 단서했습니다.

사용자 지정 레이아웃 유형을 요구하는 것보다 훨씬 간단한 솔루션은 활동의 루트보기에 알려진 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: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);       
    }

    }

그런 다음 활동 수업에서 ...

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
    }

    ...
}
출처 : https://stackoverflow.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android
728x90
반응형