Dakota Dakota - 4 months ago 23
Java Question

Android: Resources Not Found Exception

I'm a complete newbie to Android development, and am three weeks into a class. The program compiles and runs just fine, until I try to change any of the EditTexts, or slide the seekBar.

Assignment: Create a mortgage calculator app that allows the user to enter a purchase price, down payment amount and an interest rate. Based on these values, the app should calculate the loan amount and display the monthly payment for 10, 20, and 30 year loans. Allow the user to select a custom loan duration (in years) by using a SeekBar and display the monthly payment for that custom loan duration.

I only have the numbers being divided into years for a start, and have not implemented the interest. At the moment it's just something that gets entered and stored. But that is not the issue. This error message is what appears when I attempt to change the first edit text at all.

02-10 00:12:14.801 1275-1275/com.example.dakota.de_mortgage E/InputEventSender﹕ Exception dispatching finished signal.
02-10 00:12:14.802 1275-1275/com.example.dakota.de_mortgage E/MessageQueue-JNI﹕ Exception in MessageQueue callback: handleReceiveCallback
02-10 00:12:14.986 1275-1275/com.example.dakota.de_mortgage E/MessageQueue-JNI﹕ android.content.res.Resources$NotFoundException: String resource ID #0x12
at android.content.res.Resources.getText(Resources.java:274)
at android.widget.TextView.setText(TextView.java:4122)
at com.example.dakota.de_mortgage.MainActivity.updateCustom(MainActivity.java:99)
at com.example.dakota.de_mortgage.MainActivity.access$100(MainActivity.java:18)
at com.example.dakota.de_mortgage.MainActivity$2.onTextChanged(MainActivity.java:154)
at android.widget.TextView.sendOnTextChanged(TextView.java:7663)
at android.widget.TextView.handleTextChanged(TextView.java:7723)
at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:9440)
at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:964)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:515)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:454)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:33)
at android.text.method.NumberKeyListener.onKeyDown(NumberKeyListener.java:121)
at android.widget.TextView.doKeyDown(TextView.java:5787)
at android.widget.TextView.onKeyDown(TextView.java:5600)
at android.view.KeyEvent.dispatch(KeyEvent.java:2609)
at android.view.View.dispatchKeyEvent(View.java:8338)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2306)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1682)
at android.app.Activity.dispatchKeyEvent(Activity.java:2699)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2221)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3918)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3880)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3578)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3476)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3635)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3476)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3611)
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3772)
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2208)
at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1849)
at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1840)
at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2185)
at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:143)
at andro
02-10 00:12:15.161 1275-1275/com.example.dakota.de_mortgage E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.dakota.de_mortgage, PID: 1275
android.content.res.Resources$NotFoundException: String resource ID #0x12
at android.content.res.Resources.getText(Resources.java:274)
at android.widget.TextView.setText(TextView.java:4122)
at com.example.dakota.de_mortgage.MainActivity.updateCustom(MainActivity.java:99)
at com.example.dakota.de_mortgage.MainActivity.access$100(MainActivity.java:18)
at com.example.dakota.de_mortgage.MainActivity$2.onTextChanged(MainActivity.java:154)
at android.widget.TextView.sendOnTextChanged(TextView.java:7663)
at android.widget.TextView.handleTextChanged(TextView.java:7723)
at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:9440)
at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:964)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:515)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:454)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:33)
at android.text.method.NumberKeyListener.onKeyDown(NumberKeyListener.java:121)
at android.widget.TextView.doKeyDown(TextView.java:5787)
at android.widget.TextView.onKeyDown(TextView.java:5600)
at android.view.KeyEvent.dispatch(KeyEvent.java:2609)
at android.view.View.dispatchKeyEvent(View.java:8338)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2306)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1682)
at android.app.Activity.dispatchKeyEvent(Activity.java:2699)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2221)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3918)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3880)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3578)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3476)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3635)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3476)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3611)
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3772)
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2208)
at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1849)
at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1840)
at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2185)
at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
at android.os.MessageQueue.nativePollOnce(Native Me


Here is the code.

package com.example.dakota.de_mortgage;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.text.TextWatcher;
import android.text.Editable;

public class MainActivity extends ActionBarActivity {

private static final String CUSTOM_YEAR = "CUSTOM_YEAR";
private static final String YEAR_PAY1 = "YEAR_PAY1";
private static final String YEAR_PAY2 = "YEAR_PAY2";
private static final String YEAR_PAY3 = "YEAR_PAY3";

private int currentCustomYear;
private double purchaseGiven;
private double downGiven;
private double interestGiven;
private double moneyRemain;

private TextView customTextView;
private TextView customYearView;
private EditText tenYearResult;
private EditText twntyYearResult;
private EditText thrtyYearResult;
private EditText customYearResult;
private EditText purchaseDown;
private EditText downText;
private EditText interestText;
private SeekBar customSeekBar;



@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

moneyRemain = 0;

customTextView = (TextView) findViewById(R.id.customTextView);
customYearView = (TextView) findViewById(R.id.customYearView);
tenYearResult = (EditText) findViewById(R.id.tenYearResult);
twntyYearResult = (EditText) findViewById(R.id.twntyYearResult);
thrtyYearResult = (EditText) findViewById(R.id.thrtyYearResult);
customYearResult = (EditText) findViewById(R.id.customYearResult);
purchaseDown = (EditText) findViewById(R.id.purchaseDown);
downText = (EditText) findViewById(R.id.downText);
interestText = (EditText) findViewById(R.id.interestText);

purchaseDown.addTextChangedListener(purchaseWatcher);
downText.addTextChangedListener(downWatcher);
interestText.addTextChangedListener(interestWatcher);

if ( savedInstanceState == null )
{
purchaseGiven = 1.0;
downGiven = 1.0;
interestGiven = 1.0;
currentCustomYear = 18;
}
else
{
purchaseGiven = savedInstanceState.getDouble(YEAR_PAY1);
downGiven = savedInstanceState.getDouble(YEAR_PAY2);
interestGiven = savedInstanceState.getDouble(YEAR_PAY3);

currentCustomYear =
savedInstanceState.getInt(CUSTOM_YEAR);
}

SeekBar customSeekBar = (SeekBar) findViewById(R.id.customSeekBar);
customSeekBar.setOnSeekBarChangeListener(customSeekBarListener);
}

private void updateStandard()
{
moneyRemain = purchaseGiven - downGiven;
tenYearResult.setText(String.format("%.02f", moneyRemain / 10));
twntyYearResult.setText(String.format("%.02f", moneyRemain / 20));
thrtyYearResult.setText(String.format("%.03f", moneyRemain / 30));
}


private void updateCustom()
{
moneyRemain = purchaseGiven - downGiven;
customYearView.setText(currentCustomYear);

customYearResult.setText(String.format("%.02f", moneyRemain / currentCustomYear));
}

@Override
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);

outState.putInt(CUSTOM_YEAR, currentCustomYear);
outState.putDouble(YEAR_PAY1, purchaseGiven);
outState.putDouble(YEAR_PAY2, downGiven);
outState.putDouble(YEAR_PAY3, interestGiven);
}

private OnSeekBarChangeListener customSeekBarListener = new SeekBar.OnSeekBarChangeListener()
{
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
currentCustomYear = seekBar.getProgress();
updateCustom();
}

@Override
public void onStartTrackingTouch(SeekBar seekBar)
{
}

@Override
public void onStopTrackingTouch(SeekBar seekBar)
{
}
};

private TextWatcher purchaseWatcher = new TextWatcher()
{

@Override
public void onTextChanged(CharSequence s, int start,
int before, int count)
{

try
{
purchaseGiven = Double.parseDouble(s.toString());
}
catch (NumberFormatException e)
{
purchaseGiven = 1.0;
}


updateStandard();
updateCustom();
}

@Override
public void afterTextChanged(Editable s)
{
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after)
{
}
};

private TextWatcher downWatcher = new TextWatcher()
{

@Override
public void onTextChanged(CharSequence t, int start,
int before, int count)
{
try
{
downGiven = Double.parseDouble(t.toString());
}
catch (NumberFormatException e)
{
downGiven = 1.0;
}

updateStandard();
updateCustom();
}

@Override
public void afterTextChanged(Editable t)
{
}

@Override
public void beforeTextChanged(CharSequence t, int start, int count,
int after)
{
}
};

private TextWatcher interestWatcher = new TextWatcher()
{

@Override
public void onTextChanged(CharSequence s, int start,
int before, int count)
{

try
{
interestGiven = Double.parseDouble(s.toString());
}
catch (NumberFormatException e)
{
interestGiven = 1.0;
}


updateStandard();
updateCustom();
}

@Override
public void afterTextChanged(Editable s)
{
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after)
{
}
};
}


And here is the xml if that matters.

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:background="#FFF" android:id="@+id/tableLayout"
android:stretchColumns="1,2,3" android:padding="5dp">

<TableRow android:layout_height="wrap_content"
android:layout_width="match_parent" android:id="@+id/tableRow0">
<TextView android:id="@+id/purchase"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Purchase" android:textColor="#000"
android:gravity="right" android:paddingRight="5dp"></TextView>
<EditText android:layout_width="wrap_content"
android:id="@+id/purchaseDown"
android:layout_height="wrap_content" android:layout_span="3"
android:inputType="numberDecimal" android:layout_weight="1">
</EditText>
</TableRow>

//row 9
<TableRow android:layout_height="wrap_content"
android:layout_width="match_parent" android:id="@+id/tableRow9">
<TextView android:id="@+id/down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Down" android:textColor="#000"
android:gravity="right" android:paddingRight="5dp"></TextView>
<EditText android:layout_width="wrap_content"
android:id="@+id/downText"
android:layout_height="wrap_content" android:layout_span="3"
android:inputType="numberDecimal" android:layout_weight="1">
</EditText>
</TableRow>

<TableRow android:layout_height="wrap_content"
android:layout_width="match_parent" android:id="@+id/tableRow3">
<TextView android:id="@+id/interest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Interest" android:textColor="#000"
android:gravity="right" android:paddingRight="5dp"></TextView>
<EditText android:layout_width="wrap_content"
android:id="@+id/interestText"
android:layout_height="wrap_content" android:layout_span="3"
android:inputType="numberDecimal" android:layout_weight="1">
</EditText>
</TableRow>

<TableRow android:layout_height="wrap_content"
android:layout_width="match_parent" android:id="@+id/tableRow2">
<TextView android:id="@+id/tenYear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="10 Years" android:textColor="#000"
android:gravity="right" android:paddingRight="5dp"></TextView>
<EditText android:layout_width="wrap_content"
android:id="@+id/tenYearResult"
android:layout_height="wrap_content" android:text="0.0"
android:gravity="center" android:focusable="false"
android:layout_weight="1" android:textSize="14sp"
android:cursorVisible="false" android:longClickable="false"
android:layout_gravity="left">
</EditText>
</TableRow>

<TableRow android:layout_height="wrap_content"
android:layout_width="match_parent" android:id="@+id/tableRow1">
<TextView android:id="@+id/twntyYear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="20 Years" android:textColor="#000"
android:gravity="right" android:paddingRight="5dp"></TextView>
<EditText android:layout_width="wrap_content"
android:id="@+id/twntyYearResult"
android:layout_height="wrap_content" android:text="0.0"
android:gravity="center" android:focusable="false"
android:layout_weight="1" android:textSize="14sp"
android:cursorVisible="false" android:longClickable="false"
android:layout_gravity="left">
</EditText>
</TableRow>

<TableRow android:layout_height="wrap_content"
android:layout_width="match_parent" android:id="@+id/tableRow5">
<TextView android:id="@+id/thrtyYear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="30 Years" android:textColor="#000"
android:gravity="right" android:paddingRight="5dp"></TextView>
<EditText android:layout_width="wrap_content"
android:id="@+id/thrtyYearResult"
android:layout_height="wrap_content" android:text="0.0"
android:gravity="center" android:focusable="false"
android:layout_weight="1" android:textSize="14sp"
android:cursorVisible="false" android:longClickable="false"
android:layout_gravity="left">
</EditText>
</TableRow>

<TableRow android:layout_height="wrap_content"
android:layout_width="match_parent" android:id="@+id/tableRow4">
<TextView android:id="@+id/customTextView"
android:layout_width="wrap_content" android:text="Custom"
android:textColor="#000" android:paddingRight="5dp"
android:gravity="right|center_vertical"
android:layout_height="match_parent" android:paddingBottom="5dp"
android:focusable="false"></TextView>
<SeekBar android:layout_height="wrap_content"
android:layout_width="match_parent"
android:id="@+id/customSeekBar" android:layout_span="2"
android:progress="18" android:paddingLeft="8dp"
android:paddingRight="8dp" android:paddingBottom="5dp"
android:layout_weight="1"></SeekBar>
<TextView android:id="@+id/customYearView"
android:layout_width="wrap_content" android:text="18"
android:textColor="#000" android:gravity="center_vertical"
android:layout_height="match_parent" android:paddingLeft="5dp"
android:paddingBottom="5dp" android:focusable="false"
android:layout_weight="1"></TextView>
</TableRow>

<TableRow android:layout_height="wrap_content"
android:layout_width="match_parent" android:id="@+id/tableRow6">
<EditText android:layout_width="wrap_content"
android:id="@+id/customYearResult"
android:layout_height="wrap_content" android:text="0.0"
android:gravity="center" android:focusable="false"
android:layout_weight="1" android:textSize="14sp"
android:cursorVisible="false" android:longClickable="false"
android:layout_gravity="left">
</EditText>
</TableRow>
</TableLayout>


I've spent hours trying to fix it myself and looking for a solution. I don't know if I have been looking at the wrong places or what, but I'm at the end of my rope.

Thank you for any help you may be able to give. If there's more info required, please just ask.

Edit: Added full error message.

Answer

I see one mistake in your code..

please use this line

customYearView.setText(""+currentCustomYear);

instead of this

customYearView.setText(currentCustomYear);

As TextView accepts String value.