I have 5 activities. What I want to happen is to open random activities when the Start button is clicked on the MainMenu.
For Example: Activity 1 -> Activity 4 -> Activity 3
I have tried the codes posted here and here but none of them worked.
This is my code in Start Button
gotoMenu=(Button)findViewById(R.id.btnStart);
gotoMenu.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
startActivity(new Intent(MainMenu.this, Menu_WelcomeLuzon.class));
overridePendingTransition(R.animator.transition_fade_in, R.animator.transition_fade_out);
}
});
Any code snippets would be a big help. Thanks in advance!
To start an activity, you need to use intents. And you can call this when a button is clicked like so:
Button myButton = (Button) findViewById(R.id.MY_BUTTON);
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(CurrentActivity.class, NextActivity.class);
startActivity(intent);
}
To make this random, we need to change it slightly so it is more like this:
Button myButton = (Button) findViewById(R.id.MY_BUTTON);
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Here, we are generating a random number
Random generator = new Random();
int number = generator.nextInt(5) + 1;
// The '5' is the number of activities
Class activity = null;
// Here, we are checking to see what the output of the random was
switch(number) {
case 1:
// E.g., if the output is 1, the activity we will open is ActivityOne.class
activity = ActivityOne.class;
break;
case 2:
activity = ActivityTwo.class;
break;
case 3:
activity = ActivityThree.class;
break;
case 4:
activity = ActivityFour.class;
break;
default:
activity = ActivityFive.class;
break;
}
// We use intents to start activities
Intent intent = new Intent(getBaseContext(), activity);
startActivity(intent);
}
}
You can read more about starting activities and using intents here if you like.
Updated answer to updated question/comment:
If you don't want to open an Activity that has already been opened, that would be a little more complex.
In your main activity add the code below (it is almost the same as the one in the previous answer, but a little different):
Button myButton = (Button) findViewById(R.id.MY_BUTTON);
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// We are creating a list, which will store the activities that haven't been opened yet
ArrayList<Class> activityList = new ArrayList<>();
activityList.add(ActivityOne.class);
activityList.add(ActivityTwo.class);
activityList.add(ActivityThree.class);
activityList.add(ActivityFour.class);
activityList.add(ActivityFive.class);
Random generator = new Random();
int number = generator.nextInt(5) + 1;
Class activity = null;
// Here, we are checking to see what the output of the random was
switch(number) {
case 1:
activity = ActivityOne.class;
// We are adding the number of the activity to the list
activityList.remove(ActivityOne.class);
break;
case 2:
activity = ActivityTwo.class;
activityList.remove(ActivityTwo.class);
break;
case 3:
activity = ActivityThree.class;
activityList.remove(ActivityThree.class);
break;
case 4:
activity = ActivityFour.class;
activityList.remove(ActivityFour.class);
break;
default:
activity = ActivityFive.class;
activityList.remove(ActivityFive.class);
break;
}
// We use intents to start activities
Intent intent = new Intent(getBaseContext(), activity);
// `intent.putExtra(...)` is used to pass on extra information to the next activity
intent.putExtra("ACTIVITY_LIST", activityList);
startActivity(intent);
}
}
In all other 5 activities, use the code below:
Button myButton = (Button) findViewById(R.id.ANOTHER_BUTTON);
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ArrayList<Class> activityList = new ArrayList<>();
Bundle extras = getBaseContext().getIntent().getExtras();
activityList = extras.get("ACTIVITY_LIST");
if(activityList.size() == 0) {
// Do something when after all activities have been opened
doSomeAction();
} else {
// Now, the random number is generated between 1 and however many
// activities we have remaining
Random generator = new Random();
int number = generator.nextInt(activityList.size()) + 1;
Class activity = null;
// Here, we are checking to see what the output of the random was
switch(number) {
case 1:
// We will open the first remaining activity of the list
activity = activityList.get(0);
// We will now remove that activity from the list
activityList.remove(0);
break;
case 2:
// We will open the second remaining activity of the list
activity = activityList.get(1);
activityList.remove(1);
break;
case 3:
// We will open the third remaining activity of the list
activity = activityList.get(2);
activityList.remove(2);
break;
case 4:
// We will open the fourth remaining activity of the list
activity = activityList.get(3);
activityList.remove(3);
break;
default:
// We will open the fifth remaining activity of the list
activity = activityList.get(4);
activityList.remove(4);
break;
}
// Note: in the above, we might not have 3 remaining activities, for example,
// but it doesn't matter because that case wouldn't be called anyway,
// as we have already decided that the number would be between 1 and the number of
// activities left.
// Starting the activity, and passing on the remaining number of activities
// to the next one that is opened
Intent intent = new Intent(getBaseContext(), activity);
intent.putExtra("ACTIVITY_LIST", activityList);
startActivity(intent);
}
}
}
@Farbod Salamat-Zadeh
your solution is great, except that part
Bundle extras = getBaseContext().getIntent().getExtras();
would result in mistake in Android Studio 2.1.
This should instead be
Bundle extras = getIntent().getExtras();