Ограничение доступа
Ролевой механизм
Загрузка модулей410013796724260
|
Вернуться к «Разработчикам Android»
Многоэкранные Android приложенияОдноэкранное приложение используется, как правило, в качестве примера, либо демонстрации какой-либо технологии/концепции. В разрабатываемых же приложениях одним экраном обойтись невозможно. В данной статье рассматривается пример создания многоэкранного приложения с использованием двух активностей. На следующих скриншотах представлен рассматриваемый на странице пример смены двух экранов, которая выполняется нажатием на кнопки. Так, при нажатии на кнопку «Настройки» первой активности создается новая активность и выполняется её вызов, т.е. переход ко второй активности; один экран сменяется другим. Чтобы вернуться к первой активности необходимо нажать на соответствующую кнопку второй активности «Назад». В примере также демонстрируется функция передачи нескольких разнотипных значений между активностями.
Описание примераНа следующем скриншоте представлен модуль создания activities_01 (IDE Android Studio), в котором реализуется функция cоздания и вызов активности. Модуль включает интерфейс IConstant и 2 активности. При старте примера создается первая активность MainActivity. Вторая активность SettingsActivity создается и вызывается при нажатии на кнопку "Настройки" первой активности. Интерфейс IConstants включает набор констант, которые используются при передаче информации из одной активности в другую.
Манифест AndroidManifestВ манифесте AndroidManifest.xml описываются используемые в приложения активности. При создании в проекте новой активности Android Studio автоматически создает в манифесте тег activity, в которой определяется класс активности (android:name) и доступ к активности (android:exported). Второй атрибут тега имеет логическое значение, определяющее доступ к активности только внутри приложения (android:exported="false"), либо из других приложений (android:exported="true"). В активности MainActivity определен фильтр намерений – это выражение в файле манифеста приложения, в котором указывается тип намерений. После объявления фильтра намерений для активности, другие приложения могут напрямую запускать данную активность с определенным намерением. Если не объявить фильтры намерений для активности, то её можно запустить только с явным намерением. Листинг AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activities_01">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Projects">
<activity
android:name=".SettingsActivity"
android:exported="false" />
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name=
"android.intent.action.MAIN" />
<category android:name=
"android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Интерфейс IConstantsИнтерфейс констант содержит 3 константы, которые используются для передачи и получения пересылаемых сообщений/данных между активностями.
package com.example.activities_01;
public interface IConstants
{
public final String KEY_string = "DATA_string" ;
public final String KEY_int = "DATA_int" ;
public final String KEY_boolean = "DATA_boolean";
}
Активность MainActivityКласс первой активности включает переопределяемый метод onCreate, вызываемый при старте приложения, и метод onSettingsClick, который вызывается при нажатии на кнопку "Настройки". Привязка метода onSettingsClick к кнопке осуществляется в шаблоне интерфейса activity_main.xml. В методе onSettingsClick создается новое намерение intent, которое передается методу startActivity для старта второй активности. Для передачи параметров из одной активности другой используется метод намерения putExtra, который в качестве первого параметра получает наименование ключевого значения (KEY), а вторым параметром – значение. Листинг MainActivity
package com.example.activities_01;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity
implements IConstants {
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//-----------------------------------------------------
public void onSettingsClick(View v)
{
Intent intent = new Intent(getApplicationContext(),
SettingsActivity.class);
intent.putExtra(KEY_string , "intermodular string");
intent.putExtra(KEY_int , 12345);
intent.putExtra(KEY_boolean, Boolean.TRUE);
startActivity(intent);
}
}
Шаблон activity_mainШаблон activity_main описывает интерфейс первой активности, включающий одну единственную кнопку «Настройки». Атрибут описания кнопки android:onClick="onSettingsClick" связывает соответствующий метод активности с кнопкой. Листинг main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/btnSettings"
android:layout_width="160dp"
android:layout_height="48dp"
android:layout_margin="10dp"
android:onClick="onSettingsClick"
android:text="Настройки" />
</LinearLayout>
Активность SettingsActivityКласс второй активности также включает переопределяемый метод onCreate, вызываемый при создании активности, метод onClick, который вызывается при нажатии на кнопку "Назад", и метод onResume, который выводит в Logcat передаваемые между активностями параметры. Привязка метода onClick к кнопке осуществляется в шаблоне интерфейса activity_settings.xml. В методе onClick создается намерение intent, которое передается методу startActivity для старта первой активности. Листинг SettingsActivity
public class SettingsActivity extends AppCompatActivity
implements IConstants
{
private String key_string = "Не определено";
private int key_int = 0;
private boolean key_boolean = false;
private String LOG_DEV = "DEVELOPMENT";
//-----------------------------------------------------
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
Bundle extras = getIntent().getExtras();
if (extras != null) {
key_string = extras.getString (KEY_string );
key_int = extras.getInt (KEY_int );
key_boolean = extras.getBoolean(KEY_boolean);
}
}
//-----------------------------------------------------
public void onClick(View v)
{
Intent intent = new Intent(getApplicationContext(),
MainActivity.class);
startActivity(intent);
}
//-----------------------------------------------------
@Override
protected void onResume()
{
super.onResume();
Log.d(LOG_DEV, "key_string : " + key_string );
Log.d(LOG_DEV, "key_int : " + key_int );
Log.d(LOG_DEV, "key_boolean : " + key_boolean);
}
}
Шаблон activity_settingsШаблон activity_settings описывает интерфейс второй активности, включающий метку "Настройки" типа TextView и кнопку «Назад». Атрибут описания кнопки android:onClick="onClick" связывает соответствующий метод активности с кнопкой. Листинг activity_settings.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:id="@+id/settingsFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.activities_01.SettingsActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="228dp"
android:layout_height="27dp"
android:layout_marginStart="32dp"
android:layout_marginTop="16dp"
android:text="Настройки"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="128dp"
android:layout_height="48dp"
android:layout_marginEnd="32dp"
android:layout_marginBottom="24dp"
android:text="Назад"
android:onClick="onClick"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
|
