Запуск другой деятельности

После завершения предыдущего урока, у вас есть приложение, которое показывает деятельность (один экран) с текстовым полем и кнопкой. В этом уроке вы добавим код к MainActivity , который запустит новую деятельность, когда пользователь нажмет на кнопку Отправить..

Ответить на кнопку Отправить

Чтобы ответить на событие нажатия кнопки, откройте fragment_main.xml файла макета и добавьте android:onClick атрибут к <Button> элементу:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage" />

android:onClick значение атрибута, "sendMessage", это имя метода в вашей деятельности, который система вызывает когда пользователь нажимает кнопку.

Откройте MainActivity класс (расположенный в каталоге проекта src/ ) и добавьте соответствующий метод:

/** Called when the user clicks the Send button */
public void sendMessage(View view) {
    // Do something in response to button
}

Чтобы система смогла найти этот метод с именем, заданным в android:onClick, сигнатура должна быть именно такой, как вы видели. В частности, метод должен:

  • Быть public
  • Имейте void в качестве возвращаемого значения
  • Иметь View в качестве единственного параметра (это будет View , на котором нажали)

Далее, вы заполните этот метод, чтобы прочитать содержимое текстового поля и доставить этот текст в другую деятельность.

Создать Намерение

Intent это объект, который обеспечивает связывание отдельных компонент во время выполнения (например, двух деятельностей). Intent представляет "намерение что-то сделать". Вы можете использовать намерения для широкого круга задач, но чаще всего они используются, чтобы начать другую деятельность.

Внутри sendMessage() метода, создайте Intent для запуска деятельность под названием DisplayMessageActivity:

Intent intent = new Intent(this, DisplayMessageActivity.class);

Для этого требуется импортировать Intent класс:

import android.content.Intent;

Полезный совет: В Eclipse, нажмите Ctrl + Shift + O для импортирования недостающих классов (Cmd + Shift + O на Mac).

Конструктор, используемый здесь принимает два параметра:

  • Context в качестве первого параметра(this используется, поскольку Activity класс является подклассом Context)
  • Class компонента приложения, в который система должна доставить Intent (в данном случае активность, которая должна быть запущена)

Примечание: Ссылка на DisplayMessageActivity вызовет ошибку, если вы используете интегрированную среду разработки, такую как Eclipse например, потому что класс еще не существует. Игнорируйте ошибку на данный момент; вы скоро создадите класс.

Намерение не только позволяет начать другую деятельность, но также может выполнять связь данных в деятельности. В sendMessage() методе, используйте findViewById() для получения EditText элемента и добавьте его текстовое значение в намерение:

Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);

Примечание: Вам необходим оператор импорта для android.widget.EditText. Вы определите EXTRA_MESSAGE константу буквально сейчас.

Intent может нести коллекцию различных типов данных в виде пары ключ-значение, называемых дополнения. putExtra() метод принимает имя ключа в первом параметре и значения во втором параметре.

Для того, чтобы следующая деятельность смогла запросить дополнительные данные, вы должны определить ключ для дополнений вашего намерения, используя общедоступную константу. Так что добавьте EXTRA_MESSAGE определение в начало MainActivity класса:

public class MainActivity extends ActionBarActivity {
    public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
    ...
}

Вообще это хорошая практика, определять ключи для дополнений намерений используя имя пакета вашего приложения в качестве префикса. Это гарантирует, что они уникальны, в случае когда ваше приложение взаимодействует с другими приложениями.

Запуск второй деятельности

Для запуска деятельности, вызовите startActivity() и передайте в него ваш Intent. Система получает этот вызов и запускает экземпляр Activity указанный в Intent.

С помощью этого нового кода, полный sendMessage() метод, который вызывается кнопкой Отправить теперь выглядит следующим образом:

/** Called when the user clicks the Send button */
public void sendMessage(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class);
    EditText editText = (EditText) findViewById(R.id.edit_message);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
}

Теперь вам нужно создать DisplayMessageActivity класс для того, чтобы это работало.

Создание второй деятельности

Рисунок 1. Мастер новой деятельности в Eclipse.

Для создания новой деятельности в Eclipse:

  1. Нажмите New на панели инструментов.
  2. В появившемся окне, откройте Android папку и выберите Android Activity. Нажмите Next.
  3. Выберите BlankActivity и нажмите Next.
  4. Заполните информацию о деятельности:
    • Project: MyFirstApp
    • Activity Name: DisplayMessageActivity
    • Layout Name: activity_display_message
    • Fragment Layout Name: fragment_display_message
    • Title: Моё сообщение
    • Hierarchial Parent: com.example.myfirstapp.MainActivity
    • Navigation Type: None

    Нажмите Finish.

Если вы используете различные интегрированные среды разработки или инструменты командной строки, создайте новый файл с именем DisplayMessageActivity.java в проекте в src/ каталоге, рядом с оригиналом MainActivity.java файлом.

Откройте DisplayMessageActivity.java файл. Если вы использовали Eclipse для создания этой деятельности:

  • Класс уже включает в себя реализацию требуемого onCreate() метода. Вы обновите реализацию этого метода позже.
  • Есть также реализация onCreateOptionsMenu() метода, но вам это не будет нужно в данном приложении, так что вы можете удалить его.
  • Есть также реализация onOptionsItemSelected() , который обрабатывает поведение панели действий для кнопки Вверх . Оставьте его как есть.
  • Есть также PlaceholderFragment класс, который расширяет Fragment. Вам не нужен будет этот класс в окончательном варианте этой деятельности.

Фрагменты разбивают функциональность приложений и пользовательский интерфейс на модули, которые можно будет повторно использовать. Для более подробной информации о фрагментах см. Руководство по Фрагментам. Окончательный вариант этой деятельности не использует фрагменты.

Примечание: Ваша деятельность может выглядеть иначе, если вы не использовали последнюю версию ADT плагина. Убедитесь, что вы установили последнюю версию ADT плагина для завершения этого курса.

DisplayMessageActivity класс должен выглядеть следующим образом:

public class DisplayMessageActivity extends ActionBarActivity {

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

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() { }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                  Bundle savedInstanceState) {
              View rootView = inflater.inflate(R.layout.fragment_display_message,
                      container, false);
              return rootView;
        }
    }
}

Если вы использовали среду разработки, отличную от Eclipse, обновите ваш DisplayMessageActivity класс согласно коду приведенного выше.

Все подклассы Activity должны реализовать onCreate() метод. Система вызывает его при создании нового экземпляра деятельности. В этом методе вы должны определить макет деятельности с помощью setContentView() метода, и здесь вы должны выполнить начальную настройку компонентов деятельности.

Примечание: Если вы используете среду разработки, отличную от Eclipse, ваш проект не содержит activity_display_message макет, который необходим для setContentView(). Всё впорядке, потому что вы будете обновлять этот метод позже и не будет использовать этот макет.

Добавить строку заголовка

Если вы использовали Eclipse, вы можете перейти к следующему разделу, поскольку шаблон обеспечивает создание строки заголовка для новой деятельности.

Если вы используете среду разработки, отличную от Eclipse, добавьте заголовок для новой деятельности в strings.xml файл:

<resources>
    ...
    <string name="title_activity_display_message">My Message</string>
</resources>

Добавьте её в манифест

Все деятельности должны быть объявлены в файле манифеста, AndroidManifest.xml, используя <activity> элемент.

При использовании инструментов Eclipse для создания своей деятельности, создается запись по умолчанию. Если вы используете другие среды разработки, вам необходимо добавить запись в манифест самим. Это должно выглядеть следующим образом:

<application ... >
    ...
    <activity
        android:name="com.example.myfirstapp.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

android:parentActivityName атрибут объявляет имя родительской деятельности в рамках логической иерархии приложения. Система использует это значение для реализации поведения навигации по умолчанию, такого как навигация Вверх на Android 4.1 (Уровень API 16) и выше. Вы можете предоставить те же поведение навигации для более старых версий Android, используя Библиотеку Поддержки и добавив <meta-data> элемент, как показано здесь.

Примечание: Ваш Android SDK уже должен включать последнюю версию Библиотеки Поддержки Android. Он включен в пакет ADT, но если вы используете другой IDE, он должен был быть установлен на шаге Добавление платформ и пакетов . При использовании шаблонов в Eclipse, Библиотека Поддержка автоматически добавляется в ваше приложение проекта (вы можете увидеть JAR файл библиотеки, перечисленный в Зависимости Android). Если вы не используете Eclipse, вам нужно вручную добавить библиотеку в проект — следуйте инструкциям в руководстве настройка библиотеки поддержки , а затем вернитесь сюда.

Если вы разрабатываете на Eclipse, вы можете запустить приложение сейчас, но ничего такого не произойдет. При нажатии на кнопку Отправить запустится вторая активность, но она использует по умолчанию макет "Привет мир", предоставленный шаблоном. Вы скоро обновите деятельность, чтобы вместо этого отображать настраиваемое представление текста, так что если вы используете другую среду разработки, не волнуйтесь, что приложение еще не будет компилироваться.

Получение Намерения

Каждый Activity вызывается Intent, независимо от того, как пользователь здесь переходит. Вы можете получить Intent , который запустил вашу деятельность, вызвав getIntent() и получить данные, содержащиеся в нем.

В DisplayMessageActivity класса onCreate() метод, получает намерение и извлекает сообщение доставленное MainActivity:

Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

Отображение сообщения

Для отображения сообщения на экране, создайте TextView виджет и установите текст с помощью setText(). Затем добавьте TextView в качестве корневого представления макета деятельности, передав его в setContentView().

Полный onCreate() метод для DisplayMessageActivity теперь выглядит следующим образом:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get the message from the intent
    Intent intent = getIntent();
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

    // Create the text view
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    // Set the text view as the activity layout
    setContentView(textView);
}

Теперь вы можете запустить приложение. Когда оно откроется, введите сообщение в текстовое поле, нажмите Отправить, и сообщение появится во второй деятельности.

Рисунок 2. Две деятельности в законченном приложении, работающие на Android 4.4.

Вот и все, вы создали своё первое Android приложение!

Чтобы узнать больше, перейдите по следующей ссылке на следующий курс.