Запуск другой Activity — второго окна android-приложения

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

[wpanchor id=»1″]

 

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


Чтобы ответить на событие нажатия кнопки, откройте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 , на котором нажали)

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

[wpanchor id=»2″]

 

Создать Intent


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). В Android Studio команда для импорта Alt+Enter.

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

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

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

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

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 может нести коллекцию различных типов данных в виде пары ключ-значение, называемых Extras. Метод putExtra()  принимает имя ключа в первом параметре и значение во втором параметре.

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

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

 

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

[wpanchor id=»3″]

 

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


Для запуска активити, вызовите 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 класс для того, чтобы это работало.

[wpanchor id=»4″]

 

Создание второй Activity


Для создания новой Activity в Android Studio:

В главном меню выберите File>New>Activity>Blank Activity.

Заполните поля в окне мастера создания активити:

  • Activity Name: DisplayMessageActivity
  • Layout Name: activity_display_message
  • Title: Моё сообщение
  • Hierarchial Parent: com.example.myfirstapp.MainActivity

Остальные поля оставьте по умолчанию. Нажмите Finish.

Для создания новой Activity в Eclipse:

  • Нажмите New на панели инструментов.
  • В появившемся окне, откройте Android папку и выберите Android Activity. Нажмите Next.
  • Выберите BlankActivity и нажмите Next.
  • Заполните информацию о Activity:
    • 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.

 

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

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

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

  • Класс уже включает в себя реализацию требуемого 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;
        }
    }
}

 

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

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

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

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

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

Иначе, добавьте заголовок для новой активити в strings.xml файл:

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

 

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

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

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

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

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

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

[wpanchor id=»5″]

 

Получение Интента


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

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

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

 

[wpanchor id=»6″]

 

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


Для отображения сообщения на экране, создайте 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 приложение!

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

Комментарии: 3
  1. Сергей

    а для чего нужны методы onOptionItemSelected и PlaceHolderFragment ?
    Я еще далек от понимания, но мне кажется, они тут лишние.

    что делает? if (savedInstanceState == null){
    getSupportFragmentManager().beginTransaction().add(R.id.container, new PlaceHolderFragment()).commit();
    }

    1. admin (автор)

      Посмотрите уроки по работе с фрагментами — станет понятнее

Добавить комментарий