Обнаружение и подсчет специальных символов в EditText-Android



Итак, я делаю заявку, которая включает в себя отправку текстов друг другу. Это будет отправлено через сервер, и не будет иметь ничего общего с самим телефоном (компаниями).



Мы (моя компания и я) решили поставить максимальное количество символов. - 612.



Таким образом, вы можете использовать 612 символьных пространств.



Я заметил, что специальные символы, такие как: é, ñ, á, è, à и т. д... используйте более 1 точки.
Так как страна (Испания), в которой мы работаем, использует много специальных символов, таких как те, мы выбрали, что если человек вводит в один из специальных символов, вместо того, чтобы использовать 1 пятно, используйте 2 пятна.



Итак, в основном то, что я хочу сделать, это, как человек печатает, подсчитать количество специальных символов и "-1" на количество оставшихся символов.



Я не очень старался быть честным, потому что не смог найти ничего подходящего для этой ситуации.

Вот мой метод. (О, и кнопки EditText + etc находятся в Диалог.)



 private void smsPopUp() {
// TODO Auto-generated method stub
final Dialog smsDialog = new Dialog(this);
smsDialog.setContentView(R.layout.sms_dialog);


smsDialog.setCanceledOnTouchOutside(false);
Button cancelsms = (Button)smsDialog.findViewById(R.id.smsCancel);
EditText SmsText = (EditText) smsDialog.findViewById(R.id.etSmsText);

final TextView dialogCharCount = (TextView) smsDialog.findViewById(R.id.tvCharCount);

SmsText.addTextChangedListener(new TextWatcher(){
int i = 0;
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
i = 612 - s.length();
dialogCharCount.setText(String.valueOf(i) + " Characters Remaining..");

}

public void beforeTextChanged(CharSequence s, int start, int count, int after){}
public void onTextChanged(CharSequence s, int start, int before, int count){}

});



smsDialog.setTitle("To: " + numberfield.getText());

cancelsms.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{

smsDialog.dismiss();
}
});

smsDialog.show();

}


Введите описание изображения здесь



(приложение выглядит плохо, но это только начало!)



--- Текущий Код ---



SmsText.addTextChangedListener(new TextWatcher(){
int i = 0;
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
String str = s.toString();
int specialCounter = 0;
//Loop through chars
for (int i = 0, len = str.length(); i < len; ++i) {
Character c = str.charAt(i);
if (c == 'ñ'
|| c == 'á' || c == 'à' || c == 'ã' || c == 'â' || c == 'ä' //a
|| c == 'Á' || c == 'À' || c == 'Ã' || c == 'Â' || c == 'Ä' //A
|| c == 'é' || c == 'è' || c == 'ÿ' || c == 'ê' || c == 'ë' //e + y
|| c == 'É' || c == 'È' || c == 'Ÿ' || c == 'Ê' || c == 'Ë' //E + Y
|| c == 'í' || c == 'ì' || c == 'î' || c == 'ï' //i
|| c == 'Í' || c == 'Ì' || c == 'Î' || c == 'Ï' //I
|| c == 'ó' || c == 'ò' || c == 'õ' || c == 'ô' || c == 'ö' //o
|| c == 'Ó' || c == 'Ò' || c == 'Õ' || c == 'Ô' || c == 'Ö' //O
|| c == 'ú' || c == 'ù' || c == 'û' || c == 'ü' //u
|| c == 'Ú' || c == 'Ù' || c == 'Û' || c == 'ü' //U
) {
specialCounter++;
}
}

i = 612 - s.length() - specialCounter;
dialogCharCount.setText(String.valueOf(i) + " Characters Remaining..");

}

public void beforeTextChanged(CharSequence s, int start, int count, int after){}
public void onTextChanged(CharSequence s, int start, int before, int count){}

});


Это вздор. Я знаю. Это будет работа, пока я не найду более умный и быстрый способ.

492   3  

3 ответов:

Просто пробежитесь по вставленному тексту и сравните символы

Set<Character> specialChars = new HashSet<Character>();
specialChars.add('é');
// ...
specialChars.add('ñ');

String str = s.toString();
int specialCounter = 0;
for (int i = 0, len = str.length(); i < len; ++i) {
    Character c = str.charAt(i);
    if (specialChars.contains(c)) {
         specialCounter++;
    }
}

int totalRemaining = 612 - s.length() - specialCounter;

Я бы предложил использовать регулярное выражение для выполнения такой задачи, что оно даст вам лучшую эффективность, а также его гораздо проще использовать в долгосрочной перспективе .

Вы можете попробовать что-то вроде этого

Static int countAlphabets, countSpecialCharacter;

String mesage= " это демонстрационный текст для идентификации $ words и специальных $ % ^ символов ! ! @ ";

String pattern4 = " [aA-zZ]"; / / регулярное выражение для подсчета символов String pattern5 ="!|@|$|%|^"; //РЕГУЛЯРНЫЙ Выражение для подсчета специальных символов

Pattern pattern11 = Pattern.compile(pattern4);
Matcher matcher = pattern11.matcher(mesage);
while(matcher.find())
{
    System.out.println("no of words are "+countAlphabets+++" and still"
            + " counting");

}
Pattern pattern22= Pattern.compile(pattern5);
Matcher matcher1= pattern22.matcher(mesage);
while(matcher1.find())
{
    System.out.println("no of words are "++countSpecialCharacter+++" and still"
            + " counting");

}

Лиме знать, если это полезно.

Вы также можете проверить, как:

if(!Character.isLetter(str.charAt(i))) {
   //its a special character
   //increase count 
}
else {
  //its a letter
}

Comments

    Ничего не найдено.