2014-01-31 192 views
2

我試圖限制用戶輸入。如果用戶輸入連續的數字,例如像這樣的1232334,以及連續的特殊字符,例如!@%$^&#@ $ *。但它可以讓用戶輸入序號,如1st,2nd等,而且它也允許John 13:12。一節經文。Android限制用戶輸入

這是我已經試過:(我用的輸入過濾器)

InputFilter filter = new InputFilter() { 
     @Override 
     public CharSequence filter(CharSequence source, int start, int end, 
       Spanned dest, int dstart, int dend) { 
      // TODO Auto-generated method stub 
      for (int i = start; i < end; i++) { 
       if (!Character.isLetterOrDigit(source.charAt(i))) { 
        return ""; 
        } 
      } 
      return null; 
     } 
    }; 

    et.setFilters(new InputFilter[]{filter}); 

但它不會讓我輸入特殊字符時,它可以接受連續的數字。有誰知道如何達到我的要求?你非常感謝。謝謝。

+0

使用InputFilter似乎絕對是這樣做的方式。爲了確定允許的數據組合,我試着使用正則表達式。我沒有完全理解您對允許的輸入數據的描述,因此我無法進一步幫助您。 –

+0

@HansHohenfeld嗨,感謝您的即時回覆,正如我所說的,我想限制用戶的連續挖掘和特殊字符。這是不允許的:1231414 $ @#(@)(@#。唯一允許的輸入數據是:1st,2nd,John 14:18 – Dunkey

+0

@Donkey是那些固定值?或模式,即第3,13或Hans 09 :21也允許? –

回答

2

試試這個測試的解決方案。

import android.app.Activity; 
import android.os.Bundle; 
import android.text.InputFilter; 
import android.text.Spanned; 
import android.widget.EditText; 

public class MainActivity extends Activity { 

    EditText et; 
    String specialCharSet = "[email protected]%$^&#@$*"; 

    InputFilter filter = new InputFilter() { 
     @Override 
     public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 
      String tmp; 
      try { 
       tmp = (et.getText().toString()).substring(et.getText().toString().length() - 2, et.getText().toString().length()); 

       if (Character.isDigit(tmp.charAt(0)) && Character.isDigit(tmp.charAt(1)) && Character.isDigit(source.toString().charAt(0))) { 
        return ""; 
       } 

       if (specialCharSet.contains("" + tmp.charAt(1)) && specialCharSet.contains("" + source)) { 
        return ""; 
       } 
      } catch (Exception e) { 
       if (et.getText().toString().length() >= 1 && specialCharSet.contains("" + et.getText().toString().charAt(0)) && specialCharSet.contains(source)) { 
        return ""; 
       } 
      } 

      return null; 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     et = (EditText) findViewById(R.id.et); 
     et.setFilters(new InputFilter[] { filter }); 

    } 

} 
+0

這完美的作品! – Dunkey

1

我建議改變你的執行方式如下:

  • 建立輸入兩種模式,你讓
  • 建立,將導致從用戶的輸入來自源的信息串正則表達式,開始,爲此,DEST,dtsart和DEND
  • 檢查該字符串相匹配的兩個正則表達式中的一個,如果不返回「」

這應該多做IT運少了。幾個月前我做過類似的事情。如果你幸運的話,我可以在這裏找到代碼並粘貼到這裏,當我今晚回家的時候:)但總的來說,這應該是非常簡單的。如果您不確定source,start,end,dest,dstart和dend的值,請在調試器中檢查它們以獲得更好的理解。

- 更新 - 好消息是,我發現我在我曾經在這裏發表代碼有問題;)

public class MoneyFilter implements InputFilter { 

    @Override 
    public CharSequence filter(CharSequence source, int start, int end, 
     Spanned dest, int dstart, int dend) { 

     // The regex to test the string 
     String testRegex = "^\\d+\\,?\\d{0,2}$"; 

     String s = source.toString(); 
     String d = dest.toString(); 

     // Build the string that would return from the user's input 
     String r = d.substring(0, dstart) + s.substring(start, end) 
      + d.substring(dend); 

     // And check it 
     if (r.matches(testRegex)) { 
      return null; 
     } else { 
      return ""; 
     } 
    } 
} 

你關過程中需要不同的正則表達式匹配字符串,但其餘的代碼應該工作。

希望這有助於

問候,

漢斯

+0

你可以給我一些樣例實現嗎?我不太擅長Regex – Dunkey

+0

如果我是前段時間寫過的InputFilter,將會粘貼它(在幾個小時內),但這不會幫助你正規表達式。雖然我不會給你寫一些正則表達式,但是你可以檢查它,例如http://www.vogella.com/tutorials/JavaRegularExpressions /article.html來獲得它。 –

+0

我已經添加了我的示例,正​​如我所說,在您的cae中,我將構建兩個正則表達式,每個模式一個,並測試我的字符串是否匹配其中的一個。 –