[1.9.3 版本] EditBox及输入法光标问题

用输入框遇到的两个问题,不知道有没有大佬能够提供指导或解决方案,小弟拜谢啦!

1.魅族手机用EditBox无法输入中文,打的字全是字母现实;

2.web与手机上输入框的光标都有问题,就是一句话,手动把光标移到中间,想要进行删除或插入文字操作,但是删除一个字符(或新打一个字)后光标又跑到最后了!

以上,有遇到的大大提点提点~(•́₃•̀)

1赞

我也发现了… 用其他手机输入中文没问题

好忧伤,这些BUG单只能一直挂着-,-

最近清理游戏BUG单,又把第二个输入框光标问题找了出来。去看了下安卓输入框部分的源码,发现每次输入框文本变化时引擎就将光标设置到最后,抱着尝试修改光标行为的想法做了些修改,发现还真能修复:grinning:

贴上自己的修改供大家参考,总共修改两个JAVA代码:

Cocos2dxEditBox.java:

//添加两个私有变量
private int mCurTextLen = 0;
private int mForceCursorPos = 0;

public void setText(String text) {
    String newText = updateDomTextCases(text);
    super.setText(newText);
    this.mCurTextLen = newText.length();        //!@
    //this.setSelection(newText.length());         //注释原来的方法
}

//!@ 新添加方法
public void forceCursorPos(int forcePos) {
    this.mForceCursorPos = forcePos;
}

//!@ 新添加方法
public void updateCursorPos() {
    int newPos = this.mForceCursorPos < 0 ? 0 : this.mForceCursorPos > this.mCurTextLen ? this.mCurTextLen : this.mForceCursorPos;
    this.setSelection(newPos);
    this.mForceCursorPos = 0;
}

Cocos2dxEditBoxHelper.java:

        //修改 beforeTextChanged 方法内容,大概在Line 123
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    int selectionStart = editBox.getSelectionStart();
                    int selectionEnd = editBox.getSelectionEnd();
                    if (selectionStart != selectionEnd || (count > 0 && after > 0)) {   //选择操作(通过长按输入框使用前后光标选择一段文本进行操作: 删除或者整段替换)
                        editBox.forceCursorPos(start + after);
                    } else {    //正常操作
                        editBox.forceCursorPos(selectionStart - count + after);
                    }
                }

        //这个函数只修改添加 updateCursorPos()方法
        public void afterTextChanged(final Editable s) {
                    if (!editBox.getChangedTextProgrammatically()) {

                        // fix fireball/issues/7726
                        // Remove the current listener first to avoid endless loops.
                        editBox.removeTextChangedListener(this);
                        editBox.setText(editBox.getText().toString());
                        editBox.updateCursorPos();          //!@   在这里更新光标位置
                        // Resume listening.
                        editBox.addTextChangedListener(this);

                        if((Boolean)editBox.getTag()) {
                            mCocos2dxActivity.runOnGLThread(new Runnable() {
                                @Override
                                public void run() {
                                    Cocos2dxEditBoxHelper.__editBoxEditingChanged(index, s.toString());
                                }
                            });
                        }
                    }
                    editBox.setChangedTextProgrammatically(false);

                }

已测试两个安卓机与一个模拟器,欢迎大家指正

1赞

EditBox多行时你这样修改光标位置还是有问题

额,具体是什么问题呢;
现在项目里有用到一个多行的EditBox,是可以插入输入的-,-