- В этом уроке
- Вы также должны прочитать
- Ответить на кнопку Отправить
- Создать Intent
- Отправка intent в другие приложения
- Запуск второй Activity
- Создание второй Activity
- Для создания новой Activity в Android Studio:
- Для создания новой Activity в Eclipse:
- Добавить строку заголовка
- Добавьте её в манифест
- Получение Интента
- Отображение сообщения
- Следующий курс: Поддержка различных Android устройств
В этом уроке
- Ответить на кнопку Отправить
- Создать Intent
- Запуск второй активити
- Создание второй активити
- Получение интента
- Отображение сообщения
Вы также должны прочитать
После завершения предыдущего урока, у вас есть приложение, которое показывает активити (один экран) с текстовым полем и кнопкой. В этом уроке вы добавим код к 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
(в данном случае активность, которая должна быть запущена)
Отправка intent в другие приложения
Intent, созданный в этом уроке считается явным, поскольку Intent
указывает точный компонент приложения, в которое интент следует отправить. Тем не менее, интенты также могут быть неявными, в этом случае Intent
не указывает нужный компонент, позволяя любой программе установленной на устройстве отвечать на интенты, пока она удовлетворяет спецификациям мета-данных действия, задаваемыми в различных 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.
Если вы используете инструменты командной строки, создайте новый файл с именем 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); }
Теперь вы можете запустить приложение. Когда оно откроется, введите сообщение в текстовое поле, нажмите Отправить, и сообщение появится во второй активити .
Вот и все, вы создали своё первое Android приложение!
Чтобы узнать больше, перейдите по ссылке на следующий курс.
а для чего нужны методы onOptionItemSelected и PlaceHolderFragment ?
Я еще далек от понимания, но мне кажется, они тут лишние.
что делает?
if (savedInstanceState == null){
getSupportFragmentManager().beginTransaction().add(R.id.container, new PlaceHolderFragment()).commit();
}
Посмотрите уроки по работе с фрагментами — станет понятнее