Search code examples
javaandroidandroid-intentandroid-activityonclicklistener

Passing data from one activity to another when choosing a menu option from action bar in Android app


I don't know if anyone can offer some guidance on this.

I have a main class where a user will input their name. I then want the user to choose a game from the options available in the action/app bar. When they choose their game, the name they entered in the main class will then be showing on the game class. I hope that makes sense?

I know this involves passing data from one activity to another using intents but every tutorial I see involves setting up a button in the main class (so using something like onclicklistener) but I don't want a button. I want choosing the menu option to do the same job but I can't find anywhere how to do it.

Thanks in advance.

EDIT - ATTEMPTED CODE ADDED

Main class:

public class GameCentral extends AppCompatActivity {


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) {

        startActivity(new Intent(this, Task3Activity.class));
        switch (item.getItemId()) {
            case R.id.playerNameEntered:
                startActivity(this, Task3Activity.class).putExtra(playerNameInput, value);

                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);
}

}

Game Class

public class Task3Activity extends GameCentral {

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);
        }
    });
}

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();

    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        value = extras.getString("Value1");
        if (value  != null) {
            TextView dataRcvd = (TextView) findViewById(R.id.playerNameEntered);
            dataRcvd.setText(value );
        }
    }

    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);
    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;

    final Toast 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);
                           startActivity(i);


                       }
                   });

           alert
                   .setNegativeButton("No", new DialogInterface.OnClickListener() {
                       @Override
                       public void onClick(DialogInterface dialog, int i) {
                           //Task1Activity.this.finish();
                           dialog.dismiss();
                           //finishAffinity();
                           Intent toy = new Intent(Task3Activity.this, GameCentral.class);

                           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?")
                   //.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);
                           startActivity(i);


                       }
                   });

           alert2
                   .setNegativeButton("No", new DialogInterface.OnClickListener() {
                       @Override
                       public void onClick(DialogInterface dialog, int i) {
                           //Task1Activity.this.finish();
                           dialog.dismiss();
                           Intent toy = new Intent(Task3Activity.this, GameCentral.class);

                           startActivity(toy);
                           //finishAffinity();
                       }

                       ;
                   });



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

           if ((userNumber < 1) || (userNumber > 19)) {
               //guessText.setText("Please guess between 0 and 20");
               //guessText.setBackgroundColor(Color.WHITE);
               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();
               //guessText.setText("You have guessed incorrectly three times.  The answer was " + ranNum);
           } else if (correct) {
           } else {
               String randText = "";


               randText = Integer.toString(ranNum);
               textResponse.setText("");

               userGuess.setText("");


           }

       }
   }
    );


}
}

Solution

  • Because you are not passing a Bundle in your intent, you don't need to use getIntent().getExtras();.

    GameCentral:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    
        switch (item.getItemId()) {
            case R.id.guessingGame:
                Intent intent = new Intent(GameCentral.this, Task3Activity.class);
                intent.putExtra("PlayerName", "Name");
    
                startActivity(intent);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    

    Task3Activity:

    public class Task3Activity extends AppCompatActivity {
    
    ...
    
        @Override
        public void onCreate(Bundle savedInstanceSate) {
            ...
    
            String playerName = getIntent().getStringExtra("PlayerName");
    
            if (playerName != null) {
                TextView dataRcvd = (TextView) findViewById(R.id.playerNameEntered);
                dataRcvd.setText(playerName);
            }
        }
    
        ...
    }
    

    intent.putExtra("PlayerName", "Name"); where "Name" is the string for where you get the player's name from. You need to create the EditText object within the scope of the Activity if you want to get the player's name from a text box.