TextWatcher를 이용하여 숫자가 EditText에 입력될 때 천 단위마다 콤마가 찍히게 했는데요,
숫자를 12,345 이렇게 입력했다가 지울 때 마지막 한 자리 숫자까지 지워지면 강제종료가 됩니다.
그런데 EditText의 길이가 0일때를 따로 처리해주니 강제종료가 되지 않는데요,
무슨 이유때문인지 궁금합니다.
코드에 처리해준대로 사용해도 아무 이상이 없는 것인지도 궁금하구요.
package test.decimal;
import java.text.DecimalFormat;
import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView;
public class DecimalTestActivity extends Activity {
DecimalFormat df = new DecimalFormat("###,###");
String result = "";
String clicked_result = "";
EditText meterEditText = null;
Button ok_btn = null;
TextView text = null;
TextWatcher watcher = new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
/*if(meterEditText.length() < 1) {
//Toast.makeText(getApplicationContext(), meterEditText.getError(), Toast.LENGTH_SHORT);
Log.e("Test","meterEditText.length() : " + meterEditText.length());
//meterEditText.setText("0");
//meterEditText.setHint("금액을 입력해주세요.");
} else {*/
if(!s.toString().equals(result)) {
result = df.format(Long.parseLong(s.toString().replaceAll(",", "")));
Log.e("Good", "meterEditText.length() : " + meterEditText.length());
meterEditText.setText(result);
meterEditText.setSelection(result.length());
}//if in else
//}//else
}//onTextChanged
};//TextWatcher
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
meterEditText = (EditText)findViewById(R.id.meterEditText);
ok_btn = (Button)findViewById(R.id.ok_btn);
text = (TextView)findViewById(R.id.text);
meterEditText.addTextChangedListener(watcher);
ok_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
text.setText(meterEditText.getText().toString());
}
});
}
}
아래는 if문 처리를 하지 않았을 때 강제종료시 나타나는 에러로그입니다.
05-29 15:52:22.187: E/AndroidRuntime(6053): FATAL EXCEPTION: main
05-29 15:52:22.187: E/AndroidRuntime(6053): java.lang.NumberFormatException:
05-29 15:52:22.187: E/AndroidRuntime(6053): at java.lang.Long.parseLong(Long.java:337)
05-29 15:52:22.187: E/AndroidRuntime(6053): at java.lang.Long.parseLong(Long.java:311)
05-29 15:52:22.187: E/AndroidRuntime(6053): at test.decimal.DecimalTestActivity$1.onTextChanged(DecimalTestActivity.java:43)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.widget.TextView.sendOnTextChanged(TextView.java:6321)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.widget.TextView.handleTextChanged(TextView.java:6362)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:6511)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.text.SpannableStringBuilder.sendTextChange(SpannableStringBuilder.java:889)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:400)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:269)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:432)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:218)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:28)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.text.method.BaseKeyListener.backspace(BaseKeyListener.java:61)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.text.method.BaseKeyListener.onKeyDown(BaseKeyListener.java:124)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.text.method.NumberKeyListener.onKeyDown(NumberKeyListener.java:134)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.widget.TextView.doKeyDown(TextView.java:4454)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.widget.TextView.onKeyDown(TextView.java:4288)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.view.KeyEvent.dispatch(KeyEvent.java:1326)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.view.View.dispatchKeyEvent(View.java:3871)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-29 15:52:22.187: E/AndroidRuntime(6053): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1733)
05-29 15:52:22.187: E/AndroidRuntime(6053): at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1148)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.app.Activity.dispatchKeyEvent(Activity.java:2073)
05-29 15:52:22.187: E/AndroidRuntime(6053): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1709)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2566)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.view.ViewRoot.handleMessage(ViewRoot.java:2014)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.os.Handler.dispatchMessage(Handler.java:99)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.os.Looper.loop(Looper.java:130)
05-29 15:52:22.187: E/AndroidRuntime(6053): at android.app.ActivityThread.main(ActivityThread.java:3835)
05-29 15:52:22.187: E/AndroidRuntime(6053): at java.lang.reflect.Method.invokeNative(Native Method)
05-29 15:52:22.187: E/AndroidRuntime(6053): at java.lang.reflect.Method.invoke(Method.java:507)
05-29 15:52:22.187: E/AndroidRuntime(6053): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
05-29 15:52:22.187: E/AndroidRuntime(6053): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
05-29 15:52:22.187: E/AndroidRuntime(6053): at dalvik.system.NativeStart.main(Native Method)
처음 질문하는데요, 공지사항 읽었는데 틀린부분 있으면 지적부탁드립니다.^^;




05-29 15:52:22.187: E/AndroidRuntime(6053): java.lang.NumberFormatException:
05-29 15:52:22.187: E/AndroidRuntime(6053): at java.lang.Long.parseLong(Long.java:337)
로그에서 첫 두 줄 보면 바로 나오네요.
공백은 숫자포맷이 아닌데 long형으로parseLong으로 변환 시켜서 exception 나네요.