понедельник, 29 августа 2011 г.

Разработка Android приложения: Main Activity UI / Разработка под Android / Хабрахабр

Разработка Android приложения: Main Activity UI / Разработка под Android / Хабрахабр:
Это перевод первой статьи из цикла “Android Full Application Tutorial”. В цикле мы создадим android приложение, позволяющее искать фильмы или актеров в сети Интернет.

В данной статье мы рассмотрим следующие вопросы:
— создание проекта в среде eclipse
— разработка пользовательского интерфейса
— тестирование в приложения в эмуляторе


Для начала, создадим проект в Eclipse. Проект назовем AndroidMovieSearchAppProject, приложение – MovieSearchApp. Данная статья носит ознакомительный характер, поэтому в ней будет использоваться Android 1.5 (API level 3).

image

Пользовательский интерфейс сделаем абсолютно простым. Создадим форму со следующими элементами:
— поле ввода, куда пользователь будет вводить запрос
— две радиокнопки(фильм/актер), по которым будем определять, что ищет пользователь
— label, в котором будем показывать тип поиска
— кнопка, при нажатии на которую будем показывать пользователю результаты поиска

Результаты поиска будут отображаться в другой activity, о ней будет подробнее написано в следующих статьях серии.

Экранные формы в андроид-приложениях описываются с помощью xml файлов (для того, чтобы отделить отображение от логики). Файлы экранных форм должны лежать в папке res/layout проекта. Создадим там файл main.xml со следующим содержимым:

                                                                 


Заметьте, что строковые константы (@string/people например), не харкодятся, вместо них используются ключи из файла strings.xml, который расположен в папке res/values. В этом файле описываются строковые константы, необходимые для интернационализации приложения. Содержимое файла strings.xml

      Hello World, MovieSearchAppActivity!     MovieSearchApp     Search     Movies     People 


Вот как созданная нами экранная форма будет выглядеть в Android эмуляторе

image

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

Android предоставляет возможность обрабатывать события (клики на кнопку, смена фокуса, и тд), возникающие по действию пользователя. Для обработки нажатий на кнопку мы используем интерфейсOnClickListener, который определяет метод onClick, вызывающийся при нажатии пользователем на кнопку.

Другой полезный интерфейс — OnFocusChangeListener. Он определяет метод onFocusChange, который вызывает при смене фокуса.

Давайте посмотрим, как это можно использовать в нашей основной Activity


package com.javacodegeeks.android.apps.moviesearchapp;  import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnFocusChangeListener; import android.widget.Button; import android.widget.EditText; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast;  public class MovieSearchAppActivity extends Activity {          private static final String EMPTY_STRING = "";          private EditText searchEditText;     private RadioButton moviesSearchRadioButton;     private RadioButton peopleSearchRadioButton;     private RadioGroup searchRadioGroup;     private TextView searchTypeTextView;     private Button searchButton;          @Override     public void onCreate(Bundle savedInstanceState) {                  super.onCreate(savedInstanceState);         setContentView(R.layout.main);                  this.findAllViewsById();                  moviesSearchRadioButton.setOnClickListener(radioButtonListener);         peopleSearchRadioButton.setOnClickListener(radioButtonListener);                  searchButton.setOnClickListener(new OnClickListener() {                         @Override             public void onClick(View v) {                 String query = searchEditText.getText().toString();                 if (moviesSearchRadioButton.isChecked()) {                     longToast(moviesSearchRadioButton.getText() + " " + query);                 }                 else if (peopleSearchRadioButton.isChecked()) {                     longToast(peopleSearchRadioButton.getText() + " " + query);                 }             }         });                  searchEditText.setOnFocusChangeListener(new DftTextOnFocusListener(getString(R.string.search)));                  int id = searchRadioGroup.getCheckedRadioButtonId();         RadioButton radioButton = (RadioButton) findViewById(id);         searchTypeTextView.setText(radioButton.getText());              }          private void findAllViewsById() {         searchEditText = (EditText) findViewById(R.id.search_edit_text);         moviesSearchRadioButton = (RadioButton) findViewById(R.id.movie_search_radio_button);         peopleSearchRadioButton = (RadioButton) findViewById(R.id.people_search_radio_button);         searchRadioGroup = (RadioGroup) findViewById(R.id.search_radio_group);         searchTypeTextView = (TextView) findViewById(R.id.search_type_text_view);         searchButton = (Button) findViewById(R.id.search_button);     }          public void longToast(CharSequence message) {         Toast.makeText(this, message, Toast.LENGTH_LONG).show();     }          private OnClickListener radioButtonListener = new OnClickListener() {         public void onClick(View v) {             RadioButton radioButton = (RadioButton) v;             searchTypeTextView.setText(radioButton.getText());         }     };      private class DftTextOnFocusListener implements OnFocusChangeListener {                  private String defaultText;          public DftTextOnFocusListener(String defaultText) {             this.defaultText = defaultText;         }          public void onFocusChange(View v, boolean hasFocus) {             if (v instanceof EditText) {                 EditText focusedEditText = (EditText) v;                 // handle obtaining focus                 if (hasFocus) {                     if (focusedEditText.getText().toString().equals(defaultText)) {                         focusedEditText.setText(EMPTY_STRING);                     }                 }                 // handle losing focus                 else {                     if (focusedEditText.getText().toString().equals(EMPTY_STRING)) {                         focusedEditText.setText(defaultText);                     }                 }             }         }              }      } 


Метод setContentView устанавливает, какая экранная форма будет показана пользователю в данной activity. R.layout.main – это как раз та форма, которую мы создали на предыдущем этапе. Затем мы получаем ссылки на элементы интерфейса, чтобы потом использовать их в коде. Мы создаем дваOnClickListener, один для обрабоки нажатий на радиокнопки, дугой – для кнопки поиска. Обработчики привязываются к элементам пользовательского интерфейса с помощью метода setOnClickListener.

Радиокнопки помещаются внутрь компонента RadioGroup. В коде мы можем использовать методgetCheckedRadioButtonId для получения идентификатора выбранного RadioButton.

В конце мы создадим OnFocusChangeListener, который привяжем к текстовому полю с помощью методаsetOnFocusChangeListener. С помощью данного обработчика мы сможем достичь похожей функциональности:

image

При потере фокуса, если поле ввода пустое, в него будет подставляться текст.
Приложение готово, теперь его надо протестировать. Тестировать приложение будем с помощью Android эмулятора. Запустим AVD (Android Virtual Device) Manager из Eclipse, и создадим новый девайс. Назовем его Android-1.5-SD и выберите платформу Android 1.5.

image

Далее, создадим новую Run Configuration, выберем Android Project и MovieSearchAppActivity для запуска.

image

На вкладке Target выберем созданный девайс и нажмем Apply и Run.

image

Запустится Android эмулятор, а через некоторое время наша программа.

image

Исходный код приложения доступен здесь

'via Blog this'

Комментариев нет: