w446108264 / XhsEmoticonsKeyboard

android emoticonsKeyboard support emoji and user-defined emoticon. easy to integrated into your project
2.85k stars 597 forks source link

Activity中使用android:windowSoftInputMode="adjustPan"点击编辑框软键盘会顶起表情面板 #22

Closed kebuwei closed 8 years ago

kebuwei commented 8 years ago

说明:Activity中使用不使用任何android:windowSoftInputMode属性,点击编辑框弹出软键盘正常的。

Activity中使用android:windowSoftInputMode="adjustPan"属性: 问题1:点击编辑框软键盘会顶起表情面板,发现出现的步骤是:表情面板收起的时候,点击编辑框,软件盘键表情面板顶起来; 问题2:表情面板显示的时候,点击边框,软键盘正常显示,点击物理返回键,整个界面闪动。

使用android:windowSoftInputMode="adjustPan"属性原因:做视频类的界面,底层是播放器,不使用该属性则会压缩变形。

w446108264 commented 8 years ago

XhsEmoticonsKeyboard监听软键盘的原理是监听可视区域高度的变化。

https://github.com/w446108264/XhsEmoticonsKeyboard/blob/master/XhsEmoticonsKeyboard/library/src/main/java/sj/keyboard/widget/SoftKeyboardSizeWatchLayout.java

getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Rect r = new Rect();
                ((Activity) mContext).getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
                // ...
            }
}

默认使用android:windowSoftInputMode="adjustResize"。 当软键盘弹出时压缩可视区域,在AutoHeightLayout中控制底层layout的onMeasure,从而实现不压缩无闪烁的效果。 adjustPan没有调整窗口的大小,在这里并不适用

https://github.com/w446108264/XhsEmoticonsKeyboard/blob/master/XhsEmoticonsKeyboard/library/src/main/java/sj/keyboard/widget/AutoHeightLayout.java

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if(mConfigurationChangedFlag){
            mConfigurationChangedFlag = false;
            Rect r = new Rect();
            ((Activity) mContext).getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
            if (mScreenHeight == 0) {
                mScreenHeight = r.bottom;
            }
            int mNowh = mScreenHeight - r.bottom;
            mMaxParentHeight = mNowh;
        }

        if (mMaxParentHeight != 0) {
            int heightMode = MeasureSpec.getMode(heightMeasureSpec);
            int expandSpec = MeasureSpec.makeMeasureSpec(mMaxParentHeight, heightMode);
            super.onMeasure(widthMeasureSpec, expandSpec);
            return;
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

回到问题 做视频类的界面,底层是播放器,不使用该属性则会压缩变形。 同样可以用该方法来保证播放器不被压缩。 或者重写AutoHeightLayout的onMeasure

kebuwei commented 8 years ago

大概明白了,谢谢啊,addOnGlobalLayoutListener这个监听我有留意,不使用adjustResize属性重写AutoHeightLayout的onMeasure去实现,不过具体怎么去控制我还是不太懂,先研究下,要是可以提供一些案例就最好了

xiang23 commented 7 years ago

请问android:windowSoftInputMode是如何解决的呢?同样在视频类界面遇到这个问题