EditBox 输入内容的时候。页面被顶上去了。

EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。EditBox 输入内容的时候。页面被顶上去了。

没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法

没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法没有解决办法

用3.x的实现去解决吧

问题分析

  • 该问题出现在安卓上,在IOS上并没有这个问题,所以大概率是安卓上面的设置问题导致。查询相关资料之后发现是在activity中有一处设置"setSoftInputMode",有些是在AndroidManifest.xml中设置,有些是在activity中的windows中设置,whatever都是一个道理。
  • 网上找到一篇文章非常详细的介绍了关于软键盘设置介绍,传送门
  • 根据上面的介绍,我们在Cocos2dxActivity.java文件中修改了这段代码:
        Window window = this.getWindow();
        //window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
    

    在注释掉原有的代码修改为SOFT_INPUT_ADJUST_NOTHING之后,windows将不会根据键盘的调整而做resize处理。

  • 问题又来了,上面的输入框没有了?

    接下来,我们分析Cocos2dxEditBox.java的源码,再了解这些之前,需要先去了解一下什么是JNI,以及cocos creator中关于EditBox的JNI调用实现。这里我简单写一下creator的调用流程。
    jsb.inputBox -> jsb.showInputBox 这里进入C++层
    JSB_showInputBox -> EditBox::show(此处由EditBox-android实现)-> Cocos2dxEditBox.showNative 这个通过JNI进入Java层
    Cocos2dxEditBox.showNative -> Cocos2dxEditBox.show -> Cocos2dxEditBox.openKeyboard 打开软键盘

  • 分析java中的代码,可以看出在registKeyboardVisible中,通过resize事件判断显示区域的差值,从而判定软键盘的高度是多少,同时由于输入框默认在最底部,resize之后,整个屏幕上移,那么输入框则出现在软键盘的上面;由于设置为NOTHING之后,resize不再被调用到,官方也并没有提供获取软键盘高度的方法,所以无法实现随着软键盘高度的改变设置输入框的位置的办法。

问题解决

当我们解决不了这个问题的时候,就去参考别的代码,于是扒了creator3.0的代码。

  • 添加了一个新的activity,CocosEditBoxActivity.java,同时在manifast文件中也添加这个activity,JNI的调用过程直接修改为调用这个activity来输入文字即可。
  • 由于新启动了一个activity,那么主UI的activity是cocos2dactivity,在editbox的activity激活的时候,主UI则被暂停了,此时输入的结果不会马上在主UI中被显示出来,而且输入的结果保存在activity的一个静态变量内,当主UI重新激活的时候,再来这个变量中获取输入的结果值。

总结后续

在解决的过程中关键点有以下几点:

  1. inputmode的设置
  2. 软键盘的高度获取
  3. activity之间的数据传递
2赞

此处有掌声啪啪啪

Cocos2dxEditBox.java 改这样试试

private void registKeyboardVisible() {
            getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    Rect r = new Rect();
                    getWindowVisibleDisplayFrame(r);
                    int heightDiff = getRootView().getHeight() - (r.bottom - r.top);
                    // if more than a quarter of the screen, its probably a keyboard
                    if (heightDiff > mScreenHeight/4) {
                        if ( Cocos2dxEditText.this.mTopMargin == 0 ) {
                            Cocos2dxEditText.this.setTopMargin(r.bottom);
                        }
                        if (!keyboardVisible) {
                            keyboardVisible = true;
                        }
                    } else {
                        if (keyboardVisible) {
                            keyboardVisible = false;
                            Cocos2dxEditBox.this.hide();
                        }
                    }
                }
            });
        }
4赞