0

If anyone could help me with the following problem I would be eternally grateful.

My android app is a questionnaire to carry out property surveys. Each activity relates to an element of the property i.e. kitchen, bathroom, central heating etc. There will be circa 50 questions when the app is complete. Each activity has three Spinners and two Edit Texts with which the user must input data relating to the age and condition of the relevant element of the property before moving onto the next activity.

My problem is as follows:

Question 1 relates to the kitchen. Once all the relevant data is inputted I use an intent (via a 'next page' button) to start the next activity which relates to the bathroom. However, if I realise I made an error with my data input on the kitchen activity and go back via an intent from the bathroom activity (in the same way I got to the bathroom activity from the kitchen activity) the data I previously inputted is no longer there.

How do I retain this data? It is essential that my app users can flick backwards and forwards between the survey questions and view the data they have previously inputted. Once all 50 questions have been answered the data will be saved to a database and the next property can then be surveyed.

I have trawled the internet and various books for the answer to this but I am encountering conflicting information. Some say use on Pause, others say on Stop, others say on Saved Instance State. I'm confused?? I've been stuck on this for three days now so any help is very much appreciated.

Kitchen Activity below followed by Bathroom Activity..........

    package com.example.basicview6;

import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;

public class Kitchen extends Activity {

// defining the variables that will be displayed on the page
String[] age, renewal, main;
Spinner s1, s2, sMain;
ToggleButton repairs;
EditText repDesc, repCost, quantity;
Button back, next;
TextView life, qty, unit;

// creating the layout from the main xml file
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.kitchen);

    // getting the string array values from the 'strings xml' resources file
    // and applying them to the relevant variable
    age = getResources().getStringArray(R.array.age_array);
    renewal = getResources().getStringArray(R.array.renewal_array);
    main = getResources().getStringArray(R.array.kitchen_array);

    // getting the Spinner widget from the main xml and applying it to the
    // 's1' variable
    s1 = (Spinner) findViewById(R.id.spAge);
    s2 = (Spinner) findViewById(R.id.spRenewal);
    sMain = (Spinner) findViewById(R.id.spKitchen);
    repairs = (ToggleButton) findViewById(R.id.tbRepairs);
    repDesc = (EditText) findViewById(R.id.etRepDesc);
    repCost = (EditText) findViewById(R.id.etRepCost);
    quantity = (EditText) findViewById(R.id.etQuantity);
    back = (Button) findViewById(R.id.bBack);
    next = (Button) findViewById(R.id.bNext);
    life = (TextView) findViewById(R.id.tvLife);
    qty = (TextView) findViewById(R.id.tvQuantity);
    unit = (TextView) findViewById(R.id.tvUnitM);

    life.setVisibility(View.INVISIBLE);
    quantity.setVisibility(View.INVISIBLE);
    qty.setVisibility(View.INVISIBLE);
    unit.setVisibility(View.INVISIBLE);

    /*
     * creating a new 'string type' ArrayAdapter and telling it to display
     * the values of the relevant variable as a simple spinner item
     */
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, age);
    ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, renewal);
    ArrayAdapter<String> adapterM = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, main);

    // priming the s1 Spinner variable for an array item to be selected -
    // standby mode
    s1.setAdapter(adapter);
    s1.setOnItemSelectedListener(new OnItemSelectedListener() {

        // telling the program what to do when an item is selected
        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            int index = arg0.getSelectedItemPosition();

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
        }

    });
    s2.setAdapter(adapter2);
    s2.setOnItemSelectedListener(new OnItemSelectedListener() {

        // telling the program what to do when an item is selected
        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            int index = arg0.getSelectedItemPosition();

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
        }

    });
    sMain.setAdapter(adapterM);
    sMain.setOnItemSelectedListener(new OnItemSelectedListener() {

        // telling the program what to do when an item is selected
        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            int index = arg0.getSelectedItemPosition();

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
        }

    });

    // setting up the OnClickListerner for the repairs toggle button
    repairs.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            if (repairs.isChecked()) {
                repDesc.setVisibility(View.VISIBLE);
                repCost.setVisibility(View.VISIBLE);
            } else {
                repDesc.setVisibility(View.INVISIBLE);
                repCost.setVisibility(View.INVISIBLE);
            }

        }
    });
    // setting up the OnClickListener for the Next button
    next.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent openBathroom = new Intent(
                    "com.example.basicview6.BATHROOM");
            startActivity(openBathroom);

        }
    });

}

}

BATHROOM ACTIVITY ...................

package com.example.basicview6;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;

public class Bathroom extends Activity {

// defining the variables that will be displayed on the page
String[] age, renewal, main;
Spinner s1, s2, sMain;
ToggleButton repairs;
EditText repDesc, repCost, quantity;
Button back, next;
TextView life, qty, unit;

// creating the layout from the main xml file
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.bathroom);

    // getting the string array values from the 'strings xml' resources file
    // and applying them to the relevant variable
    age = getResources().getStringArray(R.array.age_array);
    renewal = getResources().getStringArray(R.array.renewal_array);
    main = getResources().getStringArray(R.array.bathroom_array);

    // getting the Spinner widget from the main xml and applying it to the
    // 's1' variable
    s1 = (Spinner) findViewById(R.id.spAge);
    s2 = (Spinner) findViewById(R.id.spRenewal);
    sMain = (Spinner) findViewById(R.id.spBathroom);
    repairs = (ToggleButton) findViewById(R.id.tbRepairs);
    repDesc = (EditText) findViewById(R.id.etRepDesc);
    repCost = (EditText) findViewById(R.id.etRepCost);
    quantity = (EditText) findViewById(R.id.etQuantity);
    back = (Button) findViewById(R.id.bBack);
    next = (Button) findViewById(R.id.bNext);
    life = (TextView) findViewById(R.id.tvLife);
    qty = (TextView) findViewById(R.id.tvQuantity);
    unit = (TextView) findViewById(R.id.tvUnitM);

    life.setVisibility(View.INVISIBLE);
    quantity.setVisibility(View.INVISIBLE);
    qty.setVisibility(View.INVISIBLE);
    unit.setVisibility(View.INVISIBLE);

    /*
     * creating a new 'string type' ArrayAdapter and telling it to display
     * the values of the relevant variable as a simple spinner item
     */
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, age);
    ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, renewal);
    ArrayAdapter<String> adapterM = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, main);

    // priming the s1 Spinner variable for an array item to be selected -
    // standby mode
    s1.setAdapter(adapter);
    s1.setOnItemSelectedListener(new OnItemSelectedListener() {

        // telling the program what to do when an item is selected
        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            int index = arg0.getSelectedItemPosition();

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
        }

    });
    s2.setAdapter(adapter2);
    s2.setOnItemSelectedListener(new OnItemSelectedListener() {

        // telling the program what to do when an item is selected
        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            int index = arg0.getSelectedItemPosition();

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
        }

    });
    sMain.setAdapter(adapterM);
    sMain.setOnItemSelectedListener(new OnItemSelectedListener() {

        // telling the program what to do when an item is selected
        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            int index = arg0.getSelectedItemPosition();

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
        }

    });

    // setting up the OnClickListerner for the repairs toggle button
    repairs.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            if (repairs.isChecked()) {
                repDesc.setVisibility(View.VISIBLE);
                repCost.setVisibility(View.VISIBLE);
            } else {
                repDesc.setVisibility(View.INVISIBLE);
                repCost.setVisibility(View.INVISIBLE);
            }

        }
    });
    // setting up the OnClickListener for the Back button
    back.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent openKitchen = new Intent(
                    "com.example.basicview6.KITCHEN");
            startActivity(openKitchen);

        }
    });

}

}

RMB
  • 1

2 Answers2

0

Well you can use a number of different methods which is why you keep seeing conflicting answers. However there are a few that are preferred.

For screen rotation, meaning if the device is flipped horizontally or vertically you use onSaveInstanceState.

There is another method I consider cheating and many people will tell you to stay away from as it can cause many errors down the line. However it is the easiest way possible. Simply go into your manifest and place this line

android:configChanges="orientation|keyboardHidden|screenSize

If you are trying to retain information so that when you return to an Activity it is still there you should use onPause(). It appears as though you are only transferring simple data like String, int, etc. This can be done using SharedPreferences inside your onPause(). The reason is onPause() is always (99% of the time) called before the Activity is killed, meaning you will always retain your information.

For some video references to show you how to do these things go here The New Boston
If you would rather read here are some links

  1. SharedPreferences
  2. onPause or onPause
  3. onSaveInstanceState

If you need anything else just ask.

Community
  • 1
  • 1
i_me_mine
  • 1,435
  • 3
  • 20
  • 42
0

When switching between the Activities you can put extras to the Intent: putExtra() like:

intent.putExtra(Intent.EXTRA_TEXT, "my saved String");

And get them in the called activity by:

String gottenString = intent.getExtras().getString(Intent.EXTRA_TEXT);

You can also save your data in a (temporary) file: Saving Files

Cerdo
  • 33
  • 1
  • 1
  • 5