我一直在尝试使该程序正常运行,但由于某种原因,它将无法计算复利。一点帮助将不胜感激。注意,我没有完成将任何值的if语句输入到compoundInterestEditText字段中的操作。我希望它能与我所拥有的一起工作。 endValueEditText甚至不会更新。
Main.java:
package com.example.compoundinterest;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.Spinner;
import android.app.Activity;
public class Main extends Activity {
//contants used when saving and restoring state
private static final String CAPITAL_TOTAL = "CAPITAL_TOTAL";
private static final String INTEREST_RATE = "INTEREST_RATE";
private static final String YEARS_GROW = "YEARS_GROW";
private static final String ANNUAL_ADDITION = "ANNUAL_ADDITION";
private static final String COMPOUND_RATE = "COMPOUND_RATE";
private static final String END_VALUE = "END_VALUE";
//double values for calculations
private double currentCapital;
private double currentInterestRate;
private double currentYearsToGrow;
private double currentAnnualAddition;
private double currentCompoundInterest;
private double currentEndValue;
//declare variables to be used
private EditText capitalEditText;
private EditText interestRateEditText;
private EditText yearsToGrowEditText;
private EditText annualAdditionEditText;
private EditText compoundInterestEditText;
private EditText endValueEditText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//check if app has been started or being restored from memory
if(savedInstanceState == null) {
currentCapital = 0.0;//initialize the capital amount to zero
currentInterestRate = 0;//initialize the interest rate to zero
currentYearsToGrow = 0;//initialize the years to grow to zero
currentAnnualAddition = 0;//initialize the annual addition to zero
currentCompoundInterest = 0;//initialize the interest rate to zero
currentEndValue = 0;//initialize the end value to zero
}//end if
else//app is being restored from memory, not executed from scratch
{
//initialize the capital amount to saved amount
currentCapital = savedInstanceState.getDouble(CAPITAL_TOTAL);
//initialize interest rate to saved amount
currentInterestRate = savedInstanceState.getInt(INTEREST_RATE);
//initialize years to grow amount to saved amount
currentYearsToGrow = savedInstanceState.getInt(YEARS_GROW);
//initialize annual addition amount to saved amount
currentAnnualAddition = savedInstanceState.getInt(ANNUAL_ADDITION);
//initialize compound interest rate amount to saved amount
currentCompoundInterest = savedInstanceState.getInt(COMPOUND_RATE);
//initialize end value amount to saved amount
currentEndValue = savedInstanceState.getInt(END_VALUE);
}//end else
//get references to EditText fields
capitalEditText = (EditText) findViewById(R.id.capitalEditText);
interestRateEditText = (EditText) findViewById(R.id.interestRateEditText);
yearsToGrowEditText = (EditText) findViewById(R.id.yearsToGrowEditText);
annualAdditionEditText = (EditText) findViewById(R.id.annualAdditionEditText);
compoundInterestEditText = (EditText) findViewById(R.id.compoundInterestEditText);
endValueEditText = (EditText) findViewById(R.id.endValueEditText);
endValueEditText.addTextChangedListener(endValueEditTextWatcher);
}//end of method onCreate
//function for updating the values as the numbers entered by user are changed
private void updateValue() {
if(currentCompoundInterest == 1) {
double finalCalculation = currentCapital * (1 + currentInterestRate);
endValueEditText.setText(String.format("%.02f", finalCalculation));
}
else if(currentCompoundInterest ==2) {
}
else if(currentCompoundInterest==3) {
}
else if(currentCompoundInterest==4) {
}
}//end of updateValue() function
//main function to aid in updating the user input
private TextWatcher endValueEditTextWatcher = new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
//convert billEditText's text to a double
try {
currentCapital = Double.parseDouble(s.toString());
currentInterestRate = Double.parseDouble(s.toString());
currentYearsToGrow = Double.parseDouble(s.toString());
currentAnnualAddition = Double.parseDouble(s.toString());
currentCompoundInterest = Double.parseDouble(s.toString());
currentEndValue = Double.parseDouble(s.toString());
}//end try
catch (NumberFormatException e)
{
currentCapital = 0.0;//default if an exception occurs
currentInterestRate = 0.0;//default if an exception occurs
currentYearsToGrow = 0.0;//default if an exception occurs
currentAnnualAddition = 0.0;//default if an exception occurs
currentCompoundInterest = 0.0;//default if an exception occurs
currentEndValue = 0.0;//default if an exception occurs
}//end catch
//run updateValue Function
updateValue();
}//end of onTextChanged inner onTextChanged
public void afterTextChanged(Editable s)
{
}//end method afterTextChanged
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
}//end method beforeTextChanged
};//end of endValueEditTextWatcher
}//end of Compound Interest function
main.xml:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TableRow
android:id="@+id/tableRow7"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/instructionsTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="20dp"
android:paddingTop="5dp"
android:text="Enter Value to be borrowed or invested:"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textSize="14sp" />
</TableRow>
<TableRow
android:id="@+id/tableRow1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/capitalTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Capital" />
<EditText
android:id="@+id/capitalEditText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:inputType="numberDecimal" >
<requestFocus />
</EditText>
</TableRow>
<TableRow
android:id="@+id/tableRow2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/interestRateTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Interest Rate (%)" />
<EditText
android:id="@+id/interestRateEditText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:inputType="numberDecimal" />
</TableRow>
<TableRow
android:id="@+id/tableRow3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/yearsToGrowTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Years To Grow" />
<EditText
android:id="@+id/yearsToGrowEditText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:inputType="numberDecimal" />
</TableRow>
<TableRow
android:id="@+id/tableRow4"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/annualAdditionTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Annual Addition" />
<EditText
android:id="@+id/annualAdditionEditText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:inputType="numberDecimal"/>
</TableRow>
<TableRow
android:id="@+id/tableRow5"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/compoundInterestTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Compound Interest" />
<EditText
android:id="@+id/compoundInterestEditText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10" />
</TableRow>
<TableRow
android:id="@+id/tableRow6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="50dp" >
<TextView
android:id="@+id/endValueTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingTop="20dp"
android:text="End Value" />
<EditText
android:id="@+id/endValueEditText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:clickable="false"
android:ems="10"
android:focusable="false"
android:focusableInTouchMode="false"
android:inputType="numberDecimal" />
</TableRow>
</TableLayout>
LogCat:
10-19 15:30:59.251: E/CircleShortcutWidget(641): density = 320
10-19 15:30:59.251: E/CircleShortcutWidget(641): pkg name =com.android.contacts, activityName=com.android.contacts.activities.DialtactsActivity
10-19 15:30:59.251: D/CircleShortcutWidget(641): mIconWidth =0
10-19 15:30:59.251: D/PhoneStatusBar(777): disable: < expand icons alerts ticker system_info BACK* HOME RECENT CLOCK* >
10-19 15:30:59.261: D/CircleShortcutWidget(641): BitmapDrawable
10-19 15:30:59.261: E/CircleShortcutWidget(641): pkg name =com.android.mms, activityName=com.android.mms.ui.ConversationComposer
10-19 15:30:59.261: D/CircleShortcutWidget(641): mIconWidth =0
10-19 15:30:59.261: D/CircleShortcutWidget(641): BitmapDrawable
10-19 15:30:59.261: E/CircleShortcutWidget(641): pkg name =com.sec.android.widgetapp.diotek.smemo, activityName=com.sec.android.widgetapp.q1_penmemo.MemoListActivity
10-19 15:30:59.261: D/CircleShortcutWidget(641): mIconWidth =0
10-19 15:30:59.261: D/CircleShortcutWidget(641): BitmapDrawable
10-19 15:30:59.261: E/CircleShortcutWidget(641): pkg name =com.sec.android.app.camera, activityName=com.sec.android.app.camera.Camera
10-19 15:30:59.261: D/CircleShortcutWidget(641): mIconWidth =0
10-19 15:30:59.261: D/CircleShortcutWidget(641): BitmapDrawable
10-19 15:30:59.261: D/KeyguardViewMediator(641): setHidden false
10-19 15:30:59.271: D/CircleLockScreen(641): onRefreshBatteryInfo() showPatteryInfo: true pluggedIn: true batteryLevel: 76
10-19 15:30:59.271: D/ClockWidget(641): refreshTime()
10-19 15:30:59.281: D/ClockWidget(641): TTS Message = It is 3 : 30 PM, Friday, October 19
10-19 15:30:59.281: W/LockPatternKeyguardView(641): Couldn't find transport control widget
10-19 15:30:59.281: D/ClockWidget(641): refreshTime()
10-19 15:30:59.291: D/ClockWidget(641): TTS Message = It is 3 : 30 PM, Friday, October 19
10-19 15:30:59.291: D/ClockWidget(641): isServiceEnable = false cityId = cityId:347628
10-19 15:30:59.291: D/ClockWidget(641): Weather Demon is not running, Set visibility to GONE
10-19 15:30:59.301: E/LockPatternKeyguardView(641): mResetWakeLock.release()
10-19 15:30:59.311: D/KeyguardViewMediator(641): setHidden false
10-19 15:30:59.321: D/KeyguardUpdateMonitor(641): handleClockVisibilityChanged()
10-19 15:30:59.321: D/KeyguardViewMediator(641): adjustStatusBarLocked: mShowing=true mHidden=false isSecure=false --> flags=0x1200000
10-19 15:30:59.331: D/KeyguardViewMediator(641): setHidden false
10-19 15:30:59.331: D/KeyguardUpdateMonitor(641): handleClockVisibilityChanged()
10-19 15:30:59.331: D/KeyguardViewMediator(641): adjustStatusBarLocked: mShowing=true mHidden=false isSecure=false --> flags=0x1200000
10-19 15:30:59.331: D/STATUSBAR-StatusBarManagerService(641): manageDisableList what=0x1200000 pkg=android
10-19 15:30:59.331: D/STATUSBAR-StatusBarManagerService(641): manageDisableList what=0x1200000 pkg=android
10-19 15:30:59.351: D/memalloc(331): ion: Allocated buffer base:0x439ad000 size:3674112 fd:11
10-19 15:30:59.351: D/memalloc(641): ion: Mapped buffer base:0x65c51000 size:3674112 offset:0 fd:386
10-19 15:30:59.371: I/Adreno200-EGLSUB(331): <CreateImage:893>: Android Image
10-19 15:30:59.371: D/KeyguardViewMediator(641): setHidden false
10-19 15:30:59.371: D/KeyguardViewMediator(641): setHidden false
10-19 15:30:59.381: I/Adreno200-EGLSUB(331): <GetImageAttributes:1102>: RGBA_8888
10-19 15:30:59.381: D/memalloc(331): ion: Freeing buffer base:0x449ea000 size:1884160 fd:35
10-19 15:30:59.381: D/memalloc(331): ion: Freeing buffer base:0x446ca000 size:3276800 fd:37
10-19 15:30:59.381: I/Adreno200-EGLSUB(777): <ConfigWindowMatch:2078>: Format RGBA_8888.
10-19 15:30:59.391: D/memalloc(331): ion: Allocated buffer base:0x446ca000 size:3485696 fd:35
10-19 15:30:59.401: D/memalloc(331): ion: Allocated buffer base:0x44abd000 size:3768320 fd:37
10-19 15:30:59.401: D/memalloc(777): ion: Mapped buffer base:0x6022d000 size:3485696 offset:0 fd:103
10-19 15:30:59.411: D/memalloc(10083): ion: Mapped buffer base:0x5ce44000 size:3768320 offset:0 fd:52
10-19 15:30:59.441: I/Adreno200-EGLSUB(331): <CreateImage:893>: Android Image
10-19 15:30:59.441: I/Adreno200-EGLSUB(331): <GetImageAttributes:1158>: RGBX_8888
10-19 15:30:59.441: D/KeyguardViewMediator(641): setHidden false
10-19 15:30:59.491: D/dalvikvm(777): GC_FOR_ALLOC freed 2139K, 20% free 21315K/26595K, paused 68ms
10-19 15:30:59.562: D/memalloc(331): ion: Allocated buffer base:0x4563a000 size:3485696 fd:48
10-19 15:30:59.562: D/memalloc(777): ion: Mapped buffer base:0x60580000 size:3485696 offset:0 fd:106
10-19 15:30:59.562: I/Adreno200-EGLSUB(331): <CreateImage:893>: Android Image
10-19 15:30:59.562: I/Adreno200-EGLSUB(331): <GetImageAttributes:1102>: RGBA_8888
10-19 15:30:59.562: D/memalloc(331): ion: Freeing buffer base:0x427ad000 size:3276800 fd:45
10-19 15:30:59.562: D/KeyguardViewMediator(641): setHidden false
10-19 15:30:59.562: D/KeyguardViewMediator(641): setHidden false
10-19 15:30:59.562: D/KeyguardViewMediator(641): setHidden false
10-19 15:30:59.572: D/KeyguardViewMediator(641): setHidden false
10-19 15:30:59.572: D/memalloc(331): ion: Allocated buffer base:0x421c7000 size:94208 fd:45
10-19 15:30:59.572: D/memalloc(331): ion: Freeing buffer base:0x42312000 size:163840 fd:36
10-19 15:30:59.572: D/memalloc(777): ion: Mapped buffer base:0x5dd63000 size:94208 offset:0 fd:100
10-19 15:30:59.572: D/KeyguardViewMediator(641): setHidden false
10-19 15:30:59.582: W/SurfaceFlinger(331): id=19405(2764) createSurface (1440x1280),-1 flag=20000
10-19 15:30:59.582: I/Adreno200-EGLSUB(331): <CreateImage:893>: Android Image
10-19 15:30:59.582: I/Adreno200-EGLSUB(331): <GetImageAttributes:1088>: RGB_565
10-19 15:30:59.602: W/SurfaceFlinger(331): id=19406(2765) createSurface (720x2560),-1 flag=20000
10-19 15:30:59.612: D/memalloc(331): ion: Allocated buffer base:0x427ad000 size:3674112 fd:36
10-19 15:30:59.612: D/memalloc(641): ion: Mapped buffer base:0x65fd2000 size:3674112 offset:0 fd:395
10-19 15:30:59.612: W/SurfaceFlinger(331): id=19407(2766) createSurface (1440x1280),-1 flag=20000
10-19 15:30:59.632: W/SurfaceFlinger(331): id=19408(2767) createSurface (720x2560),-1 flag=20000
10-19 15:30:59.632: I/Adreno200-EGLSUB(331): <CreateImage:893>: Android Image
10-19 15:30:59.632: I/Adreno200-EGLSUB(331): <GetImageAttributes:1102>: RGBA_8888
10-19 15:30:59.632: D/KeyguardViewMediator(641): setHidden false
10-19 15:30:59.632: W/SurfaceFlinger(331): id=19403 Removed idx=11 Map Size=5
10-19 15:30:59.632: W/SurfaceFlinger(331): id=19405 Removed idx=7 Map Size=5
10-19 15:30:59.632: W/SurfaceFlinger(331): id=19403 Removed idx=-2 Map Size=5
10-19 15:30:59.632: W/SurfaceFlinger(331): id=19406 Removed idx=7 Map Size=5
10-19 15:30:59.632: W/SurfaceFlinger(331): id=19405 Removed idx=-2 Map Size=5
10-19 15:30:59.642: W/SurfaceFlinger(331): id=19407 Removed idx=7 Map Size=5
10-19 15:30:59.642: W/SurfaceFlinger(331): id=19406 Removed idx=-2 Map Size=5
10-19 15:30:59.642: W/SurfaceFlinger(331): id=19408 Removed idx=7 Map Size=5
10-19 15:30:59.642: W/SurfaceFlinger(331): id=19407 Removed idx=-2 Map Size=5
10-19 15:30:59.642: W/SurfaceFlinger(331): id=19408 Removed idx=-2 Map Size=5
10-19 15:30:59.652: D/KeyguardViewMediator(641): setHidden false
10-19 15:30:59.652: D/memalloc(331): ion: Allocated buffer base:0x4598d000 size:3768320 fd:55
10-19 15:30:59.652: D/memalloc(10083): ion: Mapped buffer base:0x5d2dc000 size:3768320 offset:0 fd:59
10-19 15:30:59.662: D/KeyguardViewMediator(641): setHidden false
10-19 15:30:59.672: I/Adreno200-EGLSUB(331): <CreateImage:893>: Android Image
10-19 15:30:59.672: I/Adreno200-EGLSUB(331): <GetImageAttributes:1158>: RGBX_8888
10-19 15:30:59.722: D/memalloc(331): ion: Allocated buffer base:0x44e55000 size:3485696 fd:64
10-19 15:30:59.722: D/memalloc(777): ion: Mapped buffer base:0x60a9d000 size:3485696 offset:0 fd:109
10-19 15:30:59.722: I/Adreno200-EGLSUB(331): <CreateImage:893>: Android Image
10-19 15:30:59.722: I/Adreno200-EGLSUB(331): <GetImageAttributes:1102>: RGBA_8888
10-19 15:30:59.992: D/KeyguardUpdateMonitor(641): received broadcast android.intent.action.TIME_TICK
10-19 15:30:59.992: D/KeyguardUpdateMonitor(641): handleTimeUpdate
10-19 15:30:59.992: W/AlarmManager(641): FACTORY_ON= 0
10-19 15:31:00.002: D/STATUSBAR-Clock(777): onReceive() - ACTION_TIME_TICK
10-19 15:31:00.002: D/STATUSBAR-Clock(777): updateClock :3:31 PM
10-19 15:31:00.002: D/STATUSBAR-DateView(777): updateClock :10/19/2012
10-19 15:31:00.052: I/Adreno200-EGLSUB(331): <CreateImage:893>: Android Image
10-19 15:31:00.052: I/Adreno200-EGLSUB(331): <GetImageAttributes:1102>: RGBA_8888
10-19 15:31:00.062: D/ClockWidget(641): refreshTime()
10-19 15:31:00.072: D/ClockWidget(641): TTS Message = It is 3 : 31 PM, Friday, October 19
10-19 15:31:00.092: D/memalloc(331): ion: Allocated buffer base:0x45d25000 size:3674112 fd:71
10-19 15:31:00.092: D/memalloc(641): ion: Mapped buffer base:0x66353000 size:3674112 offset:0 fd:400
10-19 15:31:00.102: I/Adreno200-EGLSUB(331): <CreateImage:893>: Android Image
10-19 15:31:00.112: I/Adreno200-EGLSUB(331): <GetImageAttributes:1102>: RGBA_8888
10-19 15:31:00.142: E/SMD(327): DCD ON
10-19 15:31:00.152: D/memalloc(331): ion: Allocated buffer base:0x4614b000 size:3768320 fd:74
10-19 15:31:00.152: D/memalloc(10083): ion: Mapped buffer base:0x5d674000 size:3768320 offset:0 fd:62
10-19 15:31:00.162: I/Adreno200-EGLSUB(331): <CreateImage:893>: Android Image
10-19 15:31:00.162: I/Adreno200-EGLSUB(331): <GetImageAttributes:1158>: RGBX_8888
10-19 15:31:00.763: D/BatteryService(641): update start
10-19 15:31:00.763: D/KeyguardUpdateMonitor(641): received broadcast android.intent.action.BATTERY_CHANGED
10-19 15:31:00.763: D/BatteryService(641): level:76 scale:100 status:2 health:2 present:true voltage: 4138 temperature: 289 technology: Li-ion AC powered:false USB powered:true icon:17303135 invalid charger:0
10-19 15:31:00.763: D/ThermistorObserver(641): mBatteryBRForAMOLED : onReceive() : newTemperature : 289
10-19 15:31:00.773: E/MTPJNIInterface(6119): In MTPJNIINterface onReceive:android.intent.action.BATTERY_CHANGED
10-19 15:31:00.773: D/KeyguardUpdateMonitor(641): handleBatteryUpdate
10-19 15:31:00.773: D/memalloc(331): ion: Allocated buffer base:0x42269000 size:94208 fd:77
10-19 15:31:00.773: D/memalloc(331): ion: Freeing buffer base:0x4233a000 size:163840 fd:61
10-19 15:31:00.773: D/memalloc(777): ion: Mapped buffer base:0x5dd95000 size:94208 offset:0 fd:52
10-19 15:31:00.773: I/Adreno200-EGLSUB(331): <CreateImage:893>: Android Image
10-19 15:31:00.773: I/Adreno200-EGLSUB(331): <GetImageAttributes:1088>: RGB_565
10-19 15:31:00.773: D/STATUSBAR-BatteryController(777): onReceive() - ACTION_BATTERY_CHANGED
10-19 15:31:00.773: D/STATUSBAR-BatteryController(777): onReceive() - level:76
10-19 15:31:00.773: D/STATUSBAR-BatteryController(777): onReceive() - plugged:2
10-19 15:31:00.773: D/STATUSBAR-BatteryController(777): onReceive() - BATTERY_STATUS_CHARGING:
10-19 15:31:01.113: E/MP-Decision(1348): DOWN Ld:59 Ns:1.100000 Ts:190 rq:0.000000 seq:196.000000
: E/(): Device disconnected
最佳答案
我猜您会收到堆栈溢出异常,因为setText()
调用onTextChanged()
,调用updateValues()
调用setText()
调用...(一遍又一遍)。只需向您的TextWatcher添加一个布尔值:
private TextWatcher endValueEditTextWatcher = new TextWatcher() {
boolean update = false;
public void onTextChanged(CharSequence s, int start, int before, int count) {
update = !update;
if(!update)
return;
...
}
}
但是我认为您创建了一个奇怪的用户界面:只有当用户在
endValueEditText
中键入一个值时,才会运行updateValues()
。我认为您应该创建一个标有“计算利息”的按钮,并改为在此按钮的OnClickListener中读取EditText值。您还应该将endValueEditText
更改为TextView,因为用户调用实际上会更改此值。