2016-04-22 7 views
0

AndroidとJavaのプログラミングには新しく、最初のアプリケーションで作業していますが、問題が発生しました。 FuelAmountFuelCostCashSpendの3つの編集テキストがあります。FAが記入され、FCが記入されている場合、CSは自動的に記入する必要があります。 私はだから私は私のEditTextsのすべてにaddTextChangedListenerを試してみましたが、見つける など>CS = FCFA、それはすべての可能な組み合わせ= CSFA>FCで仕事をしたいです。しかし、私はその後、CashSpendFuelAmount、その後CashSpendFuelCostを入れてときのような組み合わせにjava.lang.StackOverflowErrorをAndroid自動更新EditTextが他に埋め込まれている場合

と入力のデータアプリのクラッシュをすべての方法をテストしていたとき。

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) 
+0

(完全)エラーを投稿してください。 – yennsarah

+0

それは私のエミュレータでうまく動作します..あなたは全体のコードを投稿できますか? – Bharatesh

+0

アクティビティコード全体が追加されました。すべての訴訟? – relliz

答えて

0

あなたの心に維持する必要があり、いくつかのものがあります。

使用している
  1. EditTextはまた、クラッシュにつながる可能性があり、スペースが含まれていることができます。それを避けるために、editText.length()を取るのがより良いeditText.getText().toString().trim().length()です。
  2. 第2に、そのレイアウトで、属性android:inputType="number"を設定する必要がある番号だけを入力するようにユーザーを制限する必要があることを確認します。
+0

私のすべてのEditTextはandroid:inputType = "numberDecimal"を使用しています。また、私はあなたの提案を落とし、lenght()をgetText()。toString()。trim()。length()に置き換えました。 – relliz

+0

私はエラーを投稿することができますので、お手数ですが –

+0

下部のメインポストにエラーが追加されました。 – relliz

関連する問題