安卓,我能否使用putExtra传递多个值?

56

我想把两个值传递给另一个活动,我能用putExtra实现这个功能吗?还是说我必须采用更加复杂的方式,以我所了解的来看似乎是这样。例如,这样的方法可行吗?

public final static String ID_EXTRA="com.fnesse.beachguide._ID";

Intent i = new Intent(this, CoastList.class);
i.putExtra(ID_EXTRA, "1", "111");
startActivity(i);

上述代码出现了错误。

编辑

我尝试的第一件事情与以下代码类似:

i.putExtra(ID_EXTRA1, "1");
i.putExtra(ID_EXTRA2, "111");

但是ID_EXTRA2似乎会覆盖ID_EXTRA1的值。

所以,

i.putExtra(ID_EXTRA, new String[] { "1", "111"});

看起来是使用了go语言,但我该如何从第二个活动的数组中提取值?我一直在使用这种方法来获取单个值。

passedVar = getIntent().getStringExtra(CoastList.ID_EXTRA);

我猜我必须将ID_EXTRA转换成一个数组???

7个回答

165
你可以传递一组“bundle”而不是单个的extras,例如:
Intent intent = new Intent(this, MyActivity.class);
Bundle extras = new Bundle();
extras.putString("EXTRA_USERNAME","my_username");
extras.putString("EXTRA_PASSWORD","my_password");
intent.putExtras(extras);
startActivity(intent);

然后在你要触发的Activity中,可以这样引用它们:

Intent intent = getIntent();
Bundle extras = intent.getExtras();
String username_string = extras.getString("EXTRA_USERNAME");
String password_string = extras.getString("EXTRA_PASSWORD");
或者(如果您更喜欢):
Bundle extras = getIntent().getExtras();
String username_string = extras.getString("EXTRA_USERNAME");
String password_string = extras.getString("EXTRA_PASSWORD");

32

您可以通过使用多个键来传递多个值。而不是

i.putExtra(ID_EXTRA, "1", "111");

执行

i.putExtra(ID_EXTRA1, "1");
i.putExtra(ID_EXTRA2, "111");

当然你必须定义两个常量作为关键字,并且必须在新的活动中分别读取这两个常量。
或者,你可以通过传递一个字符串数组来实现。
i.putExtra(ID_EXTRA, new String[] { "1", "111"});

4
请确认ID_EXTRA1和ID_EXTRA2不被赋予相同的值(例如,两者都是“com.fnesse.beachguide._ID”)。否则它们将被视为相同的键,并导致覆盖。如果您尝试使用数组,请改用“getIntent().getStringArrayExtra()”而不是“getIntent().getStringExtra()”。 - user658042
请问我们可以同时从一个 Activity 传递多少个字符串?我们应该限制 Intent 的数量,以便应用程序不会崩溃。 - Rajnish Sharma

11

将额外的值放入类中

public class MainActivity extends Activity {
        public final static String USERNAME = "com.example.myfirstapp.MESSAGE";
        public final static String EMAIL = "com.example.myfirstapp.EMAIL";

public void registerUser(View view) {
        Intent intent = new Intent(this, DisplayMessageActivity.class);
        EditText userNameTxt = (EditText) findViewById(R.id.editText1);
        EditText emailTxt = (EditText) findViewById(R.id.editText2);
        String userName = userNameTxt.getText().toString();
        String email = emailTxt.getText().toString();
        intent.putExtra(USERNAME, userName);
        intent.putExtra(EMAIL,email);
        startActivity(intent);

    }

从另一个类中读取额外的值

public class DisplayMessageActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = getIntent();
        String user = intent.getStringExtra(MainActivity.USERNAME);
        String email = intent.getStringExtra(MainActivity.EMAIL);   

3

传递额外的捆绑包 给Kotlin编码者

val intent = Intent(this, MyActivity::class.java)
val extras = Bundle().apply {
    putString("EXTRA_USERNAME", "my_username")
    putString("EXTRA_PASSWORD", "my_password")
}
intent.putExtras(extras)
startActivity(intent)

然后在另一个活动中像下面这样检索您的值:

val extras = getIntent().extras
val username_string = extras?.getString("EXTRA_USERNAME")
val password_string = extras?.getString("EXTRA_PASSWORD")

1

不,你不能这样做,但是你可以使用以下方式传递一个数组:

public Intent putExtra (String name, String[] value)

例如像这样:

i.putExtra(ID_EXTRA, new String[]{"1", "111"});

1

你的示例不起作用,因为Extras由一个Key和一个Value组成。你不能在一个Extra中放置多个KeysValues

此外,据我所知(并注意到),你的键需要是Strings,但我可能错了。

试试这个:

public final static String ID_EXTRA="com.fnesse.beachguide._ID";

Intent i = new Intent(this, CoastList.class);
i.putExtra("ID_Extra", ID_EXTRA);
i.putExtra("1", 111);
startActivity(i);

0

对于单个小值,putExtra 是完美的,但当您传递多个值并需要传递自定义ArrayList或List时,我认为这是一个坏主意。解决方案是您可以使用Parcelable。您还可以使用SingletonSerializable

Parcelable:

Parcelable类,您需要共享。

 public class MyParcelable implements Parcelable {
     private int mData;

     public int describeContents() {
         return 0;
     }

     public void writeToParcel(Parcel out, int flags) {
         out.writeInt(mData);
     }

     public static final Parcelable.Creator<MyParcelable> CREATOR
             = new Parcelable.Creator<MyParcelable>() {
         public MyParcelable createFromParcel(Parcel in) {
             return new MyParcelable(in);
         }

         public MyParcelable[] newArray(int size) {
             return new MyParcelable[size];
         }
     };

     private MyParcelable(Parcel in) {
         mData = in.readInt();
     }
 }

请在您想要发送的活动中形成表单。
MyParcelable example = new MyParcelable();
.....
.....
Bundle bundle = new Bundle();
bundle.putParcelable("example", Parcels.wrap(example));

从另一个活动中,您想要接收的内容。
MyParcelable example = Parcels.unwrap(getIntent().getParcelableExtra("example"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接