将多个 Intent 从单个 Activity 发送到另一个 Activity
Posted
技术标签:
【中文标题】将多个 Intent 从单个 Activity 发送到另一个 Activity【英文标题】:Sending Multiple Intents from a Single Activity to Another Activity 【发布时间】:2013-08-14 06:44:11 【问题描述】:我对 android 很陌生,我正在尝试将用户输入的数据(他们的名字)发送到另一个活动。我过去能够使用 Intents 在活动之间发送单行,但我无法弄清楚如何将两个不同的字符串发送到两个不同的 TextView。
到目前为止,这是我的 MainActivity 代码:
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);
我的第二个活动 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);
当我运行它时,我得到了在两个 TextView 中为“name2”输入的任何内容。我需要做什么来改变它?
【问题讨论】:
你为什么不把所有的都收集起来,并在一个包中传递给新的活动? 【参考方案1】:当我运行它时,我会在两个 TextView 中得到为“name2”输入的任何内容
这是因为您正在使用第二个Intent
创建Activity
的新实例。有不同的方法可以做到这一点。一种方法是创建一个 Intent
作为成员变量,在您的第一个函数调用中实例化它,添加额外内容,然后在第二个方法中添加另一个额外内容,然后在那里调用 startActivity
。
但同时完成这一切可能会更容易,更易读。
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);
只需调用这个方法。
然后用
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】:Intent 类似于 Map,您可以在其中存储带有键的字符串(和其他可序列化对象)。在您的代码中,您使用了相同的密钥 EXTRA_MESSAGE
两次。
另外,请记住,您使用一个 Intent 来启动一个 Activity:您不能使用 2 个 Intent 来启动一个 Activity 的单个实例。解决方案是将具有 2 个不同键的 2 个值放在一个 Intent 中。
【讨论】:
【参考方案3】:您可以使用意图向一个活动发送多个参数,您不必为此创建两个不同的意图。
你可以这样做
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);
然后得到像
这样的值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);
【讨论】:
以上是关于将多个 Intent 从单个 Activity 发送到另一个 Activity的主要内容,如果未能解决你的问题,请参考以下文章
从0系统学Android-2.3使用 Intent 在 Activity 之间穿梭