2015-10-17 38 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()});