Для передачи данных между двумя 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. Таким образом,
мы можем передать один единственый объект вместо набора разрозненных данных.