2015-10-17 35 views
2

我喜欢每次用户输入一个字母到编辑文本中,将字母转换为大写。这里是我的代码:动态设置字母为大写android

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    test = (EditText) findViewById(R.id.test); 
    test.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      beforeStr = s.toString(); 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
       char current = s.charAt(before); 
       newCurrent += String.valueOf(current).toUpperCase() + beforeStr; 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      test.setText(newCurrent); 
     } 
    }); 
} 

setText方法一次又一次地调用TextWatcher的所有方法,我的转换永远不会结束。

有人能帮助我吗?

+2

试试这个http://stackoverflow.com/a/25571410/1680426 –

回答

2

您需要确保在更改之前检查您的文本是否为大写。这样它不会再改变它,如果它不需要并且让你进入连续循环。您不需要在beforeTextChangedafterTextChanged内输入任何内容。

例子:

@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
    String upper = s.toString().toUpperCase(); 
    if (!s.equals(upper)) { 
     test.setText(upper); 
    } 
} 

或者你可以简单地在你EditText XML加入这一行。

android:textAllCaps="true" 
+1

你永远要使用'=='或'! ='为字符串相等。这比较对象不是值。相反,你总是希望使用String#equals来进行字符串相等。在上面的代码中,if(s!= upper){'将始终为真,因为即使CharSequence对象具有相同的确切字符,它也不会等于“String”对象。 – JBirdVegas

1

可能更容易只使用Android提供的过滤器

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