2013-12-17 2 views
2

그래서 저는 서로에게 텍스트 보내기를 포함하는 응용 프로그램을 만들고 있습니다. 이것은 서버를 통해 전송되며 전화 (회사) 자체와 아무 관련이 없습니다.EditText에서 특수 문자 감지 및 계산 - Android

우리 회사 (회사와 회사)는 최대 문자 수를 선택했습니다. - 612.

따라서 612 자의 공백을 사용할 수 있습니다.

나는 다음과 같은 특수 문자가 é, ñ, á, è, à ... 등으로 나타났습니다. 우리가 일하는 나라 (스페인)가 특수 문자를 많이 사용하기 때문에 사람이 1 자리를 사용하는 대신 특수 문자 중 하나를 입력하면 2 자리를 사용합니다.

그래서 기본적으로 내가하고 싶은 것은 입력 할 때 특수 문자의 수와 남은 문자의 수를 "-1"로 계산하는 것입니다.

나는이 상황과 관련된 것을 찾을 수 없었기 때문에 나는 솔직하게 많이 시도하지 않았다.

내 방법은 다음과 같습니다. (아, 등등 글고 + 버튼과는 대화 상자에 있습니다.)

(응용 나쁜 보이지만, 그것이 시작이다!)

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(); 

    } 

enter image description here

--- 현재 코드 - -

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){} 

     }); 

쓰레기입니다. 알아. 더 똑똑하고 빠른 방법을 찾을 때까지 일이 끝납니다. 정규식은 이러한 작업을 수행하는

+0

http://stackoverflow.com/questions/16160989/how-to-detect-special-characters-in-an-edit-text-and-display- a-toast-in-response – Meenal

+0

@MeenalSharma 나는 그 코드를 수정하려고 노력하고있다. 아직 실험하고있어, 고마워! – Paramone

답변

2

은 그냥 당신에게 더 나은 효율성을 제공뿐만 아니라 것입니다 나는 그 가고 제안 문자

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; 
+0

그건 정확히 내가 생각하고있는 것입니다. 카운터를 늘리면 결국 카운터의 값으로 카운터를 줄입니다. 그러나 문제는 모든 단일 "특수 문자"에 대해 수백 가지 "If"문을 작성해야한다는 것입니다. 특수 문자 "패키지"를 찾고 있습니다. 캐릭터가 "Special Characters 패키지"안에 있다면 .. SpecialCounter ++. – Paramone

+0

수정 된 답변보기 일부 문자 집합을 정의하고 해당 문자 집합에 있는지 확인하십시오. – holtaf

+0

아, 그랬어 야 했어. 알아. if (c == 'ñ'|| C == 'á'|| C == 'à'... 등) .. By "... 등등 "내 말은,"OR "의 60 개 이상을 의미합니다. – Paramone

2

를 삽입 된 텍스트를 통해 실행 및 비교는 장기적으로 사용하기 훨씬 쉽습니다.

정적 INT countAlphabets, countSpecialCharacter 뭔가를 시도 할 수 있습니다

;

문자열 메시지 = "$ 단어 및 특수 $ %^문자를 식별하는 데모 텍스트입니다!! @";

문자열 pattern4 = "[aA-zZ]"; // 문자 계산에 대한 정규 표현 문자열 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"); 

} 

leeme 유용한 지 알고 있습니다.

+0

안녕하세요, Khay, Thanks for the 대답. 그것은 유용했다, 나는 인정해야한다. 그러나 패턴을 변경하지 않으면 내가 그것을 사용할 지 모르겠습니다. 왜냐하면 모든 특수 문자가 '두'문자 반점으로 카운터가 아니어야하기 때문입니다. 전화기에있는 문자 메시지의 문자와 같은 문자 만 있습니다. 당신의 도움을 주셔서 감사합니다! – Paramone

+1

네, 그렇다면 위의 pattern5에서 2로 계산되고 나머지는 pattern4로 유지 될 수있는 것을 만들 수 있습니다 <위의 코드에서> – Khay

0

당신은 또한 같은 확인할 수 있습니다

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