Урок 12. Из одного Activity в другое

На данный момент если вы запустите наше приложение у вас не будет возможности попасть на экран, который выводит вопрос и предлагает три варианта ответа (activity_game.xml). Нам необходимо сделать так, чтобы по нажатии кнопки «Play» на экране activity_main.xml мы попадали на экран с игрой activity_game.xml. Открывайте проект с нашей математической игрой и следуйте по пунктам:

  • Открываем файл acitivity_main.xml (либо двойным щелчком в проводнике проекта, либо щелчком на вкладку в случае, когда она не активна);
  • Теперь, как мы уже делали это раньше (с текстовыми элементами) нам нужно назначить id кнопке Play. Кликните по кнопке Play или найдите её в «Component tree» и в свойствах кнопки найдите ID и назначьте там «buttonPlay»;

button android studio

  • Теперь перейдите в MainActivity.java.
  • В теле метода onCreate, сразу же после строки с методом setContentView добавьте выделенную строку:
setContentView(R.layout.activity_main);
Button buttonPlay = (Button)findViewById(R.id.buttonPlay);
  • Позже мы подробнее проанализируем весь код целиком, а пока нужно знать, что мы этой строкой кода создаём ссылочную переменную (объект) и присоединяем к кнопке Play. Так же как мы делали раньше, после добавления этой строки необходимо будет импортировать класс Button в наш проект комбинацией клавиш Alt+Enter.
  • Теперь кое-что новенькое. Мы дадим кнопке способность «слушать» клик пользователя. Сразу же после предыдущего кода напишите это:
    buttonPlay.setOnClickListener(this);

 
Заметьте, что ключевое слово this подчеркнуто красным цветом, что указывает нам на ошибку. В дальнейших уроках будет подробное объяснение почему так происходит. Оставим это пока в уме. Нам нужно внести изменения в наш код и разрешить использование интерфейса (очень мощный инструмент в программировании, о нём тоже попозже, дабы не захламлять голову большим количеством теории без практического применения), позволяющего нам добавлять функциональные возможности, такие как «прослушивание» щелчков по кнопкам. Отредактируйте эту строку:

public class MainActivity extends AppCompatActivity{

в эту:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

Теперь вся эта строка подчеркнута красным. Добавив implements View.onClickListener мы реализовали интерфейс. Интерфейс – это как класс, но со своими правилами. Правило интерфейса onClickListener гласит, что мы обязаны реализовать/использовать один из его методов. Давайте сделаем это.

  • Обратите внимание на открывающую фигурную скобку ({) и закрывающую (}). Они обозначают начало и конец метода. Наш метод пуст, и он ничего не делает, но этого вполне достаточно для соответствия правилу интерфейса onClickListener. Красная строка уйдёт. Убедитесь, что вы ввели следующий код после закрывающей фигурной скобки метода onCreate, но перед закрывающей фигурной скобкой нашего класса MainActivity:
@Override
public void onClick(View view) {

        }

Теперь следует написать код в этом методе и привнести жизнь нашей кнопке:

@Override
public void onClick(View view) {
      Intent i;
      i = new Intent(this, GameActivity.class);
      startActivity(i);
        }

Добавленный код выделен жирным. Не забудьте импортировать класс Intent.

  • Пока этот код для нас немного непонятен. Отгадка кроется в методе startActivity и знакомом нам термине GameActivity. Обратите внимание, что мы присваиваем что-то переменной «i». Понимание всего происходящего придёт после уроков, где мы будем разбирать понятие Объектно-Ориентированного Программирования. А сейчас давайте запустим наше приложение. Если всё сделано правильно, то вы перед собой должны увидеть это:

emulator android studio

При нажатии кнопки Play на экране меню (activity_main) вы перейдёте на экран с игровым процессом (activity_game). Если этого не произошло, внимательно прочтите статью еще раз и попробуйте найти какое-либо несоответствие. Последовательность строчек в коде очень важна, также как и расстановка фигурных скобок «{}». Всё должно соответствовать нашему описанию. Но если проблема не будет найдена вами, вы можете связаться со мной посредством комментария и подробно объяснить возникшее перед вами затруднение. Я попробую вам помочь.

 

Разбираемся в коде

Файл MainActivity.java – весь код целиком:

package com.example.user.firstgame;

import android.content.Intent;
import android.support.constraint.ConstraintLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button buttonPlay = (Button)findViewById(R.id.buttonPlay);
        buttonPlay.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        Intent i;
        i = new Intent(this, GameActivity.class);
        startActivity(i);
    }
}

Разберём по кусочкам:

package com.example.user.firstgame;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

В первом куске мы видим определение имени нашего пакета и импортируем нужные нам библиотеки из Android API для взаимодействия в коде. Далее:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

Тут происходит объявление нашего класса MainActivity с реализацией интерфейса View.OnClickListener, который даёт нам возможность засечь нажатие по кнопке. Далее:

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

Сперва строкой super.onCreate(savedInstanceState); мы просим выполнить некоторые вещи, которые скрыты в коде метода onCreate. По сути этой строкой мы задаём начальные настройки Activity. Строкой setContentView(R.layout.activity_main); устанавливаем созданный нами пользовательский интерфейс в файле activity_main.xml.

Далее мы создаём ссылку на нашу кнопку с ID buttonPlay:

Button buttonPlay = (Button)findViewById(R.id.buttonPlay);

И придаём ей возможность «слушать» нажатие по ней:

buttonPlay.setOnClickListener(this);

В конце, в методе onClick мы с помощью класса Intent отправляем пользователя в класс GameActivity, который в своём коде устанавливает в качестве экрана пользовательский интерфейс, созданный нами в файле activity_game.xml:

@Override
public void onClick(View view) {
        Intent i;
        i = new Intent(this, GameActivity.class);
        startActivity(i);
        }

Теперь, когда мы немного изучили азы обработки событий, нам нужно изучить больше язык Java. Переходите к следующему уроку – в нём мы рассмотрим еще несколько операторов (помимо тех, что мы уже знаем), используя которые мы научим наше приложение не только задавать вопрос пользователю, но и реагировать на ответ.