我是Android和Java编程的新手,我正在开发我的第一个应用程序,但我遇到了一个问题。我有三个编辑文本:FuelAmount
、FuelCost
、CashSpend
,我想要实现的是 - 当FA
被填充并且FC
被归档时,CS
应该被自动填充。我希望它适用于所有可能的组合FA
> FC
= CS
、FA
> CS
= FC
等。所以我试图找到我所有EditTexts
的addTextChangedListener
.但是当我测试输入应用程序崩溃的数据的所有方式时
java.lang.StackOverflowError
在组合上,例如当我放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)
您必须记住以下几点:
- 您正在使用的
EditText
也可能包含可能导致崩溃的空格。为了避免这种情况,而不是服用editText.length()
最好采取editText.getText().toString().trim().length()
。 - 其次,确保在该布局中应限制用户仅输入必须为其设置属性
android:inputType="number"
的数字。