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

I can not transfer data between two activities

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

主要Activity:

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


            }
        });
    }
}

第二个Activity:

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

    }
}

学生Class:

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 传递它。在新的 Activity 中将 JSON 转换为一个对象。

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

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

在您的 Activity 中,将对象转换为 json-string:

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

在您的接收 Activity 中,将 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 - 样板文件接近于零,但这是最慢的方法,并且在从意图中提取值时也需要硬编码字符串(非强类型).

Event Bus - 零样板,最快的方法,不需要硬编码字符串,但它确实需要额外的依赖(虽然通常是轻量级的,~40 KB)

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