我无法在两个活动之间传输数据



我最近开始学习Android编程。我在两个活动之间传输数据时遇到问题。在第一个活动中,一些EditText从用户那里获取信息,btn_apply按钮应该将它们保存在列表中。btn_show按钮应该在第二个活动中显示students_lastname,但我的代码只重复显示最后一个last_name。我不知道出了什么问题?

主要活动:

package com.example.mysixthandroidapp;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.NumberPicker;
import android.widget.TextView;
import java.io.Serializable;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

EditText txt_name = (EditText)findViewById(R.id.txt_name);
EditText txt_id = (EditText)findViewById(R.id.txt_lastname);
EditText txt_filed = (EditText)findViewById(R.id.txt_field);
EditText txt_university = (EditText)findViewById(R.id.txt_university);
EditText txt_startyear = (EditText)findViewById(R.id.txt_startyear);

Button btn_apply = (Button)findViewById(R.id.btn_apply);
Button btn_show = (Button)findViewById(R.id.btn_show);
Student std = new Student();
TextView txt_result = (TextView)findViewById(R.id.txt_result);
final ArrayList<Student> students  = new ArrayList<Student>();

btn_apply.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
std.setStudent_name(txt_name.getText().toString());
std.setStudent_lastname(txt_id.getText().toString());
std.setStudent_field(txt_filed.getText().toString());
std.setStudent_university(txt_university.getText().toString());
std.setStudent_startyear(txt_startyear.getText().toString());
students.add(std);
}
});

btn_show.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent myIntent = new Intent(MainActivity.this, SecondActivity.class);
Bundle arg = new Bundle();
arg.putSerializable("STUDENT", (Serializable)students);
myIntent.putExtra("BUNDLE", arg);
MainActivity.this.startActivity(myIntent);

}
});
}
}

第二项活动:

package com.example.mysixthandroidapp;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import java.util.ArrayList;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent intent  = getIntent();
Bundle arg = intent.getBundleExtra("BUNDLE");
ArrayList <Student> students_list = (ArrayList <Student>)arg.getSerializable("STUDENT");
TextView txt_list = (TextView)findViewById(R.id.txt_list);

for(int i = 0 ; i < students_list.size() ; i++){
txt_list.setText("student: "+i + students_list.get(i).getStudent_lastname() + "n");
}
}
}

学生班级:

package com.example.mysixthandroidapp;
import java.io.Serializable;
import java.util.ArrayList;

public class Student implements java.io.Serializable {
private String Student_name;
private String Student_lastname;
private String Student_field;
private String Student_university;
private String Student_startyear;

public void setStudent_name(String name) {
Student_name = name;
}
public void setStudent_lastname(String lname) {
Student_lastname = lname;
}
public void setStudent_field(String field) {
Student_field = field;
}
public void setStudent_university(String university) {
Student_university = university;
}
public void setStudent_startyear(String startyear) {
Student_startyear = startyear;
}

public String getStudent_name() {
return Student_name;
}
public String getStudent_lastname() {
return Student_lastname;
}
public String getStudent_field() {
return Student_field;
}
public String getStudent_university() {
return Student_university;
}
public String getStudent_startyear() {
return Student_startyear;
}

}

使用gson将对象转换为JSON并通过intent传递。在新的"活动"中,将JSON转换为对象。

在您的build.gradle中,将其添加到您的依赖项中

implementation 'com.google.code.gson:gson:*Version*'

在"活动"中,将对象转换为json字符串:

Gson gson = new Gson();
String myJson = gson.toJson(vp);
intent.putExtra("myjson", myjson);

在接收活动中,将json字符串转换回原始对象:

Gson gson = new Gson();
YourObject ob = gson.fromJson(getIntent().getStringExtra("myjson"), YourObject.class);

对于Kotlin来说,这是完全相同的

传输数据

val gson = Gson()
val intent = Intent(this, YourActivity::class.java)
intent.putExtra("identifier", gson.toJson(your_object))
startActivity(intent)

接收

val gson = Gson()
val yourObject = gson.fromJson<YourObject>(intent.getStringExtra("identifier"), YourObject::class.java)

第二路

  • 实现Parcelable

    实现可串行化

    使用某种类型的轻量级事件总线库(例如,Greenrobot的EventBus或Square的Otto(

Parcelable-快速和Android标准,但它有很多样板代码,并且在提取意图值时需要硬编码字符串作为参考(非强类型(。

Serializable-接近零样板,但这是最慢的方法,并且在提取意图中的值(非强类型(时也需要硬编码字符串。

事件总线-零样板,最快的方法,不需要硬编码字符串,但它确实需要额外的依赖项(尽管通常很轻,约40 KB(

我发布了关于这三种方法的非常详细的比较,包括效率基准。

最新更新