2014-01-31 2 views
2

Я пытаюсь ограничить ввод пользователя. Если пользователь вводит последовательные цифры, например, такие как 1232334, и последовательные специальные символы, например, @ @ $ $ & # @ $ *. Но это позволит пользователю вводить порядковые числа, такие как 1-й, 2-й и т. Д. А также это позволит Иоанну 13:12. Тип стиха.Android ограничить ввод пользователя

Это то, что я пробовал: (я InputFilter)

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 $ @ # (@) (@ #. Только допустимые входные данные: 1, 2, Иоанн 14:18 – Dunkey

+0

@ Donkey - это фиксированные значения? Или шаблоны, т. Е. 3-й, 13-й или Ганс 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
  • Проверить, если эта строка соответствует одной из двух регулярных выражений, если не вернуть «»

это должно сделать это более о r меньше. Я сделал что-то подобное несколько месяцев назад. Если вам повезет, я могу найти код и вставить его здесь, когда я буду дома этим вечером :) Но в целом это должно быть довольно прямолинейно. Если вы не уверены в значениях источника, начала, конца, 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 ""; 
     } 
    } 
} 

Вы от курса нужны разные регулярные выражения, чтобы соответствовать строке, но остальная часть кода должна работать.

надеюсь, что это помогает,

С уважением,

Hans

+0

Можете ли вы дать некоторые примеры реализаций? Я не очень хорош в Regex – Dunkey

+0

Если я InputFilter, который я написал некоторое время назад, я 'Вставьте его (через несколько часов), но это не поможет вам с регулярными выражениями. Однако я не буду писать вам некоторые регулярные выражения, но вы можете проверить, например, http://www.vogella.com/tutorials/JavaRegularExpressions /article.html, чтобы добраться до него. –

+0

Я добавил свой пример, как я уже сказал, в вашем cae я бы построил два регулярных выражения, по одному для каждого шаблона, и проверил, будет ли моя строка одной из них. –

Смежные вопросы