【问题标题】:Qt Android: Virtual keyboard keeps switching to uppercase when I type in a QLineEditQt Android:当我输入 QLineEdit 时,虚拟键盘不断切换为大写
【发布时间】:2014-08-12 11:50:50
【问题描述】:

当我输入 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。但是它仍然以大写字符开头,当按下后退按钮(删除最后一个字符)时,即使您输入了几个字母,键盘也会再次切换到大写字母。在第一个字母之后它会切换为小写,如果你不按后退按钮,它几乎可以正常工作。

【问题讨论】:

标签: android c++ qt android-virtual-keyboard


【解决方案1】:

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

原答案: 在 Android 中,这将在 Activity/Fragment(您正在查看的屏幕/页面)的布局文件的 xml 中的 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 的源代码,并通过反复试验替换它们。

【讨论】:

  • 这发生在一个新创建的项目上,只需要进行一行编辑。
  • 使用 setInputMask 会阻止第一个字符变为大写吗?设置一个 QValidator 怎么样?
  • 我现在有点忙,但我会在今天或明天尝试测试您的建议。
  • 我有一个 AndroidManifest.xml 文件,看起来像这样 - pastebin.com/CadhLGEi。这是我应该放置 inputType 的地方吗?
  • 要在 Android 中更改 xml 中的 inputType,您通常需要在 res/layouts 或 styles.xml 中工作。如果 AndroidManifest.xml 是您可以访问的唯一 xml,那么该方法将不起作用。我认为有问题的 QLineEdit 将在 C++ 中设置 setInputMask 和 QValidator 。你可能很幸运,因为我认识的人昨天问我是否想接受一份 Qt 工作,这给了我一个设置 Qt 的理由。我可以在 Qt Android 源代码中看到问题。我需要设置 Qt 来测试我认为的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2011-07-12
  • 1970-01-01
相关资源
最近更新 更多