Open random activities when button is clicked

前端 未结 2 583
故里飘歌
故里飘歌 2020-12-10 10:05

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 -&g

相关标签:
2条回答
  • 2020-12-10 10:20

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

    EDIT: [07/07/2020]

    This post was written a while ago and I had overlooked many things.

    Tenfour04 is correct that we need the switch statement, and so this can be made much more concise:

    int r = new Random().nextInt(activityList.size);
    Class<? extends Activity> activity = activityList.removeAt(r);
    
    0 讨论(0)
  • 2020-12-10 10:42

    @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();
    
    0 讨论(0)
提交回复
热议问题