Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
163 views
in Technique[技术] by (71.8m points)

android - Open random activities when button is clicked

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);
 
            }
        });
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...