مشکل تغییر ورودی editText بعد از کلیک روی Button در برنامه convert
سلام دوستان
تقریبا2هفتست آموزشها رو شروع کردم وخوشبختانه تا الان مشکلی نداشتم.
در آموزشی که استاد برای پروژه convert قراردادند میخوام طبق آموزش بقیه قسمتهای تبدیل واحدها رو مثل جرم،دما،حجم و...تکمیل کنم قسمت جرم رو فعلن با 6 ورودی تکمیل کردم از لحاظ محاسبات مشکلی نیست ولی وقتی روی 2 تا از ورودیها (اونس و پوند)مقداری رو وارد میکنم بعد از فشردن دکمه convert عددی که ابتدا وارد کرده بودم (در این 2 ورودی خاص ) تغییر میکنه وبالطبع روی نتیجه هم تاثیرگذاره، چندبار کدها رو پاک کردم و از نو نوشتم توفیری نداشت حتی با 3 امولاتور مختلف و 2 دستگاه فیزیکی هم تست کردم ولی تغییری نکرد،از دوستان واساتیدی که اطلاع دارند خواهش میکنم راهنمایی کنند که اولن به چه علت این اتفاق رخ میده♥2و ثانین این باگ از چه طریقی قابل اصلاح است؟
اینهم عکسهای برنامه اجرا شده ومشکلی که وجود داره:
btnConvertWeight.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
double mg = 0;
if (edtMg.getText().toString().length() > 0) {
mg = Double.parseDouble(edtMg.getText().toString());
}
if (edtG.getText().toString().length() > 0) {
mg = Double.parseDouble(edtG.getText().toString()) * 1000.0;
}
if (edtKg.getText().toString().length() > 0) {
mg = Double.parseDouble(edtKg.getText().toString()) * 1000000.0;
}
if (edtOz.getText().toString().length() > 0) {
mg = Double.parseDouble(edtOz.getText().toString()) * 28349.5231;
}
if (edtLb.getText().toString().length() > 0) {
mg = Double.parseDouble(edtLb.getText().toString()) * 453592.37;
}
if (edtTon.getText().toString().length() > 0) {
mg = Double.parseDouble(edtTon.getText().toString()) * 1000000000.0;
}
edtMg.setText("" + mg);
edtG.setText("" + (mg * 0.001));
edtKg.setText("" + (mg * 0.000001));
edtOz.setText("" + (mg * 0.0000352));
edtLb.setText("" + (mg * 0.0000022));
edtTon.setText("" + (mg * 0.000000001));
}
});
سلام
آره به احتمال زیاد چون اعداد جعبه متن در عددی ضرب میشن و دوباره در معکوس همون عدد ضرب میشن این اتفاق میفته ، چون معکوس عددی مثل 28349.5231 عدد دقیقتر و با اعشار بالاتریه ( 0.00003527396198068672 ) نه 0.0000352 از طرفی هر چقدر هم که اعشار وارد کنی عدد دقیق تر میشه ولی همون عدد اول نمیشه
حالا شما باید دوکار انجام بدین :
1 - ( برای اینکه عدد کاربر تغییر نکنه ) در آخر کار بعد از اینکه واحد mg رو در معکوس ها ضرب کردین و به جعبه متن ها اختصاص دادین حالا اون جعبه ای که کاربر متن رو وارد کرده بود نباید تغییر کنه و دوباره مقدار اولیه خودشو بگیره . یه فیلد در کلاس تعریف کن به نام txtFocused از نوع EditText و بعد در کدهای setOnFocusChangeListener مقدارش رو برابر همون جعبه متنی که فوکوسش تغییر کرده قرار بده و در رویداد کلیک محاسبه ، یه متغیر محلی به نام Value تعریف کن و مقدارش رو برابر جعبه متنی که فوکوس داره قرار بده در آخر هم بنویس txtFocused.setText(value);
مثلا برای یکای طول :
public class DistanceActivity extends Activity {
EditText txtFocused; // <------------------------------------تغییر
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.distance);
final EditText edtMm = (EditText) findViewById(R.id.edtMm);
final EditText edtCm = (EditText) findViewById(R.id.edtCm);
final EditText edtM = (EditText) findViewById(R.id.edtM);
final EditText edtKm = (EditText) findViewById(R.id.edtKm);
Button btnConvert = (Button) findViewById(R.id.btnConvert);
edtMm.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View arg0, boolean arg1) {
edtCm.setText("");
edtM.setText("");
edtKm.setText("");
txtFocused = edtMm; // <------------------------------------تغییر
}
});
edtCm.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View arg0, boolean arg1) {
edtMm.setText("");
edtM.setText("");
edtKm.setText("");
txtFocused = edtCm; // <-----------------------------------تغییر
}
});
edtM.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View arg0, boolean arg1) {
edtMm.setText("");
edtCm.setText("");
edtKm.setText("");
txtFocused = edtM; // <-----------------------------------تغییر
}
});
edtKm.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View arg0, boolean arg1) {
edtMm.setText("");
edtCm.setText("");
edtM.setText("");
txtFocused = edtKm; // <----------------------------------تغییر
}
});
btnConvert.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
double mm = 0;
String value = txtFocused.getText().toString(); // <-----------------------تغییر
if (edtMm.getText().toString().length() > 0) {
mm = Double.parseDouble(value); // <----------------------تغییر
}
if (edtCm.getText().toString().length() > 0) {
mm = Double.parseDouble(value) * 10.0; // <------------------------تغییر
}
if (edtM.getText().toString().length() > 0) {
mm = Double.parseDouble(value) * 1000.0; // <---------------------تغییر
}
if (edtKm.getText().toString().length() > 0) {
mm = Double.parseDouble(value) * 1000000.0; // <---------------------تغییر
}
edtMm.setText("" + mm);
edtCm.setText("" + (mm * 0.1));
edtM.setText("" + (mm * 0.001));
edtKm.setText("" + (mm * 0.000001));
// بعد از تمام اختصاص ها جعبه فوکوس شده دوباره با مقدار اول ست میشه
txtFocused.setText(value); // <------------------------------------تغییر
}
});
}
}
2 - ( برای اینکه محاسبات با دقت بالاتر انجام بشه ) نرم افزار Unit Converter Pro رو بگیرید و محاسبات رو با دقت بالاتر وارد کنید یعنی همون عددی که نرم افزار بهت میده رو سریع میتونی کپی کنی که هم دقت و هم سرعت کار بره بالا . محیط نرم افزار به این شکله :
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .