В прошлых темах мы создали первый проект, однако весь проект состоял лишь из примитивного кода, добавляемого по умолчанию. Теперь определим сами приложение, которое также также будет очень простое. Пусть на одной странице приложения мы будем вводить некоторые данные и по нажатию на кнопку будет происходить переход к другой странице приложения, которая будет отображать ранее введенные данные.
Итак, возьмем ранее созданный проект (или создадим новый).
И по умолчанию у нас уже есть одна activity - класс MainActivity. Теперь добавим еще одну. Для этого нажмем правой кнопкой мыши в структуре проекта на папку, в котором находится класс MainActivity, и затем в контекстном меню выберем New->Activity->Empty Activity:
После этого откроется диалоговое окно создания новой activity:
В этом окне в поле Activity Name введем MessageActivity. После этого в поле Layout Name автоматически должно установиться activity_message (если не устновилось, то введем в это поле activity_message). В остальных полях оставим значения по умолчанию:
Package Name - должен иметь то же название, что и пакет, в котором находится MainActivity
Source Language должен иметь значение Java
И затем нажмем Finish.
После этого в папке с MainActivity должен появиться файл с новой activity - MessageActivity:
Кроме того, в каталоге res/layout должен появиться файл activity_message.xml, который представляет описание графического интерфейса для MessageActivity.
Вначале откроем файл activity_message.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=".MessageActivity"> <TextView android:id="@+id/messageText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
Определение интерфейса для MessageActivity содержит только элемент TextView, который выводит некоторую строку на экран. Рассмотрим установленные в нем атрибуты:
android:id="@+id/messageText"
- TextView имеет идентификатор "messageText", через который мы сможем обращаться к TextView в коде java.
Символ @ указывает XML-парсеру использовать оставшуюся часть строки атрибута как идентификатор. А знак +
означает, что если для элемента не определен id со значением messageText, то его следует определить.
android:layout_width="wrap_content"
- ширина текстового поля будет такой, чтобы вместить все его содержимое на экране
android:layout_height="wrap_content"
- высота TextView будет такой, чтобы вместить все его содержимое на экране
android:textSize="18sp"
- высота текста в TextView составляет 18 единиц (для установки высоты шрифта используется величина sp)
app:layout_constraintBottom_toBottomOf="parent"
- нижний край TextView будет выравниваться по нижней стороне контейнера ConstraintLayout
app:layout_constraintLeft_toLeftOf="parent"
- левая граница TextView будет выравниваться по левой стороне контейнера ConstraintLayout
app:layout_constraintRight_toRightOf="parent"
- правый край TextView будет выравниваться по правой стороне контейнера ConstraintLayout
app:layout_constraintTop_toTopOf="parent"
- верхний край TextView будет выравниваться по верхней стороне контейнера ConstraintLayout
Суть MessageActivity будет заключаться в том, что она будет получать некое текстовое сообщение и выводить его на экран (формально в элемент TextView, который был определен выше). Как мы можем получить в MessageActivity (и в любой другой activity) некоторые данные, которые переданы из другой activity?
Возьмем код класса MessageActivity. По умолчанию он выглядит так:
package com.example.helloapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; public class MessageActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_message); } }
И изменим его следующим образом:
package com.example.helloapp; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.widget.TextView; public class MessageActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_message); // Получаем объект Intent, который запустил данную activity Intent intent = getIntent(); // Получаем сообщение из объекта intent String message = intent.getStringExtra("message"); // Получаем TextView по его id TextView messageText = findViewById(R.id.messageText); // устанавливаем текст для TextView messageText.setText(message); } }
Также, как и в MainActivity (и в других activity), создание текущей activity происходит в методе onCreate()
.
Все классы activity должны реализовать метод onCreate
, так как система вызывает его при создании новой activity.
Именно в этом методе задается компоновка нового объекта activity с помощью метода setContentView и именно здесь происходит
начальная настройка компонентов.
Каждый объект Activity
вызывается объектом Intent
. Мы можем в коде Java получить вызывающий объект
Intent
с помощью метода getIntent
:
Intent intent = getIntent();
Но Intent нам важен не сам по себе, а потому что через него в эту activity будут передаваться данные. Эти данные могут представлять различные типы,
но в здесь мы предполагаем, что в MainActivity будет передаваться строка. И для получения строки у объекта Intent вызывается метод getStringExtra()
:
String message = intent.getStringExtra("message");
В метод передается ключ данных. То есть каждый элемент передаваемых данных представлен в формате "ключ-значение". Через ключ мы можем получить значение.
И в данном случае ключом будет "message". А значение по этому ключу попадет в переменную String message
.
Получив переданные в MessageActivity данные, мы можем передать их в TextView для вывода на экране устройства. Для этого вначале находим виждет
TextView по его id и затем вызываем его метод setText()
, который устанавливает выводимый в TextView текст:
TextView messageText = findViewById(R.id.messageText); messageText.setText(message);
Таким образом, MessageActivity получит переданное ей сообщение и выведет его в TextView. Теперь рассмотрим, как вызвать эту activity из MainActivity и как передать ей это сообщение.