Android - 如何在程序中实现类似于双击Shift键开启大写锁定的功能

3

这个问题与已经在这里提出的所有其他问题都不同。

问题和疑问

我想要像双击(或长按)Shift键一样启用大写锁定,当打开键盘时。 另一个请求是,如果用户按下Shift键,则必须禁用大写锁定。

我已经尝试了stackoverflow中提出的大多数解决方案,例如android:inputType="textCapCharacters"setAllCaps(true),但是会发生的情况是无法禁用大写锁定。使用上述解决方案,当按Shift键时,用户将插入一个小写字母,并且系统会自动将键盘设置回大写锁定。

这不是我想要的正确方式,我只想在用户第一次打开键盘时启用大写锁定,然后他将自己处理大写状态。

注意

请记住,我以“像双击(或长按)Shift键一样”开始问题,因为使用inputType解决方案,您会遇到以下情况: enter image description here 它没有白色大写锁定符号,就像我手动启用大写锁定一样: enter image description here


1
你可以通过编程设置edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});来实现。 - Shivanshu Verma
使用android:inputType="textCapCharacters" - Naz141
谢谢@ShivanshuVerma的尝试,但它与android:inputType="textCapCharacters"具有相同的行为:字母始终是大写的,并且无法通过点击Shift键来转换为小写。 - Link 88
1个回答

0

我已经找到了解决问题的方法!

我必须继续使用android:inputType="textCapCharacters",但是当用户按下Shift键并输入一个小写字母时,TextWatcher会删除标志textCapCharacters

以下是执行此操作的TextWatcher:

public class EditTextWatcher  implements  TextWatcher{

    private EditText editText;

    public PtlEditTextWatcher(EditText editText) {
        this.editText = editText;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) { }

    @Override
    public void afterTextChanged(Editable s) {
        if (editText != null && s.length() > 0 && (editText.getInputType() & InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS) > 0)
            if (Character.isLowerCase(s.toString().charAt(s.length() - 1)))
                editText.setInputType(editText.getInputType() & ~InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
    }
}

它的一种简单用法是:

addTextChangedListener(new EditTextWatcher(myEditText));

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