Запуск второй Activity

Последнее обновление: 14.10.2021

В прошлой теме мы определили 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 Studio, графический дизайнер

Обработка нажатия кнопки

Итак, выще мы определили для кнопки обработку нажатия: 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, которая отобразит ранее введенные данные:

Передача данных в Activity в Android
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850