我是新來的Android和Java編程,我正在處理我的第一個應用程序,但我遇到了一個問題。 我有三個EditTexts:FuelAmount
,FuelCost
,CashSpend
我想達到的目標是 - 當FA
填充和FC
是beeing申請,CS
應自動填充。 我想,要在所有可能的組合FA
>FC
= CS
,FA
>CS
= FC
等 所以,我想工作,找一個addTextChangedListener
我所有的EditTexts
的。但是,當我java.lang.StackOverflowError的Android自動更新EditText如果其他人填充
測試所有的方式輸入的數據的應用程序崩潰與
的組合就像當我把
FuelCost
然後CashSpend
或FuelAmount
然後CashSpend
。import android.app.DatePickerDialog; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.Editable; import android.text.TextWatcher; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.DatePicker; import android.widget.EditText; import android.widget.Toast; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; public class NewRefuelActivity extends AppCompatActivity { EditText KmCounter,FuelAmount, FuelPrice,CashSpend,RefuelDate; Context context = this; DBHelper dbHelper; SQLiteDatabase sqLiteDatabase; Calendar myCalendar = Calendar.getInstance(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.new_refuel); android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); if (getSupportActionBar() != null){ getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); } KmCounter = (EditText) findViewById(R.id.NewRefuel_KmCounter_Input); FuelAmount = (EditText) findViewById(R.id.NewRefuel_FuelAmount_Input); FuelPrice = (EditText) findViewById(R.id.NewRefuel_FuelPrice_Input); CashSpend = (EditText) findViewById(R.id.NewRefuel_CashSpend_Input); RefuelDate = (EditText) findViewById(R.id.NewRefuel_Date_Input); updateLabel_RefuelDate(); RefuelDate.setFocusableInTouchMode(false); RefuelDate.setFocusable(false); final DatePickerDialog.OnDateSetListener DTPListener = new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { myCalendar.set(Calendar.YEAR,year); myCalendar.set(Calendar.MONTH,monthOfYear); myCalendar.set(Calendar.DAY_OF_MONTH,dayOfMonth); updateLabel_RefuelDate(); } }; RefuelDate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new DatePickerDialog(NewRefuelActivity.this, DTPListener, myCalendar.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH)).show(); } }); //error EditText_AutoFill(); } public void EditText_AutoFill(){ FuelAmount.addTextChangedListener(new TextWatcher() { @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 (s.length() != 0){ if (FuelPrice.getText().toString().trim().length() != 0){ Float FA = Float.parseFloat(FuelAmount.getText().toString()); Float FC = Float.parseFloat(FuelPrice.getText().toString()); Float CS = FA * FC; CashSpend.setText(CS.toString()); } else if (CashSpend.getText().toString().trim().length() != 0){ Float FA = Float.parseFloat(FuelAmount.getText().toString()); Float CS = Float.parseFloat(CashSpend.getText().toString()); Float FC = CS/FA; FuelAmount.setText(FC.toString()); } } } @Override public void afterTextChanged(Editable s) { } }); FuelPrice.addTextChangedListener(new TextWatcher() { @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 (s.length() != 0) { if (FuelAmount.getText().toString().trim().length() != 0) { Float FC = Float.parseFloat(FuelPrice.getText().toString()); Float FA = Float.parseFloat(FuelAmount.getText().toString()); Float CS = FA * FC; CashSpend.setText(CS.toString()); } else if (CashSpend.getText().toString().trim().length() != 0) { Float FC = Float.parseFloat(FuelPrice.getText().toString()); Float CS = Float.parseFloat(CashSpend.getText().toString()); Float FA = CS/FC; FuelAmount.setText(FA.toString()); } } } @Override public void afterTextChanged(Editable s) { } }); CashSpend.addTextChangedListener(new TextWatcher() { @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 (s.length() != 0) { if (FuelAmount.getText().toString().trim().length() != 0) { Float CS = Float.parseFloat(CashSpend.getText().toString()); Float FA = Float.parseFloat(FuelAmount.getText().toString()); Float FC = CS/FA; FuelPrice.setText(FC.toString()); } else if (FuelPrice.getText().toString().trim().length() != 0) { Float CS = Float.parseFloat(CashSpend.getText().toString()); Float FC = Float.parseFloat(FuelPrice.getText().toString()); Float FA = CS/FC; FuelAmount.setText(FA.toString()); } } } @Override public void afterTextChanged(Editable s) { } }); } private void updateLabel_RefuelDate(){ String myFormat = "dd-MM-yyyy"; SimpleDateFormat simpleDateFormat = new SimpleDateFormat(myFormat, Locale.US); RefuelDate.setText(simpleDateFormat.format(myCalendar.getTime())); } public void addNewRefuel(){ Float km_counter = Float.parseFloat(KmCounter.getText().toString()); Float fuel_amount = Float.parseFloat(FuelAmount.getText().toString()); Float fuel_price = Float.parseFloat(FuelPrice.getText().toString()); Float cash_spend = Float.parseFloat(CashSpend.getText().toString()); String fuel_date = RefuelDate.getText().toString(); dbHelper = new DBHelper(context); sqLiteDatabase = dbHelper.getWritableDatabase(); dbHelper.addRefuel(fuel_amount, fuel_price, cash_spend, km_counter, fuel_date, sqLiteDatabase); Toast.makeText(getBaseContext(),"Tankowanie dodane", Toast.LENGTH_SHORT).show(); dbHelper.close(); } public void clearRefuelEditText(){ //KmCounter.getText().clear(); KmCounter.setText(""); FuelAmount.setText(""); FuelPrice.setText(""); CashSpend.setText(""); RefuelDate.setText(""); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_new_refuel_activity, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_refuel_tab) { return true; } if (id == R.id.action_add_refuel){ addNewRefuel(); clearRefuelEditText(); finish(); //TODO: przetestowac alternatywe finish() /* Intent i=new Intent(this, MainActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); } */ return true; } case android.R.id.home: // this takes the user 'back', as if they pressed the left-facing triangle icon on the main android toolbar. // if this doesn't work as desired, another possibility is to call `finish()` here. onBackPressed(); return true; default: return super.onOptionsItemSelected(item); } } }
有人可以建議我任何解決方案嗎?
在此先感謝。
編輯。整個錯誤
04-22 06:28:18.280 1816-1816/? E/MessageQueue-JNI: java.lang.StackOverflowError at android.text.TextUtils.getChars(TextUtils.java:77) at android.text.method.ReplacementTransformationMethod$ReplacementCharSequence.getChars(ReplacementTransformationMethod.java:151) at android.text.TextUtils.getChars(TextUtils.java:77) at android.graphics.Paint.getTextRunAdvances(Paint.java:1800) at android.text.TextLine.handleText(TextLine.java:747) at android.text.TextLine.handleRun(TextLine.java:956) at android.text.TextLine.measureRun(TextLine.java:414) at android.text.TextLine.measure(TextLine.java:293) at android.text.TextLine.metrics(TextLine.java:267) at android.text.Layout.getLineExtent(Layout.java:998) at android.text.Layout.getLineStartPos(Layout.java:504) at android.text.Layout.getHorizontal(Layout.java:861) at android.text.Layout.getHorizontal(Layout.java:830) at android.text.Layout.getPrimaryHorizontal(Layout.java:805) at android.text.Layout.getPrimaryHorizontal(Layout.java:795) at android.widget.TextView.getFocusedRect(TextView.java:5135) at android.view.FocusFinder.findNextFocus(FocusFinder.java:120) at android.view.FocusFinder.findNextFocus(FocusFinder.java:94) at android.view.FocusFinder.findNextFocus(FocusFinder.java:65) at android.view.ViewGroup.focusSearch(ViewGroup.java:670) at android.view.ViewGroup.focusSearch(ViewGroup.java:672) at android.view.ViewGroup.focusSearch(ViewGroup.java:672) at android.view.ViewGroup.focusSearch(ViewGroup.java:672) at android.view.ViewGroup.focusSearch(ViewGroup.java:672) at android.view.ViewGroup.focusSearch(ViewGroup.java:672) at android.view.ViewGroup.focusSearch(ViewGroup.java:672) at android.view.ViewGroup.focusSearch(ViewGroup.java:672) at android.view.View.focusSearch(View.java:6392) at android.widget.TextView.onCreateInputConnection(TextView.java:5641) at android.view.inputmethod.InputMethodManager.startInputInner(InputMethodManager.java:1120) at android.view.inputmethod.InputMethodManager.restartInput(InputMethodManager.java:1070) at android.widget.TextView.setText(TextView.java:3691) at android.widget.TextView.setText(TextView.java:3629) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3604) at com.example.pietrzyk.sqlite1.NewRefuelActivity$5.onTextChanged(NewRefuelActivity.java:162) at android.widget.TextView.sendOnTextChanged(TextView.java:7318) at android.widget.TextView.setText(TextView.java:3774) at android.widget.TextView.setText(TextView.java:3629) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3604) at com.example.pietrzyk.sqlite1.NewRefuelActivity$4.onTextChanged(NewRefuelActivity.java:130) at android.widget.TextView.sendOnTextChanged(TextView.java:7318) at android.widget.TextView.setText(TextView.java:3774) at android.widget.TextView.setText(TextView.java:3629) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3604) at com.example.pietrzyk.sqlite1.NewRefuelActivity$5.onTextChanged(NewRefuelActivity.java:162) at android.widget.TextView.sendOnTextChanged(TextView.java:7318) at android.widget.TextView.setText(TextView.java:3774) at android.widget.TextView.setText(TextView.java:3629) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3604) at com.example.pietrzyk.sqlite1.NewRefuelActivity$4.onTextChanged(NewRefuelActivity.java:130) at android.widget.TextView.sendOnTextChanged(TextView.java:7318) at android.widget.TextView.setText(TextView.java:3774) at android.widget.TextView.setText(TextView.java:3629) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3604) at com.example.pietrzyk.sqlite1.NewRefuelActivity$5.onTextChanged(NewRefuelActivity.java:162) at android.widget.TextView.sendOnTextChanged(TextView.java:7318) at android.widget.TextView.setText(TextView.java:3774) at android.widget.TextView.setText(TextView.java:3629)04-22 06:28:18.280 1816-1816/? E/MessageQueue-JNI: java.lang.StackOverflowError at android.text.TextUtils.getChars(TextUtils.java:77) at android.text.method.ReplacementTransformationMethod$ReplacementCharSequence.getChars(ReplacementTransformationMethod.java:151) at android.text.TextUtils.getChars(TextUtils.java:77) at android.graphics.Paint.getTextRunAdvances(Paint.java:1800) at android.text.TextLine.handleText(TextLine.java:747) at android.text.TextLine.handleRun(TextLine.java:956) at android.text.TextLine.measureRun(TextLine.java:414) at android.text.TextLine.measure(TextLine.java:293) at android.text.TextLine.metrics(TextLine.java:267) at android.text.Layout.getLineExtent(Layout.java:998) at android.text.Layout.getLineStartPos(Layout.java:504) at android.text.Layout.getHorizontal(Layout.java:861) at android.text.Layout.getHorizontal(Layout.java:830) at android.text.Layout.getPrimaryHorizontal(Layout.java:805) at android.text.Layout.getPrimaryHorizontal(Layout.java:795) at android.widget.TextView.getFocusedRect(TextView.java:5135) at android.view.FocusFinder.findNextFocus(FocusFinder.java:120) at android.view.FocusFinder.findNextFocus(FocusFinder.java:94) at android.view.FocusFinder.findNextFocus(FocusFinder.java:65) at android.view.ViewGroup.focusSearch(ViewGroup.java:670) at android.view.ViewGroup.focusSearch(ViewGroup.java:672) at android.view.ViewGroup.focusSearch(ViewGroup.java:672) at android.view.ViewGroup.focusSearch(ViewGroup.java:672) at android.view.ViewGroup.focusSearch(ViewGroup.java:672) at android.view.ViewGroup.focusSearch(ViewGroup.java:672) at android.view.ViewGroup.focusSearch(ViewGroup.java:672) at android.view.ViewGroup.focusSearch(ViewGroup.java:672) at android.view.View.focusSearch(View.java:6392) at android.widget.TextView.onCreateInputConnection(TextView.java:5641) at android.view.inputmethod.InputMethodManager.startInputInner(InputMethodManager.java:1120) at android.view.inputmethod.InputMethodManager.restartInput(InputMethodManager.java:1070) at android.widget.TextView.setText(TextView.java:3691) at android.widget.TextView.setText(TextView.java:3629) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3604) at com.example.pietrzyk.sqlite1.NewRefuelActivity$5.onTextChanged(NewRefuelActivity.java:162) at android.widget.TextView.sendOnTextChanged(TextView.java:7318) at android.widget.TextView.setText(TextView.java:3774) at android.widget.TextView.setText(TextView.java:3629) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3604) at com.example.pietrzyk.sqlite1.NewRefuelActivity$4.onTextChanged(NewRefuelActivity.java:130) at android.widget.TextView.sendOnTextChanged(TextView.java:7318) at android.widget.TextView.setText(TextView.java:3774) at android.widget.TextView.setText(TextView.java:3629) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3604) at com.example.pietrzyk.sqlite1.NewRefuelActivity$5.onTextChanged(NewRefuelActivity.java:162) at android.widget.TextView.sendOnTextChanged(TextView.java:7318) at android.widget.TextView.setText(TextView.java:3774) at android.widget.TextView.setText(TextView.java:3629) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3604) at com.example.pietrzyk.sqlite1.NewRefuelActivity$4.onTextChanged(NewRefuelActivity.java:130) at android.widget.TextView.sendOnTextChanged(TextView.java:7318) at android.widget.TextView.setText(TextView.java:3774) at android.widget.TextView.setText(TextView.java:3629) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3604) at com.example.pietrzyk.sqlite1.NewRefuelActivity$5.onTextChanged(NewRefuelActivity.java:162) at android.widget.TextView.sendOnTextChanged(TextView.java:7318) at android.widget.TextView.setText(TextView.java:3774) at android.widget.TextView.setText(TextView.java:3629)
請發佈(完整)錯誤。 – yennsarah
以及它在我的模擬器上正常工作..你可以發佈整個代碼嗎? – Bharatesh
已添加整個活動代碼。任何消化? – relliz