Very new to android java programming. I created a car payment calculator application for one of my classes and I am trying to create a checkbox that the user can check so that all the values stored in the TextViews and EditViews remain the same when the application is opened again.

Here is my activity:

public class MainActivity extends Activity implements OnClickListener,
    OnEditorActionListener, OnItemSelectedListener, OnFocusChangeListener,
    OnCheckedChangeListener {
private TextView payment;
private TextView interest;
private EditText principle;
private TextView interestText;
private CheckBox interestBox;
private EditText years;
private TextView apr;
Button plusbutton;
Button minusbutton;
private static String TAG = "CAR";
private Spinner period;
private double aprPercent;
private int t;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d(TAG, "onCreate");
    this.getReferences();
    this.setListeners();    
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, 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();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

public void getReferences() {
    payment = (TextView) findViewById(R.id.paymentLabel);
    interest = (TextView) findViewById(R.id.interestLabel);
    apr = (TextView) findViewById(R.id.aprLabel);
    aprPercent = Double.parseDouble(apr.getText().toString());
    interestText = (TextView) findViewById(R.id.interestText);
    interestBox = (CheckBox) findViewById(R.id.checkBox1);
    interestBox.setChecked(false);
    principle = (EditText) findViewById(R.id.principleEditText);
    years = (EditText) findViewById(R.id.yearsEditText);
    period = (Spinner) findViewById(R.id.spinner1);
    minusbutton = (Button) findViewById(R.id.minusbutton);
    plusbutton = (Button) findViewById(R.id.plusbutton);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter
            .createFromResource(this, R.array.split_array,
                    android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    period.setAdapter(adapter);


    // principle.setOnFocusChangeListener(this);
    Log.d(TAG, "getReferences principle: " + principle.getText()
            + " years:" + years.getText());

}

public void setListeners() { // where the event being consumed will be
                                // responding
    principle.setOnFocusChangeListener(this);
    principle.setOnEditorActionListener(this);
    years.setOnFocusChangeListener(this);
    years.setOnEditorActionListener(this);
    interestBox.setOnCheckedChangeListener(this);
    period.setOnItemSelectedListener(this);

    Log.d(TAG, "setListeners principle: " + principle.getText() + " years:"
            + years.getText());
}

public void setPeriodValue() {
    if (period.getSelectedItem().toString().equalsIgnoreCase("Monthly")) {
        t = 12;
    } else if (period.getSelectedItem().toString()
            .equalsIgnoreCase("Quarterly")) {
        t = 4;
    } else if (period.getSelectedItem().toString()
            .equalsIgnoreCase("Annually")) {
        t = 1;
    }
}

public void updateResults() {
    double dblPrinciple = Double
            .parseDouble(principle.getText().toString());
    double dblYears = Double.parseDouble(years.getText().toString());

    double num, denom, dblPayment;
    double r = aprPercent / 100;
    NumberFormat nf = NumberFormat.getNumberInstance();
    NumberFormat curr = NumberFormat.getCurrencyInstance();
    apr.setText(nf.format(aprPercent));
    setPeriodValue();
    num = (r / t);
    denom = (1 - Math.pow((1 + num), (t * -dblYears)));
    dblPayment = dblPrinciple * (num / denom);
    payment.setText(curr.format(dblPayment));
    interest.setText(curr
            .format((dblPayment * t * dblYears) - dblPrinciple));

}

public void onFocusChange(View v, boolean hasfocus) {
    Log.d(TAG, "Focus Change principle: " + principle.getText() + " years"
            + years.getText());
    switch (v.getId()) {
    case R.id.principleEditText:
    case R.id.yearsEditText:
        updateResults();
    default:
        updateResults();

    }
}

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    if(interestBox.isChecked()) {
        interest.setVisibility(View.VISIBLE);
        interestText.setVisibility(View.VISIBLE);
    }
    else {
        interest.setVisibility(View.INVISIBLE);
        interestText.setVisibility(View.INVISIBLE);
    }
    if (interestBox.isChecked()!=true){
        interest.setVisibility(View.INVISIBLE);
        interestText.setVisibility(View.INVISIBLE);
    }
    else {
        interest.setVisibility(View.VISIBLE);
        interestText.setVisibility(View.VISIBLE);
    }       
}

@Override
public void onNothingSelected(AdapterView<?> parent) {
    updateResults();
}

@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    updateResults();
    return false;
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.minusbutton:
        if (aprPercent == 1) {
            break;
        } else {
            aprPercent = aprPercent - 1.0;
            updateResults();
            break;
        }
    case R.id.plusbutton:
        if (aprPercent == 20) {
            break;
        } else {
            aprPercent = aprPercent + 1.0;
            updateResults();
            break;
        }
    }
}

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,
        long id) {
    updateResults();
}

My guess is that I have to do something with sharedprefs but I'm not exactly sure how to go about it. Any push in the right direction would be great. thank you.

2

There are 2 answers

0
M. Erfan Mowlaei On

Use getSharedPreferences(...).edit().putString(...).commit() to store values in "onPause()" and again use getSharedPreferences(...).getString(...) to retrieve information in your "onResume()". It's just that easy.

0
Vincent D. On

You will have to read how to save your Activity data. In my opinion you should not use checkbox to save this data but save it by default.

To save your data while the screen rotate you will have to check the OnSaveInstanceState and OnRestoreInstanceState like in this post. It will handle the data when rotated too.

To save your data for a longer time (changing of applications, closing application), You will have to use the Android preferences but check how works the lifecycle of an Activity. Basically you will need to save in the OnPause or OnDestroy and reload it in the OnResume or OnCreate.

Concerning the preferences you have a nice tutorial on the Vogella Website

//Get Data
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getActivity());
String url = settings.getString("url", "n/a"); 

//Save Data
Editor edit = preferences.edit();
edit.putString("username", "new_value_for_user");
edit.apply();