Навчитися створювати додатки, що складаються з декількох активностей, і діалогові вікна, а також познайомитися з елементами тач-інтерфейса
4.1 Вступ
Ця лабораторна робота присвячена різним способам розробки багатоекранних застосувань. Пропонується розробити три застосування, кожне з яких присвячене окремому аспекту цієї тематики. Після завершення роботи над додатками слухачі зможуть розробити власні програми з використанням вивчених компонентів і технологій.
4.2 Створення багатоекранного застосування зі списком
1. Створіть проект MultiScreen. У java- файлі заміните Activity на ListActivity. Клас ListActivity розроблений таким чином, що на екрані є тільки прокручуваний список і йому не потрібна додаткова розмітка. Тому файл activity _ main.xml можна видалити. Також слід видалити наступний рядок із класу MultiScreen :
setContentView (R.layout.activity _ main);
оскільки layout- файл ми тільки що видалили.
2. Тепер нам потрібний посередник, який зв'яже список і назви елементів цього списку. Для цього в Android є інтерфейс Adapter. Нам знадобиться спадкоємець цього класу ArrayAdapter :
new ArrayAdapter (Context context, int textViewResourceId, String[] objects)
В якості аргументів ArrayAdapter зажадає поточний контекст, ідентифікатор ресурсу з розміткою для кожного рядка, масив рядків.
Ми можемо вказати в якості поточного контексту ListActivity (можна використати ключове слово this), готовий системний ідентифікатор ресурсу (android.R.
Посере́дник: Особа чи установа, організація і т. ін., що сприяє встановленню та здійсненню ділових контактів, торговельних або дипломатичних зносин між ким-, чим-небудь. // Те, що виступає проміжною ланкою у взаємодії між чим-небудь або в процесі перетворення чогось.
Ключове́ сло́во - слово, або сталий вислів природної мови, яке використовують для вираження деякого аспекту змісту документа (або запиту); слово, яке має істотне смислове навантаження. Воно може служити ключем під час пошуку інформації в інтернеті чи на сторінці сайту.
layout.simple list item 1) і створений масив рядків (String[] islands ={ "Канари", "Курили", "Мальдіви", "Філіппіни"};). А виглядати це буде так:
private ArrayAdapter adapter;
adapter = new ArrayAdapter(this
android.R.layout.simple list item 1, islands);
Зверніть увагу на рядок android.R.layout.simple list item 1. У ньому вже міститься необхідна розмітка для елементів списку. Якщо вас не влаштовує системна розмітка, то можете створити власну розмітку в xml-файлі і підключити її.
Залишилося тільки підключити адаптер:
setListAdapter (adapter);
3. Тепер нам треба підключити обробку натиснення. Для цього необхідно знати, на який пункт списку здійснюється натиснення. Існує спеціальний інтерфейс OnItemClickListener з методом onItemClick (). Підключаємо обробник: getListView ().setOnItemClickListener (itemListener); Набираємо все в тому ж onCreate
OnItemClickListener itemListener = new OnItemClickListener (){
}
Якщо підкреслиться перше слово, то імпортуємо потрібний клас. Далі підведемо курсор до другого слова new OnItemClickListener. Нам буде запропоновано додати метод (Add unimplemented method). Погоджуємося і отримуємо заготівлю:
OnItemClickListener itemListener = new OnItemClickListener (){
@Override
public void onItemClick (AdapterView> arg0, View arg1, int arg2 long arg3){
// TODO Auto - generated method stub
}
};
Міняємо імена змінних arg на звичніші і зрозуміліші
public void onItemClick (AdapterView> parent
View v, int position, long id);
4. Залишилося описати, що відбуватиметься при натисненні на елемент.
По нашій задумці кожен елемент відкриватиме нове вікно з відповідним вмістом.
Спершу слід створити ще 4 класи: Canari, Curili, Maldivi, Philippini, і 4 xml- оболонки до них. Можна просто створити і копіювати по одному файлу в обох директоріях, міняючи тільки назву і вміст.
Наприклад, створимо файли Canari.java і canari.xml типу Activity. Зверніть увагу, що як тільки ми створили ще один java- файл, треба записати його у файл маніфесту, інакше додаток не бачитиме цей новий клас. Файл AndtoidManifest.xml знаходиться відразу під текою res. Додайте код з ім'ям класу в тегах , відразу під головною активністю.
android: label="@string/can" >
Рядок can треба створювати у файлі strings.xml, також як і інші рядки.
Перейдемо у файл canari.xml і створимо на екрані TextView. Екрани відрізнятимуться один від одного картинками. Візьміть 4 будь-яких картинки з вашого комп'ютера (можете також знайти їх в інтернеті) і перетягніть з провідника Windows в теку res\drawable. Тепер ви можете помістити елемент ImageView на екран і, вибравши потрібну картинку з ресурсів проекту, підключити її.
Інші екрани створюються аналогічно.
Провідник - матеріал, що проводить світло або електрику (на противагу діелектрику). Для провідника характерні високі тепло- або електропровідність. Найчастіше провідник є речовиною, яка має багато вільних електронів (метали).
Анало́гія - (грец. αναλογια - «відповідність») - подібність, схожість у цілому відмінних предметів, явищ за певними властивостями, ознаками або відношеннями.
5. Тепер перейдемо в головний клас і опишемо обробку події onItemClick (). Створимо перемикач, який залежить від номера елементу.
switch (position) {
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
}
Для запуску нового екрану необхідно створити екземпляр класу Intent і вказати клас, на який переходитимемо (у нас їх 4, тому для кожного випадку вибираємо свою). Після цього викликається метод startActivity (), який і запускає новий екран.
Intent intent = new Intent (MultiScreenMainActivity.this, Canari.class);
startActivity (intent);
6. Тепер залишилося додати спливаюче вікно Toast, яке показуватиме, який елемент ми вибрали. Цей віджет можна імпортувати так само, як і попередні. Нам знадобиться метод makeText (), у якого є три параметри: контекст додатка, текстове повідомлення і тривалість часу показу повідомлення.
Toast.makeText (getApplicationContext (), "Ви вибрали " parent.getItemAtPosition (position).toString (),Toast.LENGTH _ SHORT).show ();
Повні лістинги файлів проекту, в яких були зроблені зміни, див. нижче.
package com.mypackage.multiscreen;
import android.os.Bundle;
2. Створіть кнопку на вашій активності і назвіть її "Вибрати фон" (для цього треба у файлі strings створити рядок відповідного змісту). Присвойте активності і кнопці id.
android:id="@ id/relativelayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="174dp"
android:text="@string/bg"/>
Лістинг 8.5. Код файлу activity _ main.xml
3. Наше застосування міняє фон на вибраний. Значить, нам треба створити кольори і їх назви у файлі strings.xml. Як ви пам'ятаєте, цей файл знаходиться в теці values, яка у свою чергу знаходиться в теці res. Також створимо рядок messages, яка нам знадобляться для діалогового вікна.
Dialog
Settings
Выбрать фон
Хотите поменять фон?
#FFFF0000
#FFFF00
#FF00FF00
Красный
Жёлтый
Зелёный
Лістинг 8.6. Файл strings.xml
4. Перейдемо у файл MainActivity.java. Створіть наступні змінні:
private Button bgButton;
public RelativeLayout relativeLayout;
Context context;
Якщо компілятор підкреслює тип і повідомляє про помилку, наприклад, підкреслює Context, наведіть курсор на підкреслене слово: повинне з'явитися контекстне меню, що пропонує варіанти, як можна виправити помилку. Виберете Import 'Context', щоб імпортувати бібліотеку.
5. Тепер треба описати, що відбуватиметься при натисненні на нашу кнопку.
Спершу зв'яжемо об'єкти з activity _ main.xml і змінні в MainActivity.java через id (у onCreate) :
bgButton = (Button) findViewById (R.id.background _ button);
Context - це об'єкт, який надає доступ до базових функцій додатка.
Додаємо в код
context = MainActivity.this;
6. Тепер треба додати подію onClick і навісити на кнопку OnClickListener. Додаємо в заголовок класу MainActivity implements OnClickListener. Щоб зв'язати кнопку і Listener в onCreate пишемо
bgButton.setOnClickListener (this);
Створимо тепер подію onClick
@Override
public void onClick (View v){
}
У цьому об'єкті створюємо власне діалог і називаємо його:
AlertDialog.Builder builder = new AlertDialog.Builder (this);
builder.setTitle (R.string.message);
AlertDialog alert = builder.create ();
alert.show ();
Ми створюватимемо діалогове вікно, що надає користувачеві вибір зі списку. Для цього знадобиться ще одна змінна, яка сформує список з наявних рядків.
final CharSequence[] items ={
};
7. Сформуємо власне наш список і задамо ще один Listener, який мінятиме колір фону на вибраний:
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
switch (item) {
case 0: { relativeLayout.setBackgroundResource(R.color.redColor);
break;}
case 1: {relativeLayout.setBackgroundResource(R.color.yellowColor);
break;}
case 2: {relativeLayout.setBackgroundResource(R.color.greenColor);
Рисунок 4.3 - Додаток "Dialog", запущений на емуляторі
Рисунок 4.4 - Діалогове вікно
Рисунок 4.5 - Вибраний зелений фон
Рисунок 4.6 - Додаток "Dialog", запущений на пристрої
4.4 Створення додатка із слайдингом з шаблону
1. Створіть проект TabsAndSwipe. Зверніть увагу: щоб використати стандартний шаблон активності Fixed Tabs Swipe, вам необхідно при створенні проекту вказати Minimum Required SDK не менше, ніж API11, оскільки у більше ранніх версіях цей шаблон не підтримується.
Рисунок 4.7 - Створення додатка TabsAndSwipe
Наступні три вікна залишаємо без змін.
Далі у вікні Blank Activity вибираємо в графу Navigation Type.
Рисунок 4.8 - Вибір шаблону Navigation Type
2. Подивіться на структуру проекту : у вас з'явилися два xml- файлу в теці res\layout - activity _ main.xml і fragment _ main _ dummy.xml.
3. Запустіть додаток, щоб переконатися, що все компілюється правильно.
4. Створіть три копії файлу fragment _ main _ dummy.xml. Назвіть їх відповідно first _ tab, second _ tab і third _ tab. Присвойте елементу TextView в кожному файлі унікальний id. Можете помістити на екрани які-набудь елементи, наприклад картинки або написи.
5. Тепер переходимо до файлу MainActivity.java. Нас цікавить клас
public static class DummySectionFragment extends Fragment
Робимо три копії цього класу з усім вмістом, називаючи їх відповідно до FirstActivity, SecondActivity, ThirdActivity.
Замініть R.layout.fragment _ main _ dummy на R.layout.first і R.id.section _ label на R.id.section _ label1 відповідно.
7. Поміняйте рядки-назви секцій у файлі strings.xml.
Стрічка
Фото
Карта 8. Тепер переходимо до класу SectionsPagerAdapter (). Нас цікавить його метод Fragment getItem (), саме його ми змінюватимемо. Щоб при перегортанні мінявся не лише вміст TextView, але і увесь фрагмент, заміните код цього методу на наступний:
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a DummySectionFragment (defined as a static inner class
// below) with the page number as its lone argument.
Fragment fragment=null;
Bundle args;
switch (position) {
case 0:
fragment = new FirstFragment();
args = new Bundle();
args.putInt(FirstFragment.ARG_SECTION_NUMBER, position 1);
fragment.setArguments(args);
break;
case 1:
fragment = new SecondFragment();
args = new Bundle();
args.putInt(SecondFragment.ARG_SECTION_NUMBER, position 1);
fragment.setArguments(args);
break;
case 2:
fragment = new ThirdFragment();
args = new Bundle();
args.putInt(ThirdFragment.ARG_SECTION_NUMBER, position 1);
Рисунок 4.9 - Додаток TabsAndSwipe, запущений на пристрої
Завдання для самостійного виконання
Подумайте над власним застосуванням, що поєднує різні можливості проектування багатовіконних застосувань, розглянуті вище. Створіть прототип цього застосування і настройте його призначений для користувача інтерфейс.
Лабораторна робота 5
Демонстрації розпізнавання стандартних жестів Мета лабораторної роботи
Розробити прості застосування для демонстрації розпізнавання стандартних жестів.
5.1 Вступ
Роботу із стандартними жестами Android надає клас GestureDetector. Цей клас містить двох вкладених інтерфейс-слухачів: OnGestureListener і OnDoubleTapListener, ці інтерфейси задають методи, що відстежують стандартні жести. А також GestureDetector містить вкладений клас SimpleOnGestureListener, який містить порожні реалізації, що повертають значення false, де це необхідно, усіх методів інтерфейсів : OnGestureListener і OnDoubleTapListener.
У лабораторній роботі розглянемо дві можливості розпізнавання жестів :
- випадок розпізнавання усіх підтримуваних жестів, для цього реалізуємо в класі активності обидва інтерфейси;
- випадок розпізнавання тільки деякого набору підтримуваних жестів, для цього в класі активності оголосимо внутрішній клас-спадкоємець класу GestureDetector.SimpleOnGestureListener.
5.2 Розпізнавання усіх підтримуваних жестів
Розробимо додаток, в якому продемонструємо розпізнавання усіх підтримуваних жестів. Додаток містить одну активність, одно інформаційне поле для висновку інформації про розпізнаний жест. Додаток працює таким чином: користувач виконує один з підтримуваних сенсорних жестів, в інформаційному полі відображається інформація про розпізнаний жест.
1. Створимо просте застосування і додамо на форму TextView для виведення інформації.
2. Настроїмо логіку додатка. У java-клас, що відповідає активності внесемо наступні доповнення:
o Клас активності повинен реалізовувати інтерфейси: GestureDetector.OnGestureListener і GestureDetector.OnDoubleTapListener, для цього в оголошення класу додамо конструкцію:
implements GestureDetector.
Оголошення - це короткі текстові повідомлення, котрі містять різну за призначенням інформацію. Переважно оголошення містять інформацію приватного рекламного характеру. Це пропозиція певних товарів чи послуг приватними особами, або малими приватними підприємствами.
OnGestureListener
GestureDetector.OnDoubleTapListener
o Нам знадобиться екземпляр класу GestureDetectorCompat тому в якості поля класу активності оголосимо наступну змінну:
GestureDetectorCompat mDetector;
У методі onCreate () класу активності, створимо екземпляр класу GestureDetectorCompat і присвоїмо його змінній mDetector :
mDetector = new GestureDetectorCompat (this, this);
одним з параметрів конструктора є клас, який реалізує інтерфейс GestureDetector.OnGestureListener, в нашому випадку використано слово this, тобто, параметром є сам клас активності. Цей інтерфейс повідомляє користувачів коли з'являється певна сенсорна подія.
У методі OnCreate () класу активності, наступний рядок:
mDetector.setOnDoubleTapListener (this);
встановлює слухач подій, пов'язаних з подвійним торканням, це має бути клас, що реалізовує інтерфейс GestureDetector.OnDoubleTapListener. У нашому випадку використано слово this, тобто слухачем буде знову сам клас активності.
1. Щоб дозволити вашому об'єкту GestureDetector отримувати події, необхідно перевизначити метод onTouchEvent () для активності або елементу GUI. І передавати в екземпляр детектора усі виявлені події.
2.
3. public boolean onTouchEvent (MotionEvent event){
4. this.mDetector.onTouchEvent (event);
5. // Be sure to call the superclass implementation
6. return super.onTouchEvent (event);
7. }
8. Після проведеної підготовки прийшов час реалізувати усі методи, оголошені в інтерфейсах, що відповідають за прослуховування сенсорних подій.
Методи інтерфейсу GestureDetector.OnGestureListener:
onDown ()
відстежує появу торкання, тобто палець притиснутий до екрану;
onFling ()
відстежує появу жесту змахування;
onLongPress ()
відстежує утримування пальця притиснутим до екрану тривалий час;
onScroll ()
відстежує появу жесту прокрутки (перегортування);
onShowPress ()
відстежує, що сталася подія торкання і більше ніяких подій не відбувається короткий час;
У лістингу 10.1 представлений код додатка, в якому розпізнаються усі підтримувані жести, інформація про жест, що з'явився і розпізнаному, видається в інформаційне поле (TextView).
В якості практики пропонується відтворити це застосування і перевірити, як система розпізнає той або інший жест. Дуже корисно для розуміння, як виконуються основні жести.
5.3 Розпізнавання тільки частини підтримуваних жестів
Розробимо додаток, в якому продемонструємо розпізнавання тільки деякої частини підтримуваних жестів по вибору програміста. Ми розглянемо розпізнавання жесту змахування (fling). Додаток містить одну активність, одно інформаційне поле для висновку інформації про розпізнаний жест. Додаток працює таким чином: користувач виконує один з підтримуваних сенсорних жестів, в інформаційному полі відображається інформація про розпізнаний жест.
1. Створимо просте застосування і додамо на форму TextView для виведення інформації.
2. Настроїмо логіку додатка. У java-клас, що відповідає активності внесемо наступні доповнення.
Нам знадобиться екземпляр класу GestureDetectorCompat тому в якості поля класу активності оголосимо наступну змінну:
GestureDetectorCompat mDetector;
У методі onCreate () класу активності, створимо екземпляр класу GestureDetectorCompat і присвоїмо його змінній mDetector :
mDetector=new GestureDetectorCompat (this, new MyGestListener());
у конструкторі аргументом, що відповідає за відстежування сенсорних подій, служить екземпляр класу MyGestListener () - внутрішній клас, який є спадкоємцем класу GestureDetector.SimpleOnGestureListener.
Має сенс трохи розглянути клас GestureDetector.SimpleOnGestureListener. Цей клас реалізує інтерфейси GestureDetector.OnGestureListener і GestureDetector.OnDoubleTapListener, усі методи заявлені в інтерфейсах в цьому класі мають порожню реалізацію і ті, які повинні повертати значення, повертають false. Тому для розпізнавання якоїсь події або деякої підмножини подій досить написати реалізацію відповідних методів, в класі спадкоємцеві.
У лістингу 10.2 представлений код додатка, в якому розпізнається тільки жест змахування, тобто реалізований метод onFling (), інформація про жест, що з'явився і розпізнаному, видається в інформаційне поле (TextView). Як слухач використовується екземпляр класу MyGestListener (), що є спадкоємцем класу GestureDetector.SimpleOnGestureListener.
Отримати більше інформації про розпізнавання жестів можна по посиланню: http://developer.android.com/training/gestures/index.html