XenPanda
XenPanda

Reputation: 137

Trouble with SharedPreferences

I am brand new to android development. I am trying to make a simple app to learn a little bit about how things work. I got the basic app to work, which just has a few TextView elements that are incremented and decremented via buttons. It is a basic scorekeeper.

The problem I am having is that anytime the program is closed, the screen is rotated or turns off the data is lost.

I am trying to implement sharedpreferences to "save" the data. There are 3 variables to save Home_Score, Visitor_Score, and Inning_Number.

I am stuck because the data does not resume correctly and I cannot figure out what is happening.

Inning_Number = 1
Home_Score = 2
Visitor_Score = 3

onResume the data is displayed:

Inning_Number = 0
Home_Score = 1
Visitor_Score = 3

It appears that the value of the first field is moved to the second field and the third field is correct.

I have tried this a number of ways and the result is the same. I thought I had mixed up variables but if I did I am not seeing it. I stuck and am hoping someone has an answer.

Thanks in advance!

public class MainActivity extends AppCompatActivity {

// Create Variables to hold Field Data
Button btnIncrementHome;
Button btnDecrementHome;
Button btnIncrementVisitor;
Button btnDecrementVisitor;
Button btnIncrementInning;
Button btnDecrementInning;
Button btnReset;

TextView txthomeScore;
TextView txtvisitorScore;
TextView txtinningNumber;

//private SharedPreferences score;
private static final String Game_Score_FileName = "gameScore";
private String Home_Score = "txthomeScore";
private String Visitor_Score = "txtvisitorScore";
private String Inning_Number = "txtinningNumber";

SharedPreferences score;




@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //Set default value in SharedPreferences file
    score = getSharedPreferences(Game_Score_FileName, Context.MODE_PRIVATE);
   //txthomeScore.setText(score.getString("Home_Score", "0"));
  // txtvisitorScore.setText(score.getString("Visitor_Score", "0"));
  // txtinningNumber.setText(score.getString("Inning_Number", "0"));

    // Get Values of the Form Fields
    btnIncrementHome = findViewById(R.id.buttonIncrementHome);
    btnDecrementHome = findViewById(R.id.buttonDecrementHome);
    btnIncrementVisitor = findViewById(R.id.buttonIncrementVisitor);
    btnDecrementVisitor = findViewById(R.id.buttonDecrementVisitor);
    btnIncrementInning = findViewById(R.id.buttonIncrementInning);
    btnDecrementInning = findViewById(R.id.buttonDecrementInning);
    btnReset = findViewById(R.id.buttonReset);
    txthomeScore = findViewById(R.id.homeScore);
    txtvisitorScore = findViewById(R.id.visitorScore);
    txtinningNumber = findViewById(R.id.inningNumber);


    btnIncrementHome.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String homeScoreValue = txthomeScore.getText().toString();
            int inthomeScoreValue = Integer.parseInt(homeScoreValue);
            inthomeScoreValue++;
            txthomeScore.setText(String.valueOf(inthomeScoreValue));
        }
    });

    btnDecrementHome.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String homeScoreValue = txthomeScore.getText().toString();
            int inthomeScoreValue = Integer.parseInt(homeScoreValue);
            inthomeScoreValue--;
            if (inthomeScoreValue < 0) {
                inthomeScoreValue=0;
            }
            txthomeScore.setText(String.valueOf(inthomeScoreValue));
        }
    });

    btnIncrementVisitor.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String visitorScoreValue = txtvisitorScore.getText().toString();
            int intvisitorScoreValue = Integer.parseInt(visitorScoreValue);
            intvisitorScoreValue++;
            txtvisitorScore.setText(String.valueOf(intvisitorScoreValue));
        }
    });

    btnDecrementVisitor.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String visitorScoreValue = txtvisitorScore.getText().toString();
            int intvisitorScoreValue = Integer.parseInt(visitorScoreValue);
            intvisitorScoreValue--;
            if (intvisitorScoreValue < 0) {
                intvisitorScoreValue=0;
            }
            txtvisitorScore.setText(String.valueOf(intvisitorScoreValue));
        }
    });

    btnIncrementInning.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String inningNumberValue = txtinningNumber.getText().toString();
            int intinningNumberValue = Integer.parseInt(inningNumberValue);
            intinningNumberValue++;
            txtinningNumber.setText(String.valueOf(intinningNumberValue));
        }
    });

    btnDecrementInning.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String inningNumberValue = txtinningNumber.getText().toString();
            int intinningNumberValue = Integer.parseInt(inningNumberValue);
            intinningNumberValue--;
            if (intinningNumberValue < 0) {
                intinningNumberValue=0;
            }
            txtinningNumber.setText(String.valueOf(intinningNumberValue));
        }
    });

    btnReset.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {


            txthomeScore.setText(String.valueOf(0));
            txtvisitorScore.setText(String.valueOf(0));
            txtinningNumber.setText(String.valueOf(0));
        }
    });


}

@Override
protected void onPause(){
  super.onPause();

    String homeScore = txthomeScore.getText().toString();
    String visitorScore = txtvisitorScore.getText().toString();
    String inningNumber = txtinningNumber.getText().toString();

    score = getSharedPreferences(Game_Score_FileName, MODE_PRIVATE);
    SharedPreferences.Editor editor = score.edit();

  editor.putString("Inning_Number",inningNumber);
  editor.putString("Visitor_Score",visitorScore);
  editor.putString("Home_Score",homeScore);
  editor.apply();

}

@Override
protected void onResume(){
    super.onResume();

    score = getSharedPreferences(Game_Score_FileName, MODE_PRIVATE);

    String Home = score.getString("Home_Score","0");
    String Visitor = score.getString("Visitor_Score","0");
    String Inning = score.getString("Inning_Number","1");

    txthomeScore.setText(Home);
    txtvisitorScore.setText(Visitor);
    txthomeScore.setText(Inning);

}



}

Upvotes: 1

Views: 68

Answers (2)

kamal verma
kamal verma

Reputation: 516

Replace your activity code

public class MainActivity extends AppCompatActivity {

// Create Variables to hold Field Data
Button btnIncrementHome;
Button btnDecrementHome;
Button btnIncrementVisitor;
Button btnDecrementVisitor;
Button btnIncrementInning;
Button btnDecrementInning;
Button btnReset;

TextView txthomeScore;
TextView txtvisitorScore;
TextView txtinningNumber;

//private SharedPreferences score;
private static final String Game_Score_FileName = "gameScore";
private String Home_Score = "txthomeScore";
private String Visitor_Score = "txtvisitorScore";
private String Inning_Number = "txtinningNumber";

SharedPreferences score;




@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //Set default value in SharedPreferences file
    score = getSharedPreferences(Game_Score_FileName, Context.MODE_PRIVATE);

    // Get Values of the Form Fields
    btnIncrementHome = (Button) findViewById(R.id.btnIncrementHome);
    btnDecrementHome =(Button) findViewById(R.id.btnDecrementHome);
    btnIncrementVisitor =(Button) findViewById(R.id.btnIncrementVisitor);
    btnDecrementVisitor = (Button)findViewById(R.id.btnDecrementVisitor);
    btnIncrementInning =(Button) findViewById(R.id.btnIncrementInning);
    btnDecrementInning =(Button) findViewById(R.id.btnDecrementInning);
    btnReset = (Button)findViewById(R.id.btnReset);
    txthomeScore = (TextView) findViewById(R.id.txthomeScore);
    txtvisitorScore =(TextView) findViewById(R.id.txtvisitorScore);
    txtinningNumber =(TextView) findViewById(R.id.txtinningNumber);


    txthomeScore.setText(score.getString("Home_Score", "0"));
    txtvisitorScore.setText(score.getString("Visitor_Score", "0"));
    txtinningNumber.setText(score.getString("Inning_Number", "0"));


    btnIncrementHome.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String homeScoreValue = txthomeScore.getText().toString();
            int inthomeScoreValue = Integer.parseInt(homeScoreValue);
            inthomeScoreValue++;
            txthomeScore.setText(String.valueOf(inthomeScoreValue));
        }
    });

    btnDecrementHome.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String homeScoreValue = txthomeScore.getText().toString();
            int inthomeScoreValue = Integer.parseInt(homeScoreValue);
            inthomeScoreValue--;
            if (inthomeScoreValue < 0) {
                inthomeScoreValue=0;
            }
            txthomeScore.setText(String.valueOf(inthomeScoreValue));
        }
    });

    btnIncrementVisitor.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String visitorScoreValue = txtvisitorScore.getText().toString();
            int intvisitorScoreValue = Integer.parseInt(visitorScoreValue);
            intvisitorScoreValue++;
            txtvisitorScore.setText(String.valueOf(intvisitorScoreValue));
        }
    });

    btnDecrementVisitor.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String visitorScoreValue = txtvisitorScore.getText().toString();
            int intvisitorScoreValue = Integer.parseInt(visitorScoreValue);
            intvisitorScoreValue--;
            if (intvisitorScoreValue < 0) {
                intvisitorScoreValue=0;
            }
            txtvisitorScore.setText(String.valueOf(intvisitorScoreValue));
        }
    });

    btnIncrementInning.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String inningNumberValue = txtinningNumber.getText().toString();
            int intinningNumberValue = Integer.parseInt(inningNumberValue);
            intinningNumberValue++;
            txtinningNumber.setText(String.valueOf(intinningNumberValue));
        }
    });

    btnDecrementInning.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String inningNumberValue = txtinningNumber.getText().toString();
            int intinningNumberValue = Integer.parseInt(inningNumberValue);
            intinningNumberValue--;
            if (intinningNumberValue < 0) {
                intinningNumberValue=0;
            }
            txtinningNumber.setText(String.valueOf(intinningNumberValue));
        }
    });

    btnReset.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {


            txthomeScore.setText(String.valueOf(0));
            txtvisitorScore.setText(String.valueOf(0));
            txtinningNumber.setText(String.valueOf(0));
        }
    });


}

@Override
protected void onPause(){
    super.onPause();

    String homeScore = txthomeScore.getText().toString();
    String visitorScore = txtvisitorScore.getText().toString();
    String inningNumber = txtinningNumber.getText().toString();

    score = getSharedPreferences(Game_Score_FileName, MODE_PRIVATE);
    SharedPreferences.Editor editor = score.edit();

    editor.putString("Inning_Number",inningNumber);
    editor.putString("Visitor_Score",visitorScore);
    editor.putString("Home_Score",homeScore);
    editor.apply();

}

@Override
protected void onResume(){
    super.onResume();

    score = getSharedPreferences(Game_Score_FileName, MODE_PRIVATE);

    String Home = score.getString("Home_Score","0");
    String Visitor = score.getString("Visitor_Score","0");
    String Inning = score.getString("Inning_Number","1");

    txthomeScore.setText(Home);
    txtvisitorScore.setText(Visitor);
    txtinningNumber.setText(Inning);

}

}

Upvotes: 0

Rajan Kali
Rajan Kali

Reputation: 12953

You are setting home score twice

txthomeScore.setText(Home);  <---- 
txtvisitorScore.setText(Visitor);
txthomeScore.setText(Inning); <----

replace with

txthomeScore.setText(Home);
txtvisitorScore.setText(Visitor);
txtinningNumber.setText(Inning);

And as you are new to Android, as a general standard use camelCase for local variables

Upvotes: 3

Related Questions