Search code examples
javaandroidonclicklisteneruser-input

When getting a name input from the user, how do I get it to stay on the activity when it is restarted?


In my android guessing game app, I have managed to get it where when a user inputs their name on one activity, it displays on the game itself. My problem, however, occurs when the user clicks 'yes' to have another go. The game works fine but their name disappears. I know this is because the activity is starting again but not being told to carry the name input across because this was done via the onOptionsItemsSelected method and clicking yes is via the OnClickListener method but I don't understand how I should 'merge' the two, if that's an appropriate turn of phrase.

My classes are below:

public class GameCentral extends AppCompatActivity {

int backButtonCount = 0;


public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.game_central_layout);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.commonmenus, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
**public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.guessingGame) {
        // displays name entered on the game itself
        startActivity(new Intent(this, Task3Activity.class));
        switch (item.getItemId()) {
            case R.id.guessingGame:
                Intent intent = new Intent(GameCentral.this, Task3Activity.class);
                EditText playerName = (EditText) findViewById(R.id.playerNameInput);
                intent.putExtra("PlayerName", playerName.getText().toString());
                startActivity(intent);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }**
    } else if (id == R.id.placeOne) {

        Toast.makeText(this, "Game Placeholder One option is Clicked", Toast.LENGTH_SHORT).show();
    } else if (id == R.id.placeTwo) {

        Toast.makeText(this, "Game Placeholder Two option is Clicked", Toast.LENGTH_SHORT).show();
    } else if (id == R.id.placeThree) {

        Toast.makeText(this, "Game Placeholder Three option is Clicked", Toast.LENGTH_SHORT).show();
    }

    return super.onOptionsItemSelected(item);
}

public void onBackPressed() {
    // when the back button is pressed on the mobile, two presses takes you back out of the app completely
    if (backButtonCount >= 1) {
        Intent backIntent = new Intent(Intent.ACTION_MAIN);
        backIntent.addCategory(Intent.CATEGORY_HOME);
        backIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(backIntent);
    } else {
        Toast.makeText(this, "Press the back button again to close the application", Toast.LENGTH_SHORT).show();
        backButtonCount++;
    }

}
}

And....

public class Task3Activity extends AppCompatActivity {

public Button rtnBtn;
// button to return to Game Central at any point when clicked
public void init() {
    rtnBtn = (Button)findViewById(R.id.returnBtn);
    rtnBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            Intent homeScreen = new Intent(Task3Activity.this, GameCentral.class);

            startActivity(homeScreen);

            Toast toast2 = Toast.makeText(getApplicationContext(), "Thank you for playing.  Come back soon", Toast.LENGTH_SHORT);
            toast2.setGravity(Gravity.CENTER_VERTICAL, 0, 350);
            toast2.show();
        }
    });
}

String value;

int attempts = 0;
final int maxAttempts = 1;
Random randGen = new Random();
int ranNum;
private SoundPlayer sound;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.task3_layout);
    init();

    final String playerName = getIntent().getStringExtra("PlayerName");

    if (playerName != null) {
        TextView dataRcvd = (TextView) findViewById(R.id.playerNameEntered);
        dataRcvd.setText(playerName);
    }

sound = new SoundPlayer(this);

    final TextView textResponse = (TextView) findViewById(R.id.txtResponse);
    final TextView guessText = (TextView) findViewById(R.id.txtAnswer);
    final EditText userGuess = (EditText) findViewById(R.id.etNumber);
    final Button pressMe = (Button) findViewById(R.id.btnGuess);
    final Button rtnButton = (Button) findViewById(R.id.returnBtn);

    int min = 1;
    int max = 19;
    randGen = new Random();
    // Generate number once
    ranNum = randGen.nextInt(max - min + 1) + min;

    // if the user enters '0' or a number higher than '19' this toast message is displayed
    final Toast toast = makeText(getApplicationContext(), "Please guess between 0 and 20", Toast.LENGTH_LONG);
    toast.setGravity(Gravity.CENTER_VERTICAL, 0, 350);


    // When the button is clicked, it shows the text assigned to the txtResponse TextView box
    pressMe.setOnClickListener(new View.OnClickListener() {


                                   @Override
                                   public void onClick(View v) {
           boolean correct = false;
           final AlertDialog.Builder alert = new AlertDialog.Builder(Task3Activity.this);
           alert.setTitle("Unlucky");
           alert.setCancelable(false);
           alert.setMessage("You have guessed incorrectly three times. " +
                   "The answer was " + ranNum + ". " + "Would you like to play again?")
                   //.setCancelable(true)
                   .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                       @Override
                       public void onClick(DialogInterface dialog, int which) {
                           //dialog.dismiss();
                           Intent i = new Intent(Task3Activity.this, Task3Activity.class);
                           i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                           //TextView dataRcvd = (TextView) findViewById(R.id.playerNameEntered);
                           //dataRcvd.setText(playerName);
                           startActivity(i);
                       }
                   });

           alert
                   .setNegativeButton("No", new DialogInterface.OnClickListener() {
                       @Override
                       public void onClick(DialogInterface dialog, int i) {

                           dialog.dismiss();
                           Intent toy = new Intent(Task3Activity.this, GameCentral.class);

                           Toast toast2 = Toast.makeText(getApplicationContext(), "Thank you for playing.  Come back soon", Toast.LENGTH_SHORT);
                           toast2.setGravity(Gravity.CENTER_VERTICAL, 0, 350);
                           toast2.show();
                           startActivity(toy);

                       }

                       ;
                   });


           final AlertDialog.Builder alert2 = new AlertDialog.Builder(Task3Activity.this);
           alert2.setTitle("You Did It!");
           alert2.setCancelable(false);
           alert2.setMessage("The answer was " + ranNum + ". " + "Would you like to play again?")
                   // resets the game
                   .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                       @Override
                       public void onClick(DialogInterface dialog, int which) {
                           //dialog.dismiss();
                           Intent i = new Intent(Task3Activity.this, Task3Activity.class);
                           i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                           startActivity(i);


                       }
                   });

           alert2
                   .setNegativeButton("No", new DialogInterface.OnClickListener() {
                       @Override
                       public void onClick(DialogInterface dialog, int i) {
                           // takes the user back to the Game Central app
                           dialog.dismiss();
                           Intent toy = new Intent(Task3Activity.this, GameCentral.class);

                           startActivity(toy);
                       }

                       ;
                   });



           int userNumber = Integer.parseInt(userGuess.getText().toString());

           if ((userNumber < 1) || (userNumber > 19)) {
               toast.show();
           } else if (userNumber < ranNum) {
               guessText.setText("Your answer is too low. Guess again!");
               guessText.setBackgroundColor(Color.YELLOW);
               //sound.playBuzzerSound();
           } else if (userNumber > ranNum) {
               guessText.setText("Your answer is too high.  Guess again!");
               guessText.setBackgroundColor(Color.RED);
               //sound.playBuzzerSound();
           } else if (userNumber == ranNum) {
               ranNum = randGen.nextInt(20);
               //guessText.setText("You did it!");
               //guessText.setBackgroundColor(Color.WHITE);
               correct = true;
               alert2.show();
               sound.playApplauseSound();
           }

           if (attempts++ > maxAttempts && !correct) {
               alert.show();
               sound.playBooSound();
           } else if (correct) {
           } else {
               String randText = "";
               randText = Integer.toString(ranNum);
               textResponse.setText("");

               userGuess.setText("");


           }

       }
   }
    );


}
}

As always, any hints, help, or direction greatly appreciated.

Thanks


Solution

  • Can you try to use a SharedPreferences maybe?

    SharedPreferences sharedPreferences = getSharedPreferences("NameList", MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    
    editor.putString("Name1", playerName);
    
    editor.apply();
    

    Then to fetch it do this:

    SharedPreferences sharedPreferences = getSharedPreferences("NameList", MODE_PRIVATE);
    String playerName = sharedPreferences.getString("Name1", "Default name");