مشکل در جداسازی اعداد EditText با "," همزمان با ورود اعداد
با سلام
نمونه این سوال قبلا مطرح شده بود اما نتونستم با استفاده از اون به جواب برسم
از این کد استفاده می کنم
private long currentNumber; private Button btnSubmit; private TextView txtResualt; private EditText edtInput; private String formatNumber; // onCreate edtInput = (EditText) findViewById(R.id.edtNumber); txtResualt = (TextView) findViewById(R.id.txtResualt); edtInput.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable arg0) { // TODO Auto-generated method stub currentNumber = Integer.parseInt(edtInput.getText().toString().replace(",", "")); Log.i("log", "currentNumber: " + currentNumber); formatNumber = String.format("%,d", currentNumber); Log.i("log", "formatNumber: " + formatNumber); txtResualt.setText("" + formatNumber); // edtInput.setText("" + formatNumber); } });
اما فقط برای نمایش در txtResualt از جنس TextView جوابگو هست و در edtInput از جنس EditText خطا می ده
متن خطا
06-01 15:20:25.931: E/AndroidRuntime(7788): FATAL EXCEPTION: main 06-01 15:20:25.931: E/AndroidRuntime(7788): java.lang.StackOverflowError 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.text.method.ReplacementTransformationMethod$ReplacementCharSequence.getChars(ReplacementTransformationMethod.java:151) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.text.TextUtils.getChars(TextUtils.java:74) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.graphics.Paint.getTextRunAdvances(Paint.java:1828) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.graphics.Paint.getTextRunAdvances(Paint.java:1782) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.text.TextLine.handleText(TextLine.java:747) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.text.TextLine.handleRun(TextLine.java:956) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.text.TextLine.measureRun(TextLine.java:414) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.text.TextLine.measure(TextLine.java:293) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.text.TextLine.metrics(TextLine.java:267) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.text.Layout.getLineExtent(Layout.java:977) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.text.Layout.getLineStartPos(Layout.java:504) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.text.Layout.getHorizontal(Layout.java:840) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.text.Layout.getHorizontal(Layout.java:812) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.text.Layout.getPrimaryHorizontal(Layout.java:796) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.getFocusedRect(TextView.java:5060) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.view.FocusFinder.findNextFocus(FocusFinder.java:120) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.view.FocusFinder.findNextFocus(FocusFinder.java:94) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.view.FocusFinder.findNextFocus(FocusFinder.java:65) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.view.ViewGroup.focusSearch(ViewGroup.java:639) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.view.ViewGroup.focusSearch(ViewGroup.java:641) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.view.ViewGroup.focusSearch(ViewGroup.java:641) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.view.ViewGroup.focusSearch(ViewGroup.java:641) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.view.View.focusSearch(View.java:6279) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.onCreateInputConnection(TextView.java:5562) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.view.inputmethod.InputMethodManager.startInputInner(InputMethodManager.java:1106) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.view.inputmethod.InputMethodManager.restartInput(InputMethodManager.java:1057) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3616) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3554) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.EditText.setText(EditText.java:80) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3529) 06-01 15:20:25.931: E/AndroidRuntime(7788): at ir.redreactor.course.app.number.NumberActivity$1.afterTextChanged(NumberActivity.java:55) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3703) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3554) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.EditText.setText(EditText.java:80) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3529) 06-01 15:20:25.931: E/AndroidRuntime(7788): at ir.redreactor.course.app.number.NumberActivity$1.afterTextChanged(NumberActivity.java:55) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3703) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3554) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.EditText.setText(EditText.java:80) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3529) 06-01 15:20:25.931: E/AndroidRuntime(7788): at ir.redreactor.course.app.number.NumberActivity$1.afterTextChanged(NumberActivity.java:55) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3703) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3554) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.EditText.setText(EditText.java:80) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3529) 06-01 15:20:25.931: E/AndroidRuntime(7788): at ir.redreactor.course.app.number.NumberActivity$1.afterTextChanged(NumberActivity.java:55) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3703) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3554) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.EditText.setText(EditText.java:80) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3529) 06-01 15:20:25.931: E/AndroidRuntime(7788): at ir.redreactor.course.app.number.NumberActivity$1.afterTextChanged(NumberActivity.java:55) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3703) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3554) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.EditText.setText(EditText.java:80) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.setText(TextView.java:3529) 06-01 15:20:25.931: E/AndroidRuntime(7788): at ir.redreactor.course.app.number.NumberActivity$1.afterTextChanged(NumberActivity.java:55) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 06-01 15:20:25.931: E/AndroidRuntime(7788): at android.widget.TextView.se

توی این سوال دقیقا این کار انجام شده.
البته یه مشکلی داشته که تا آخر که بخونید اون مشکل هم رفع شده و کد قابل استفاده است

یه کمی کدها رو تغییر دادم
public class NumberActivity extends Activity {
private Long currentNumber; private Button btnSubmit; private TextView txtResualt; private EditText edtInput;
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnSubmit = (Button) findViewById(R.id.btnComput); edtInput = (EditText) findViewById(R.id.edtNumber); txtResualt = (TextView) findViewById(R.id.txtResualt); edtInput.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable arg0) { // TODO Auto-generated method stub currentNumber = Long.parseLong(edtInput.getText().toString().replace(",", "")); txtResualt.setText("" + NumberFormat.getNumberInstance(Locale.US).format(currentNumber)); } }); btnSubmit.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub edtInput.setText("" + formatNumber); } }); } }
یه چیزی خیلی جالبه
وقتی روی Button کلیک می کنم تغییرات در EditText عدد رو وارد می کنم توی TextView نمایش داده می شه
و وقتی روی Button می زنم به درستی نمایش می ده؛ و جالب اینجاست که وقتی مجدد عدد رو وارد می کنم باز هم درست نشون می ده
اما اگر توی EditText خالی باشه و چیزی وارد کنم Close force می ده
این به این معنیه که در TextWatcher نمی تونم تعیین کنم که محتویات EditText رو به روز رسانی کنه
آپلود شد لطفا یه نگاه بی اندازین

همه چی آروم بود ، پروژه رو تست کردم ، فقط همون طور که گفتم ، تو خط 77 یعنی اینجا کرش میکرد
edtInput.setText("" + NumberFormat.getNumberInstance(Locale.US).format(currentNumber));
چرا ؟! ، خوب چون "" نمیتونه Format بشه ! ، پس باید به این شکل تغییر کنه
btnSubmit.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { try { edtInput.setText("" + NumberFormat.getNumberInstance(Locale.US).format(currentNumber)); } catch (Exception e) { e.printStackTrace(); Toast.makeText(NumberActivity.this, "Wrong Input !", Toast.LENGTH_SHORT).show(); } } });
اما بازم به نظرم بهتره بگی اگه EditText خالی بود ، روی دکمه کلیک شد ، مقدار 0 درج بشه و پردازش بشه !

مقداری از کد رو به این شکل تغییر دادم:
edtInput.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub if (edtInput.getText().length() > 0) { if ( !s.toString().equals(formatNumber)) { currentNumber = Long.parseLong(edtInput.getText().toString().replace(",", "")); formatNumber = NumberFormat.getNumberInstance(Locale.US).format(currentNumber); txtResualt.setText(formatNumber); edtInput.setText(formatNumber); } } else { edtInput.setText("" + NumberFormat.getNumberInstance(Locale.US).format(0)); } } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable arg0) { // TODO Auto-generated method stub } });
اما باز هم مشکلی که هست اشاره گر به اولین خونه از متن ورودی می آد، یعنی:
|987,654,321
" | " همون اشاره گره
اگر بخوام اشاره گر به صورت اتوماتیک به آخرین خونه بره باید چه کدی روش اعمال بشه
پاسخ توسط دوستان در این تاپیک داده شد

با این متد و پاسخ دوستان مشکل منم برطرف شد. فقط یه مشکل جدید ایجاد شده اونم اینه که در این فیلد که عدد وارد میشه میخوام اون عدد را داخل متغیری بذارم برنامه در همون خط کرش میکنه. آیا راه حلی هست؟
double editInput = Double.parseDouble(edtOjrat.getText().toString());
همچنین وقتی یک عددی نوشته میشه بعد از اینکه کاربر عددها را پاک کنه آخرش یه صفر میمونه و پاک نمیشه!

این هم سورس البته به صورت مثال :
DecimalFormat formatter = new DecimalFormat("#,###,###");
Long input1 = item.priceVahed;
String pV = formatter.format(input1);
txtPriceVahed.setText("قیمت واحد : " + pV);
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .