안드로이드 전체 화면 소프트 키보드 수신

20010 단어 공구.
안드로이드 개발 학생들은 안드로이드 시스템은 소위 소프트 키보드 감청을 제공하지 않고 스위치 소프트 키보드와 관련된api만 제공한다는 것을 알고 있다.
 /**
     *      
     * @param activity
     */
    public static void showKeybord(Activity activity,EditText et) {
        InputMethodManager imm =  (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if(imm != null) {
             imm.showSoftInput(et, 0);
        }
    }
/**
     *      
     * @param activity
     */
    public static void closeKeybord(Activity activity) {
        InputMethodManager imm =  (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if(imm != null) {
            imm.hideSoftInputFromWindow(activity.getWindow().getDecorView().getWindowToken(), 0);
        }
    }

Activity 테마(Theme)가 전체 화면 테마(fullscreen)가 아닌 몰입식으로 개발되었을 때, DecordView를 통해 ViewTreeObserve를 가져와 Layout의 변화를 감청할 수 있지만, 전체 화면 테마를 사용할 때 감청이 아무런 작용이 없다는 것을 알게 되면 인터넷에서 베낀 Utils도 모두 효력을 상실하게 된다.
그러면 우리는 전체 화면에서 소프트 키보드의 상태를 감청하여 우리의 개발 업무의 수요에 부합할 수 있습니까?
정답은 긍정적입니다.
우리는 팝윈도를 추가해서 소프트 키보드를 감청할 수 없는 문제를 해결하고 코드에 직접 올릴 수 있다
public class FullScreenKeyboardHeightProvider extends PopupWindow implements OnGlobalLayoutListener {
    private Activity mActivity;
    private View mRootView;
    private HeightListener mHeightListener;
    private int mHeightMax; //   popup        
    private int mKeyboardHeight;

    public FullScreenKeyboardHeightProvider(Activity activity) {
        super(activity);
        this.mActivity = activity;

        //     
        mRootView = new View(activity);
        setContentView(mRootView);

        //     Layout  
        mRootView.getViewTreeObserver().addOnGlobalLayoutListener(this);
        setBackgroundDrawable(new ColorDrawable(0));

        //      0,     
        setWidth(0);
        setHeight(LayoutParams.MATCH_PARENT);

        //         
        setSoftInputMode(LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
    }

    public FullScreenKeyboardHeightProvider init() {
        if (!isShowing()) {
            final View view = mActivity.getWindow().getDecorView();
            //     popupwindow,          
            view.post(new Runnable() {
                @Override
                public void run() {
                    showAtLocation(view, Gravity.NO_GRAVITY, 0, 0);
                }
            });
        }
        return this;
    }

    public FullScreenKeyboardHeightProvider setHeightListener(HeightListener listener) {
        this.mHeightListener = listener;
        return this;
    }

    @Override
    public void onGlobalLayout() {
        Rect rect = new Rect();
        mRootView.getWindowVisibleDisplayFrame(rect);
        if (rect.bottom > mHeightMax) {
            mHeightMax = rect.bottom;
        }
        //             
        int currentKeyboardHeight = mHeightMax - rect.bottom;
        if (currentKeyboardHeight==mKeyboardHeight){
            return;
        }
//
        if (mHeightListener != null) {
            ValueAnimator valueAnimator = ValueAnimator.ofInt(mKeyboardHeight, currentKeyboardHeight);
            valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    int animatedValue = (int) animation.getAnimatedValue();
                    mHeightListener.onHeightChanged(animatedValue);
                }
            });
            valueAnimator.addListener(new Animator.AnimatorListener() {
                @Override
                public void onAnimationStart(Animator animation) {

                }

                @Override
                public void onAnimationEnd(Animator animation) {
                    mKeyboardHeight = currentKeyboardHeight;
                }

                @Override
                public void onAnimationCancel(Animator animation) {

                }

                @Override
                public void onAnimationRepeat(Animator animation) {

                }
            });
            mHeightListener.onHeightChanged(mKeyboardHeight);
            valueAnimator.setDuration(200);
            valueAnimator.setInterpolator(new DecelerateInterpolator());
            valueAnimator.start();
        }
    }

    public interface HeightListener {
        void onHeightChanged(int height);
    }
 }

demo 다운로드 주소

좋은 웹페이지 즐겨찾기