Sending Multiple Intents from a Single Activity to

2020-04-11 11:12发布

问题:

I am very new to android, and I am trying to send user-inputted data (their names) to another activity. I have in the past been able to send single lines between activities using Intents, but I have not been able to work out how to send two different strings to two different TextViews.

Here is my code for the MainActivity so far:

package com.example.game;

import android.content.Intent;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.Button;
import android.widget.EditText;
import android.view.View;
import android.widget.AutoCompleteTextView;

public class MainActivity extends Activity {
public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button button = (Button)findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            sendNames();
            sendNames2();
        }
    });
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
public void sendNames() {
    //sends player1's name to mainGame
    Intent intent = new Intent (this, MainGame.class);
    EditText player1 = (EditText) findViewById(R.id.player1);
    String message = player1.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
}//sends player2's name to mainGame
 public void sendNames2(){
    Intent intent2 = new Intent(this, MainGame.class);
    EditText player2 = (EditText) findViewById(R.id.player2);
    String message2 = player2.getText().toString();
    intent2.putExtra(EXTRA_MESSAGE, message2);
    startActivity(intent2);
}
}

Code for my second activity, MainGame:

package com.example.game;

import android.content.Intent;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.annotation.SuppressLint;
import android.view.MenuItem;
import android.support.v4.app.NavUtils;
import android.annotation.TargetApi;
import android.os.Build;
import android.widget.TextView;

public class MainGame extends Activity {
@SuppressLint("NewAPI")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_game);
    //retrives player1's name
    Intent intent = getIntent();
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
    TextView name1 = (TextView) findViewById(R.id.name1);
    name1.setText(message);
    //retrivews player2's name
    Intent intent2 = getIntent();
    String message2 = intent2.getStringExtra(MainActivity.EXTRA_MESSAGE);
    TextView name2 = (TextView) findViewById(R.id.name2);
    name2.setText(message2);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }

}

       return super.onOptionsItemSelected(item);
}

}

When I run this, I get whatever has been put in for 'name2' in both TextViews. What do I need to do to change this?

回答1:

when i run this i get whatever has been put in for 'name2' in both TextView's

This is because you are creating a new instance of the Activity with the second Intent. There are different ways you could do it. One would be create a single Intent as a member variable, instantiate it in your first function call, add extras, then add the other extra in the second method, and call startActivity there.

But it would probably be easier and more readable to just do it all at the same time.

 public void sendNames() {
    //sends player1's name to mainGame
    Intent intent = new Intent (this, MainGame.class);
    EditText player1 = (EditText) findViewById(R.id.player1);
    String player1Name= player1.getText().toString();
    intent.putExtra("player1Name", player1Name);
    EditText player2 = (EditText) findViewById(R.id.player2);
    String player2Name= player2.getText().toString();
    intent2.putExtra("player2Name", player2Name);
    startActivity(intent);

And just call this one method.

Then get it with

Intent intent = getIntent();
String name1 = intent.getStringExtra("player1Name");
TextView name1 = (TextView) findViewById(R.id.name1);
name1.setText(message);

String name1 = intent2.getStringExtra("player2Name");
TextView name2 = (TextView) findViewById(R.id.name2);
name2.setText(name1 ;


回答2:

An Intent is like a Map where you can store String (and other serializable objects) with a key. In your code you are using the same key EXTRA_MESSAGE twice.

Also, keep in mind that you use one Intent to start one Activity: you CANNOT have 2 Intent starting a single instance of an Activity. The solution is to put the 2 values with 2 distinct keys in one Intent.



回答3:

You can send multiple paramters to an activity using intent, You don't have to create two different intent for doing this.

You can do this as follows

public void sendNames() {
    Intent intent = new Intent (this, MainGame.class);
    EditText player1 = (EditText) findViewById(R.id.player1);
    EditText player2 = (EditText) findViewById(R.id.player2);
    String message = player1.getText().toString();
    String message2 = player2.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    intent2.putExtra(EXTRA_MESSAGE1, message2);
    startActivity(intent);
}

and then get those values like

Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
String message2 = intent2.getStringExtra(MainActivity.EXTRA_MESSAGE1);
TextView name1 = (TextView) findViewById(R.id.name1);
name1.setText(message);
TextView name2 = (TextView) findViewById(R.id.name2);
name2.setText(message2);