【问题标题】:Android set EditText to show caps but keep original user input valuesAndroid 将 EditText 设置为显示大写,但保留原始用户输入值
【发布时间】:2016-02-10 19:03:59
【问题描述】:

如何将EditText 中的文本显示为全部大写,但保存用户的原始输入?

我尝试过使用InputFilters,但没有成功。

有什么线索吗?

编辑:

我已经在使用以下代码:

editText.setFilters(new InputFilter[] {new InputFilter.AllCaps()});

问题在于不显示大写字母,问题在于保持原始用户的值。

【问题讨论】:

  • 听起来我会为 EditText 创建一个子类。
  • 如果用户键入 HeLlOwOrLd 但显示为 HELLOWORLD,您想保留,我错了吗?
  • @Skizo 你是对的

标签: android android-edittext uppercase


【解决方案1】:

创建an implementation of TransformationMethod,在getTransformation() 中,您将输入文本转换为全部大写。输入文本本身不变;您从getTransformation() 返回的值就是向用户显示的值。最常见的TransformationMethodPasswordTransformationMethod——这是在输入密码时给你的点。

这可以像创建 a subclass of ReplacementTransformation,覆盖 getOriginal() 以返回字母和 getReplacement() 以返回它们的全大写等效项一样简单。

在实现这一点时要小心考虑语言环境,以便您处理用户当前语言的大小写。

【讨论】:

  • 这个比较像,有没有这个的实现代码?我第一次调查TransformationMethod
  • @AndyRoid:不是真的。这是一个相当小众的情况。虽然在 Google 上快速搜索会出现 github.com/ZieIony/Carbon/blob/master/carbon/src/main/java/…,但这看起来就是您所追求的。
  • 谢谢!这很有用。
【解决方案2】:

基于 CommonsWare 的洞察力,我能够将以下实现放在一起。请注意,这并没有考虑其他语言,稍后会对此进行优化。

您需要像这样设置ReplacementTransformationMethod

public class UpperCaseTransformationMethod extends ReplacementTransformationMethod {

    private static final char[] ORIG = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
        'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
    private static final char[] REPL = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
        'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };


    public UpperCaseTransformationMethod() {}

    @Override
    public CharSequence getTransformation(CharSequence source, View v) {
        return super.getTransformation(source, v);
    }

    @Override
    public char[] getOriginal() {
        return ORIG;
    }

    @Override
    protected char[] getReplacement() {
        return REPL;
    }

}

然后您只需将此方法应用于您的EditText,如下所示:

editText.setTransformationMethod(new UpperCaseTransformationMethod());

这会将字符显示为大写,但会保留其原始输入。

然后您可以通过调用来获取原始输入:

String originalInput = editText.getText().toString();

【讨论】:

    【解决方案3】:

    您需要在 EditText 上设置一个 TextChangedListener。你可以做这样的事情-

    edittext = (EditText)findViewById(R.id.edittext);
        edittext.addTextChangedListener(new TextWatcher() {
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if(s.length()>0)
                {
    
                //Handle the text here. 
                }
            }
    
            @Override
            public void afterTextChanged(Editable s) {
    
            }
        });
    

    【讨论】:

    • 请解释这是如何回答问题的。特别是,请解释这如何改变用户看到的内容,但不会改变用户输入的实际值。
    • 这没有回答原来的问题。
    【解决方案4】:

    方法太多了:

    如果你想在xml 上声明它,你可以这样做:

    android:inputType="textCapCharacters"
    

    android:textAllCaps="true"
    

    如果你想以编程方式放置它,你可以创建一个filter,如下所示:

    Your_Edit_Text.setFilters(new InputFilter[] {new InputFilter.AllCaps()});
    

    如果你想获取用户输入的内容,你可以使用TextWatcher

    下面是一个例子:

    Your_Edit_Text.addTextChangedListener(new TextWatcher() {
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
        }
    });
    

    【讨论】:

    • 这是错误的。我目前正在使用new InputFilter.AllCaps(),问题不是在编辑文本中显示大写字母,而是保留用户键入的原始值。按照自己的方式进行操作并致电editText.getText().toString() 将全部大写。我不知道为什么这么多人赞成,这是一个基本的答案,不是特别适合我的用例。
    • 尝试查看 CommonWares 的答案,我正在测试它。
    • 我删除了我的反对票,但我想阻止这样的答案,因为这意味着用户必须筛选其他答案才能找到正确的答案。下次请仔细阅读问题。
    • @AndyRoid 我不知道你已经得到了“所有字母大写”,我想给你一个例子来说明如何做到这一点是个好主意......和TextWatch我认为阅读用户编写的文本会很有用。无论如何谢谢..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2016-01-13
    • 2012-06-02
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    相关资源
    最近更新 更多