В прошлой теме мы определили MessageActivity, которая получает извне некоторые данные. Теперь определим в MainActivity код, который будет запускать MessageActivity и передавать ей некоторые данные.
Изменим файл 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" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <EditText android:id="@+id/editText" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:hint="Введите текст" app:layout_constraintRight_toLeftOf="@+id/button" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="16dp" android:layout_marginStart="16dp" android:text="Отправить" android:onClick="sendMessage" app:layout_constraintTop_toTopOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintLeft_toRightOf="@+id/editText" /> </androidx.constraintlayout.widget.ConstraintLayout>
Здесь мы добавили в ConstraintLayout два элемента: EditText (поле для ввода текста) и Button (кнопка). Рассмотрим по отдельности, что они представляют.
Для ввода текста, который будет передаваться в MessageActivity, добавлен элемент EditText:
<EditText android:id="@+id/editText" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:hint="Введите текст" app:layout_constraintRight_toLeftOf="@+id/button" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" />
Итак, мы определили следующие атрибуты:
android:id: обеспечивает уникальный идентификатор виджета, по которому мы можем ссылаться на объект
android:layout_width задает ширину элемента. В данном случае значение "0dp". В реальности ширина будет устанавливаться контейнером ConstraintLayout на основании дополнительных атрибутов, которые идут далее.
android:layout_height устанавливает высоту контейнера. Значение wrap_content
задает
для виджета величину, достаточную для отображения в контейнере
android:layout_marginStart: задает отступ от отступ от левой границы контейнера. В данном случае 16 единиц
android:layout_marginTop: задает отступ от отступ от верхней границы контейнера. В данном случае 16 единиц
android:hint: задает текст-подсказку в текстовом поле
app:layout_constraintRight_toLeftOf: указывает, что EditText располагается слева от элемента, id которого указан в качестве значения. Так, в данном случае значение "@+id/button" представляет идентификатор нашей кнопки. То есть правая сторона элемента EditText будет выравниваться по левой границе элемента Button.
app:layout_constraintLeft_toLeftOf="parent": указывает, что левая граница элемента будет проходить по левой стороне контейнера ConstraintLayout (с учетом выше установленного отступа)
app:layout_constraintTop_toTopOf="parent": указывает, что верхняя граница элемента будет проходить по верхней стороне контейнера ConstraintLayout (с учетом выше установленного отступа)
Теперь рассмотрим код кнопки - элемента Button
, которая будет запускать MessageActivity:
<Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="16dp" android:layout_marginStart="16dp" android:text="Отправить" android:onClick="sendMessage" app:layout_constraintTop_toTopOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintLeft_toRightOf="@+id/editText" />
Элемент Button применяет следующие атрибуты:
android:id: идентификатор кнопки - button.
android:layout_width - в качестве ширины кнопки устнавливается значение wrap_content
, поэтому
кнопка будет иметь ту ширину, которая достаточна для вывода ее текста.
android:layout_height - значение wrap_content
задает
для виджета величину, достаточную для отображения текста
android:layout_marginStart: задает отступ от отступ от условной левой границы элемента - в данном случае это правый край текстового поля EditText. В данном случае он равен 16 единиц
android:layout_marginTop: задает отступ от отступ от верхней границы контейнера. В данном случае 16 единиц
android:text: задает тест кнопки
android:onClick: устанавливает обработчик нажатия на кнопку. Значение "sendMessage", присвоенное атрибуту, представляет собой имя метода, определенного в классе связанной activity (в данном случае в MainActivity). То есть при нажатии на кнопку будет вызываться метод sendMessage, который мы далее определим.
app:layout_constraintLeft_toRightOf="@+id/editText": устанавливает выравнивание левой стороны элемента Button по
правой границе EditText.
Значение ="@+id/editText"
указывает, что нижняя граница кнопки будет выравниваться по нижней границе элемента с id editText,
то есть текстового поля.
app:layout_constraintTop_toTopOf="parent": указывает, что верхняя граница элемента будет проходить по верхней стороне контейнера ConstraintLayout с учетом отступа
app:layout_constraintRight_toRightOf: указывает, что правая граница элемента будет проходить по правой стороне контейнера ConstraintLayout
Если мы перейдем к режиму дизайнера, например, в разделенном режиме (код + дизайнер), то мы увидим следующий макет:
Итак, выще мы определили для кнопки обработку нажатия: android:onClick="sendMessage"
.
Мы предполагаем, что по нажатию на кнопку будет срабатывать метод sendMessage, в котором будет запускаться MessageActivity. Для добавления этого метода
изменим код класса MainActivity:
package com.example.helloapp; 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 sendMessage(View view) { // действия, совершаемые после нажатия на кнопку // Создаем объект Intent для вызова новой Activity Intent intent = new Intent(this, MessageActivity.class); // Получаем текстовое поле в текущей Activity EditText editText = findViewById(R.id.editText); // Получае текст данного текстового поля String message = editText.getText().toString(); // Добавляем с помощью свойства putExtra объект - первый параметр - ключ, // второй параметр - значение этого объекта intent.putExtra("message", message); // запуск activity startActivity(intent); } }
Обработчик нажатия кнопки - метод sendMessage() должен принимать в качестве параметра объект View, который представляет саму нажатую кнопку:
public void sendMessage(View view) {
Далее для запуска второй activity необходим объект Intent. Объект Intent представляет некоторую задачу приложения, которую надо выполнить (например, запуск activity):
Intent intent = new Intent(this, MessageActivity.class);
Конструктор этого объекта принимает два параметра:
Первый параметр представляет контекст - объект Context
(ключевое слово this
употребляется здесь,
так как класс MainActivity
является подклассом класса Context
)
Вторым параметром идет класс компонента, которому мы передаем объект Intent. В качестве него будет выступать объект класса MessageActivity, который был добавлен в прошлой теме
Внутри метода sendMessage()
используем метод findViewById, чтобы получить элемент EditText
и
передать введенный в него текст в объект intent
:
EditText editText = findViewById(R.id.editText); String message = editText.getText().toString();
Затем полученный из текстового поля текст передается в запускаемую activity:
intent.putExtra("message", message);
Параметр "message" указывает на ключ передаваемых данных. То есть мы можем в новую activity передать множество данных, и чтобы их можно было разграничить, для них устанавливается ключ. Обращаю внимание, что здесь данные передаются по тому же ключу, по которому в MessageActivity мы получаем эти данные:
String message = intent.getStringExtra("message");
Для запуска activity нужно вызвать метод startActivity() и передать ему в качестве параметра объект Intent
:
startActivity(intent);
После вызова этого метода система получит сигнал и запустит новый объект Activity
, определенный объектом Intent
.
Теперь запустим проект и после запуска приложения мы увидим текстовое поле с кнопкой, но после ввода текста и нажатия на кнопку будет запущена новая activity - MessageActivity, которая отобразит ранее введенные данные: