آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

مشکل تغییر ورودی editText بعد از کلیک روی Button در برنامه convert

Mahan  10 سال پیش  10 سال پیش
0 0

سلام دوستان

تقریبا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));

}

});
+1 0
سلام ، کدهای یکای جرم رو هم قرار بدید . مطمئنا اگه مشکل فقط از اون 2 ورودیه ، کدهای اون دو با بقیه فرق داره . (10 سال پیش)
0 0
ممنون از پاسختون، کدهاشون ظاهرن مشکلی ندارند،البته حدسی که من میزنم اینه که عددهای فرمولش نادقیق هست که اینطور نشون میده! (10 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
Reza  10 سال پیش
+2 0

سلام

    آره به احتمال زیاد چون اعداد جعبه متن در عددی ضرب میشن و دوباره در معکوس همون عدد ضرب میشن این اتفاق میفته ، چون معکوس عددی مثل  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 رو بگیرید و محاسبات رو با دقت بالاتر وارد کنید یعنی همون عددی که نرم افزار بهت میده رو سریع میتونی کپی کنی که هم دقت و هم سرعت کار بره بالا . محیط نرم افزار به این شکله :

 

0 0
رضا جان ممنون از توجه وپاسخ کاملت،مشکل حل شد ♥ (10 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .