Qt Android: 当我在QLineEdit中输入时,虚拟键盘不停地切换到大写。

8

当我在QLineEdit中输入时,虚拟键盘会以大写字母开头。即使我将其设置为小写,一旦我输入一个字符,它就会返回到大写状态。也就是说,每次输入一个字符后,键盘都会重新设置为大写。

即使在一个新创建的项目中(我只是添加了一个行编辑器并运行它),这种情况仍然发生。

我发现了一个关于同样问题的论坛帖子 - https://groups.google.com/forum/#!topic/android-qt/QMFZmkACAIA

我正在使用Qt/C++(而不是QML)。

编辑:刚刚在一个新的QML项目上测试了一下,bug也存在。我还找到了一篇有关QML的贴子 - https://groups.google.com/forum/#!msg/android-qt/BzGDGoLNtYc/TdtOX9MW3vIJ

编辑2: 我使用了inputMethodHints()进行测试,唯一生效的是ImhNoAutoUppercase。但是它仍然以大写字符开头,并且当按下返回按钮(删除最后一个字符)时,键盘会再次切换到大写,即使您已经输入了几个字母。在第一个字母之后,它会切换为小写,如果您不按返回按钮,则它基本正常工作。

希望这个链接能有所帮助,但我对它不太熟悉。很抱歉我不能提供更多的帮助:http://grokbase.com/t/gg/android-qt/12akn19zck/qlineedit-issue - Zac Wimer
1个回答

2

编辑:一个比较好的解决办法是设置ImhNoAutoUppercase,第一个字母仍然大写,但至少您输入的下一个字母将是小写。

原始答案: 在Android中,可以在Activity/Fragment(您正在查看的屏幕/页面)的布局文件的EditText上使用inputType进行设置。您能直接访问和编辑Android的布局文件吗?

您是否使用setInputMask()来控制输入类型?可能是强制小写(或切换大小写转换)给出了使用大写或小写的选项。我猜在Android的布局xml文件中设置的是inputType="textCapSentences"或类似的内容( https://developer.android.com/training/keyboard-input/style.html )。

更新:您提到问题已在5.4中解决。这看起来像是修复它的提交。我建议只实现这里显示的修复。 https://qt.gitorious.org/qt/qtbase/commit/2b3f293d892c5268bd2a07ed17fa9fc5adacbd76

您提到您乐意编辑Qt源代码。我认为错误可能在src/org/qtproject/qt5/android/QtActivityDelegate.java的这部分中。

        if ((inputHints & ImhUppercaseOnly) != 0) {
            initialCapsMode |= android.text.TextUtils.CAP_MODE_CHARACTERS;
            inputType |= android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS;
        } else if ((inputHints & ImhLowercaseOnly) == 0 && (inputHints & ImhNoAutoUppercase) == 0) {
            initialCapsMode |= android.text.TextUtils.CAP_MODE_SENTENCES;
            inputType |= android.text.InputType.TYPE_TEXT_FLAG_CAP_SENTENCES; 
        }

应该被更改为:

        if ((inputHints & ImhUppercaseOnly) != 0) {
            initialCapsMode |= android.text.TextUtils.CAP_MODE_CHARACTERS;
            inputType |= android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS;
        } else if ((inputHints & ImhLowercaseOnly) == 0 && (inputHints & ImhNoAutoUppercase) == 0) {
            //initialCapsMode |= android.text.TextUtils.CAP_MODE_SENTENCES; // not sure what to set here - could try 0 or null if commenting out line doesn't work
            inputType |= android.text.InputType.TYPE_CLASS_TEXT; 
        }

如果这样还无法解决问题,我建议搜索源代码中的 android.text.InputType.TYPE_TEXT_FLAG_CAP 或 android.text.TextUtils.CAP_MODE,并通过试错方法进行替换。

这发生在一个刚创建的项目上,只有一个行编辑器。 - sashoalm
我现在有点忙,但我会尽量在今天或明天测试你的建议。 - sashoalm
我有一个AndroidManifest.xml文件,看起来像这样 - http://pastebin.com/CadhLGEi。这是我应该放inputType的地方吗? - sashoalm
关于setInputMask,那种方法不会限制可以输入哪些键吗?我不想限制它们,我仍然希望能够输入大写字母。我现在将尝试您的新建议。 - sashoalm
错误提示表明系统对QtActivityDelegate.java存在两个版本感到不满意:您的版本和jar包中的版本。这意味着需要创建自己的jar版本(或在Eclipse或Android Studio中将其导入为项目)。我不确定Qt的过程是否有为贡献者使用构建工具完成此操作的过程。他们有一个邮件列表(http://lists.qt-project.org/mailman/listinfo/android-development),那里的某个人可能能够帮助您 - 包括修复您在大小写方面遇到的问题。 - TTransmit
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接