Для передачи данных между двумя Activity используется объект Intent. Через его метод putExtra() можно добавить ключ и связанное с ним значение.
Например, передача из текущей activity в SecondActivity строки "Hello World" с ключом "hello":
// создание объекта Intent для запуска SecondActivity
Intent intent = new Intent(this, SecondActivity.class);
// передача объекта с ключом "hello" и значением "Hello World"
intent.putExtra("hello", "Hello World");
// запуск SecondActivity
startActivity(intent);
Для передачи данных применяется метод putExtra(), который в качестве значения позволяет передать данные простейших типов - String, int, float, double, long, short, byte, char, массивы этих типов, либо объект интерфейса Serializable.
Чтобы получить отправленные данные при загрузке SecondActivity, можно воспользоваться методом get(), в который передается ключ объекта:
Bundle arguments = getIntent().getExtras();
String name = arguments.get("hello").toString(); // Hello World
В зависимости от типа отправляемых данных при их получении мы можем использовать ряд методов объекта Bundle. Все они в качестве параметра принимают ключ объекта. Основные из них:
get(): универсальный метод, который возвращает значение типа Object. Соответственно поле получения данное значение необходимо преобразовать к нужному типу
getString(): возвращает объект типа String
getInt(): возвращает значение типа int
getByte(): возвращает значение типа byte
getChar(): возвращает значение типа char
getShort(): возвращает значение типа short
getLong(): возвращает значение типа long
getFloat(): возвращает значение типа float
getDouble(): возвращает значение типа double
getBoolean(): возвращает значение типа boolean
getCharArray(): возвращает массив объектов char
getIntArray(): возвращает массив объектов int
getFloatArray(): возвращает массив объектов float
getSerializable(): возвращает объект интерфейса Serializable
Пусть у нас в проекте будет определено две activity: MainActivity и SecondActivity.
В коде SecondActivity определим получение данных:
package com.example.viewapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
textView.setTextSize(26);
textView.setPadding(16, 16, 16, 16);
Bundle arguments = getIntent().getExtras();
if(arguments!=null){
String name = arguments.get("name").toString();
String company = arguments.getString("company");
int age = arguments.getInt("age");
textView.setText("Name: " + name + "\nCompany: " + company +
"\nAge: " + age);
}
setContentView(textView);
}
}
В данном случае в SecondActivity получаем все данных из объекта Bundle и выводим их в текстовое поле TextView. Предполагается, что данной activity будут передаваться три элемента - две строки с ключами name и company и число с ключом price.
Теперь определим передачу в SecondActivity данных. Например, определим для MainActivity следующий интерфейс в файле activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/nameLabel"
android:layout_width="0dp"
android:layout_height="20dp"
android:text="Name:"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<EditText
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="40dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/nameLabel"/>
<TextView
android:id="@+id/companyLabel"
android:layout_width="0dp"
android:layout_height="20dp"
android:text="Company:"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/name"/>
<EditText
android:id="@+id/company"
android:layout_width="0dp"
android:layout_height="40dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/companyLabel" />
<TextView
android:id="@+id/ageLabel"
android:layout_width="0dp"
android:layout_height="20dp"
android:text="Age:"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/company"/>
<EditText
android:id="@+id/age"
android:layout_width="0dp"
android:layout_height="40dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ageLabel"/>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="Save"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/age"/>
</androidx.constraintlayout.widget.ConstraintLayout>
Здесь определены три текстовых поля для ввода данных и кнопка.
В классе MainActivity определим следующее содержимое:
package com.example.viewapp;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View v) {
EditText nameText = findViewById(R.id.name);
EditText companyText = findViewById(R.id.company);
EditText ageText = findViewById(R.id.age);
String name = nameText.getText().toString();
String company = companyText.getText().toString();
int age = Integer.parseInt(ageText.getText().toString());
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("name", name);
intent.putExtra("company", company);
intent.putExtra("age", age);
startActivity(intent);
}
}
В обработчике нажатия кнопки получаем введенные в текстовые поля EditText данные и передаем их в объект Intent с помощью метода putExtra().
Затем запускаем SecondActivity.
В итоге при нажатии на кнопку запустится SecondActivity, которая получит некоторые введенные в текстовые поля данные.
В примере выше передавались простые данные - числа, строки. Но также мы можем передавать более сложные данные. В этом случае используется механизм сериализации. Для этого нажмем на папку пакета, где находятся классы MainActivity и SecondActivity, правой кнопкой мыши и в контекстном меню выберем New -> Java Class:
Назовем новый класс User - пусть он будет представлять пользователя.
Пусть класс User имеет следующий код:
package com.example.viewapp;
import java.io.Serializable;
public class User implements Serializable {
private String name;
private String company;
private int age;
public User(String name, String company, int age){
this.name = name;
this.company = company;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Стоит отметить, что данный класс реализует интерфейс Serializable. Теперь изменим код MainActivity:
package com.example.viewapp;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View v) {
EditText nameText = findViewById(R.id.name);
EditText companyText = findViewById(R.id.company);
EditText ageText = findViewById(R.id.age);
String name = nameText.getText().toString();
String company = companyText.getText().toString();
int age = Integer.parseInt(ageText.getText().toString());
User user = new User(name, company, age);
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra(User.class.getSimpleName(), user);
startActivity(intent);
}
}
Теперь вместо трех разрозненных данных передается один объект User. В качестве ключа используется результат метода User.class.getSimpleName(),
который по сути возвращает название класса.
И изменим класс SecondActivity:
package com.example.viewapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_second);
TextView textView = new TextView(this);
textView.setTextSize(26);
textView.setPadding(16, 16, 16, 16);
Bundle arguments = getIntent().getExtras();
User user;
if(arguments!=null){
user = (User) arguments.getSerializable(User.class.getSimpleName());
textView.setText("Name: " + user.getName() + "\nCompany: " + user.getCompany() +
"\nAge: " + String.valueOf(user.getAge()));
}
setContentView(textView);
}
}
Для получения данных применяется метод getSerializable(), поскольку класс User реализует интерфейс Serializable. Таким образом,
мы можем передать один единственый объект вместо набора разрозненных данных.