【问题标题】:Android softkeyboard turn on caps lock after symbolAndroid软键盘在符号后打开大写锁定
【发布时间】:2014-06-20 13:25:44
【问题描述】:

我有一个编辑文本字段。编辑文本已使用不可见符号创建,例如“#” - 不可见符号。当用户点击 EditText 时,它会在虚拟键盘上显示小写字母。

我希望在不可见符号的第一个字母大写之后,其余的在键盘上很小。

如何做到这一点?

【问题讨论】:

  • Edit text has created with invisible symbol 是什么意思?
  • 我想,他是在第一个字母处初始化#。为什么在java端取值时不能动态添加#??
  • shylendra, EditText mEditText = (EditText)findViewById(...); mEditText.setText('#');用户只能在此符号后输入。 Jithu,因为#是新段落的新符号。它需要正确应用ParagraphSpans

标签: android


【解决方案1】:

最后我找到了解决方案。我通过 InputType 解决了这个问题。这很糟糕,但我没有找到更好的。 在 CustomEditText 中,您应该重写方法 onSelectionChanged 并在那里更改 InputType:

public boolean isWasCap = false;// Was capitalisation turn on?

public void onSelectionChanged(int selStart, int selEnd) {
    ...

    setCap();
}

/**
 * Method check is need turn on capitalization
 */
private void setCap(){
    int start = getSelectionStart();
    int end = getSelectionEnd();
    if (start == end && start > 0
            && getText().charAt(start-1) == INVISIBLE_SYMBOL) {
        if(isWasCap) // Capitalization is turn on 
            return;
        setInputMask(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
        isWasCap = true;
    }else if(isWasCap){
        isWasCap = false;
        setInputMask(InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
    }
}

/**
 * Method replace one input type to other input type
 * @param needRemove - mask which will remove
 * @param needSetup - masr which will setup
 */
public void setInputMask(int needRemove, int needSetup){
    int mask = getInputType() & ~needRemove;
    mask = mask | needSetup;
    setInputType(mask);
}

style.xml

<style name="Common.Editor">

   <item name="android:inputType">textCapSentences|textMultiLine|textAutoCorrect</item>
</style>

main_activity.xml

 <com.view.CustomEditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/Common.Editor"
        />

【讨论】:

  • 太棒了!正是我所需要的,并且像魅力一样工作。但是我简化了代码:int inputType = getInputType(); if (selStart
  • @Ridcully 我必须警告你,这个解决方案有一些缺陷: 1)如果用户通过滑动输入文本,所有将被粘贴到 EditTtext 的文本都将被大写后者。它需要在 TextWatcher 中进行监控。 2) 将要输入的单词在不同设备上的自动完成中会以不同的方式工作。一个不会自动补全这个词,另一个会自动补全这个词,没有先,另一个会自动补正。
  • 感谢您的警告。那么你是如何实现 TextWatcher 的呢?这就是你有 isWasCap 变量的原因吗?
  • @Ridcully isWasCap 需要用户选择第一个位置(并且我们已经打开大写)的情况,然后他将再次选择这个位置(或者将选择另一个需要打开的段落大写)不会打开大写,因为它之前已打开。也需要关闭大写,如果用户改变光标位置并且isWasCap == true,大写将关闭。
  • 嗨 Dima,在挖掘了 Android 源代码后,我找到了一个非常简单的解决方案,您可能也可以使用:打开或关闭 caps 的决定一直到方法 @ 987654324@ 并且此方法在做出决定之前会跳过字符 " 和 '。因此,如果您使用其中一个字符(而不是您的 #),则大写就可以正常工作,也可以使用 swyping 等。无需摆弄 InputType 或任何东西.
【解决方案2】:

只需在您的 EditText 上设置 android:inputType="textCapSentences"

android:inputType="textCapWords"

【讨论】:

  • 我想,他是在第一个字母处初始化#。所以这可能行不通。
猜你喜欢
  • 2011-02-20
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多