투케이2K

303. (AndroidStudio/android/java) KeyboardState 가상 키보드 호출 상태 및 높이 사이즈 확인 실시 본문

Android

303. (AndroidStudio/android/java) KeyboardState 가상 키보드 호출 상태 및 높이 사이즈 확인 실시

투케이2K 2022. 6. 14. 17:34

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : java

 

[KeyboardState : 소스코드]

import android.app.Activity;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.view.Gravity;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.widget.PopupWindow;

public class KeyboardState extends PopupWindow implements ViewTreeObserver.OnGlobalLayoutListener {


    // TODO [전역 변수 선언 실시]
    private Activity mActivity;
    private View rootView;
    private HeightListener heightListener;
    private int heightMax;




    // TODO [클래스 생성자 초기화]
    public KeyboardState(Activity activity){
        super(activity);
        this.mActivity = activity;

        rootView = new View(activity);
        setContentView(rootView);

        rootView.getViewTreeObserver().addOnGlobalLayoutListener(this);
        setBackgroundDrawable(new ColorDrawable(0));

        setWidth(0);
        setHeight(WindowManager.LayoutParams.MATCH_PARENT);

        // TODO [AndroidManifest.xml 파일에서 설정한 액티비티 형식]
        setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
    }





    // TODO [init 메소드 정의]
    public KeyboardState init(){
        if (!isShowing()){
            final View view = mActivity.getWindow().getDecorView();
            view.post(new Runnable() {
                @Override
                public void run() {
                    showAtLocation(view, Gravity.NO_GRAVITY, 0, 0);
                }
            });
        }
        return this;
    }





    // TODO [이벤트 리스너]
    public KeyboardState setHeightListener(HeightListener listener){
        this.heightListener = listener;
        return this;
    }





    // TODO OnGlobalLayoutListener 메소드
    @Override
    public void onGlobalLayout() {
        Rect rect = new Rect();
        rootView.getWindowVisibleDisplayFrame(rect);
        if (rect.bottom>heightMax){
            heightMax = rect.bottom;
        }

        int keyboardHeight = heightMax - rect.bottom;
        if(heightListener != null){
            heightListener.onHeightChanged(keyboardHeight);
        }
    }





    // TODO [인터페이스 정의]
    public interface HeightListener {
        void onHeightChanged(int height);
    }

} // TODO [클래스 종료]
 

[사용하는 쪽 : 소스코드]

    // TODO [액티비티 생명 주기 상태 체크 메소드]
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            // [타이틀바 없애기 : FEATURE_NO_TITLE]
            requestWindowFeature(Window.FEATURE_NO_TITLE);
        }
        catch (Exception e){
            e.printStackTrace();
        }
        // [액티비티 레이아웃 지정 실시]
        setContentView(R.layout.a_main);

        // -----------------------------------------
        // TODO [모바일 가상 키보드 호출 및 높이 감지 등록]
        new KeyboardState(this).init().setHeightListener(heightListener);
        // -----------------------------------------

    } // TODO [메인 종료]





    // TODO [가상 키보드 이벤트 감지 이벤트 리스너]
    KeyboardState.HeightListener heightListener = new KeyboardState.HeightListener() {
        @Override
        public void onHeightChanged(int height) {
            Log.i("---","---");
            Log.w("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onHeightChanged() :: 가상 키보드 호출 및 높이 확인]");
            Log.i("","\n"+"[height :: "+String.valueOf(height)+"]");
            Log.w("//===========//","================================================");
            Log.i("---","---");
        }
    };
 

[결과 출력]

 

 

반응형
Comments