2012-03-07 1 views
-1

나는 EditText가 눌려진 버튼에 따라 추가하고 제거하는 뷰를 구현했습니다. TextWatcher를 사용하여 숫자를 돈 형식으로 변경했습니다. 여기까지는 모든 것이 잘 작동합니다.EditText, TextWatcher help, 계속 이전 문자열 얻기

내 문제는 사용자가 첫 번째 EditText를 입력하고 추가 버튼을 누르면 발생합니다. 그런 다음 사용자가 두 번째 EditText에 입력 할 때 첫 번째 EditText 문자열로 입력 concats가 표시되고 두 번째 EditText에 표시되고 첫 번째 EditText도 연결됩니다. 그래서 기본적으로 두 EditText는 같은 문자열로 끝납니다. 다음은 내 코드입니다 : 내가 onTextChanged을 시도했습니다

amount = new EditText(this); 
    RelativeLayout.LayoutParams etLParams = new RelativeLayout.LayoutParams(
      400, LayoutParams.WRAP_CONTENT); 
    etLParams.addRule(RelativeLayout.CENTER_HORIZONTAL); 
    amount.setInputType(InputType.TYPE_CLASS_NUMBER); 
    amount.setLayoutParams(etLParams); 
    amount.setId(AMOUNT); 
    amount.setSingleLine(); 
    amount.requestFocus(); 
    amount.setCursorVisible(true); 
    amount.setGravity(Gravity.RIGHT); 
    amount.addTextChangedListener(new TextWatcher(){ 
     String price=""; 
     private EditText newAmount = new EditText(DutchPayActivity.this); 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 
      if(!s.toString().equals(price)){ 
       String cleanString = s.toString().replaceAll("[$,.]", ""); 
       long parsed = Long.parseLong(cleanString); 
       NumberFormat nf = NumberFormat.getInstance(); 
       price = nf.format(parsed); 
       s.append(price); //gave me error:java.lang.NumberFormatException: 66666666666666666666666666666666 

       newAmount.setText(price); //same result as before.. 
       newAmount.setSelection(price.length()); 
      } 
     } 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 

     } 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
      // TODO Auto-generated method stub 

     } 
    }); 

() 등 내 사용자 정의 클래스와 구현하지만, 그냥 일을 얻을 수 없습니다.

amount.setId(AMOUNT); 

왜 당신이 동적으로 생성 된 구성 요소의 ID를 설정하는 당신이 당신의 두 번째 글고 치기를 선언 할 경우

+7

제목을 좀 더 건설적으로 만드십시오. – Ben

+4

* "정말 심각합니다."* * 나도. 아무도 [FAQ] (http://stackoverflow.com/faq)에서 더 이상 적절한 질문을하는 법을 읽지 않습니다. –

+0

다른 EditText는 어디에 있습니까? –

답변

0

나는 볼 수 없지만,이 라인은 나를 의심하게? 또한 설정 한 ID가 기존 ID (두 번째 EditText 구성 요소의 ID 일 수 있음)와 충돌 할 수 있습니까?

이 문제는 올바른 구성 요소에서 수신기를 트리거하는 포인터가 섞여서 들리는 것처럼 들립니다. 하지만 당신이해야한다고 생각하는 구성 요소를 가리 키지 않는 포인터에 "setText()"를 지정해야합니다.

가장 쉬운 방법은 디버거 (eclipse와 함께 제공됨)를 사용하고 afterTextChanged() 수신기에 중단 점을 설정하고 변수가 가리키는 위치를 중단 점 트리거가 검사 할 때 사용하는 것입니다. 텍스트 세트 프로세스를 쉽게 단계별로 수행 할 수 있습니다.

행운을 빈다.

+0

이다. 그래서 나는 다른 것을 선언하지 않는다. 방금 다시 시작합니다. 나는 TextWatcher가 내가 다른 방식으로 그것을 사용하게하지 않기 때문에 세계화했다. – Jae

1

귀하의 의견에 따라 문제가 명확합니다.

내부 TexWatcher는 amount을 가리키며, 항상이 코드의 마지막 실행으로 생성 된 EditText입니다. 이 코드를 두 번 실행하면 두 개의 EditText를 만들면 두 개의 EditText를 편집하여 두 번째 EditText를 편집하는 TextWatcher를 트리거합니다.

해결 방법 : TextWatcher에서 amount과 관련된 작업을 수행하지 마십시오. 제공된 Editable을 사용하십시오.

또는 amount을 TextWatcher의 개인 회원에 복사하십시오.

+0

이것이 해결책일지도 모릅니다. 그러나 유감스럽게도 프로그래밍 컴퓨터에서 멀어져서 시도 할 수 없습니다 ... 줄리안에게 몇 가지 질문이 있습니다.Editable을 사용한다고 말하면 append와 같은 메소드를 사용하여 EditText의 텍스트를 변경한다는 의미입니까? '양 '이 중복되면 무슨 뜻입니까? 미리 감사드립니다 – Jae

+1

@ Jae, 네. 'amount'의 값에 할당하는 TextWatcher에 private 멤버를 추가하십시오. 'amount'는 마지막으로 생성 된 EditText 만 계속 유지할 것이지만, 이제 각각의 TextWatcher의 메소드는 올바른 EditText에서 작동 할 수 있습니다. –

+0

방금 ​​두 가지 방법을 시도했지만 방금'amount'를 복제하면 같은 결과를 얻었습니다. 일단 append를 사용하면 뭔가를 입력하면 오류가 발생합니다 ... 위의 코드를 업데이트합니다. 도움을 주셔서 감사합니다. – Jae