Главная страница
Образовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей

Программирование под Android. Для профессионалов


Скачать 19.35 Mb.
НазваниеПрограммирование под Android. Для профессионалов
АнкорBrayn_Khardi_Bill_Fillips_-_Programmirovanie_po.
Дата23.05.2017
Размер19.35 Mb.
Формат файлаpdf
Имя файлаBrayn_Khardi_Bill_Fillips_-_Programmirovanie_po.pdf
ТипДокументы
#21061
страница29 из 55Образовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей
Образовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей

С этим файлом связано 55 файл(ов). Среди них: Khant_K_TCP_IP_Setevoe_administrirovanie_3-e_izdanie_1988.pdf, vk_gettoken, Adams_Rob_-_Khoroshiy_uvesisty_pinok_pod_zad.pdf, vk_gettoken и ещё 45 файл(а).
Показать все связанные файлы
1   ...   25   26   27   28   29   30   31   32   ...   55
Глава 18. Контекстные меню и режим контекстных действий версию в случае ее доступности или ее имитацию при необходимости. Библиотека доступна по адресу https://www.actionbarsherlock.com. Библиотека также предостав- ляет совместимые версии новых тем Android, включающих панель действий.
Если из этого описания вам показалось, что ABS представляет собой библиотеку поддержки с расширенной функциональностью, вы правы. Однако в отличие от библиотеки поддержки, ABS предоставляет темы и идентификаторы ресурсов. Это означает, что вместо простого jar
-файла ABS распространяется в формате проекта библиотеки Android. Проект библиотеки напоминает обычный проект Android, но вместо независимого приложения он строит библиотеку, которая используется другими приложениями. Это позволяет Android включать в построение любые до- полнительные ресурсы Android, предоставляемые библиотекой. Любая библиотека, предоставляющая дополнительные ресурсы Android, должна быть оформлена в виде проекта библиотеки, а не в виде jar
-файла.
Поскольку ABS представляет собой проект библиотеки, для интеграции ABS в ваш проект необходимо:

загрузить и распаковать исходный код;

импортировать исходный код в проект Eclipse с именем ActionBarSherlock;

добавить ссылку на новый проект ActionBarSherlock в CriminalIntent;

обновить CriminalIntent для использования классов поддержки
ActionBarSher- lock
(Если вы захотите выполнить эту короткую инструкцию по интеграции
Action-
BarSherlock
, сначала создайте копию CriminalIntent. Наличие экземпляра Crim- inalIntent без кода ABS упростит чтение остальных глав).
Рис. 18.6. Создание проекта Android на базе существующего кода

Для любознательных: ActionBarSherlock
309
Чтобы загрузить ABS, откройте страницу https://www.actionbarsherlock.com/download.
html
, щелкните на ссылке загрузки архива в формате zip или tgz
(выбирайте любой) и распакуйте загруженный архив.
Затем, чтобы создать новый проект в Eclipse, щелкните правой кнопкой мыши на панели
Package
Explorer и выберите команду
New

Project....
Вместо нового проекта Android нужно создать проект, включающий загруженный исходный код; выберите команду
Android
Project
From
Existing
Code
(рис. 18.6).
В этом диалоговом окне вам будет предложено выбрать корневой каталог для поиска существующего кода. Щелкните на кнопке
Browse…
и перейдите в каталог, в который была загружена библиотека ABS. При распаковке файла были созданы три вложенные папки: library
, samples и website
. Выберите library
, щелкните на кнопке
Open
, затем на кнопке
Finish
Рис. 18.7. Выбор папки с библиотекой ABS
При создании вашего проекта Eclipse присваивает ему имя library
— не самое со- держательное; щелкните правой кнопкой мыши, выберите команду
Refactor

Rename...
и введите имя проекта
ActionBarSherlock
Остается сделать последний шаг — добавить ссылку на про- ект библиотеки в CriminalIntent.
Щелкните правой кнопкой мыши на строке
CriminalIntent на панели
Package
Explorer и выбери- те команду
Proper ties...
Выберите
Android и взгляните на нижнюю часть окна, которая должна вы- глядеть примерно так.
Рис. 18.8. Ссылки на библиотеки Android

310
Глава 18. Контекстные меню и режим контекстных действий
В этом разделе перечисляются ссылки на проекты библиотек Android. Пока ни одной ссылки нет, а список пуст. Щелкните на кнопке
Add…
Рис. 18.9. Добавление ссылки на ActionBarSherlock
Наконец, сделайте двойной щелчок на строке
ActionBarSherlock
, чтобы добавить ссылку на проект библиотеки.
Упражнение. Использование ActionBarSherlock
Теперь, после добавления ссылки на проект
ActionBarSherlock
, все готово к его интеграции в CriminalIntent. Библиотека ABS работает по тому же принципу, что и библиотека поддержки — она предоставляет альтернативные версии таких осно- вополагающих классов Android, как
Activity
,
Fragment и
ActionBar
. Многие (но не все) имена классов ABS начинаются с префикса
Sherlock
, чтобы их было проще отличить от классов библиотеки поддержки.
Становится примерно понятно, что вам предстоит сделать. Классы фрагментов и активностей имеют префикс
Sherlock
-, но у классов меню этого префикса нет.
Базовая интеграция ABS в CriminalIntent
Последовательность действий по базовой интеграции ABS в проект:

Измените объявления классов
SingleFragmentActivity и
CrimePagerActiv- ity так, чтобы они были производными от
SherlockFragmentActivity
(вместо
FragmentActivity
).

Измените все объявления классов фрагментов так, чтобы они были производ- ными от
SherlockFragment
,
SherlockDialogFragment или
SherlockListFragment
(вместо версий этих классов из библиотеки поддержки).

Замените ссылки на
Menu
,
MenuItem и
MenuInflater ссылками на соответствую- щие реализации из com.actionbarsherlock.view
Первые два шага просты — вы просто изменяете имена суперклассов. Когда это будет сделано, в
CrimeFragment и
CrimeListFragment появятся многочисленные

Интеграция еще более высокого уровня
311
ошибки. Чтобы избавиться от них, необходимо выполнить третий шаг, который сложнее двух предыдущих.
Для
CrimeFragment проблема решается просто: удалите относящиеся к меню дирек- тивы import в начале файла, проведите организацию импорта комбинацией клавиш
Command+Shift+O
/
Ctrl+Shift+O
и выберите версии com.actionbarsherlock.view
Однако если вы попытаетесь проделать то же самое с
CrimeListFragment
, возник- нут проблемы. Дело в том, что
CrimeListFragment использует контекстные меню и
MultiChoiceModeListener
, для которых необходимы оригинальные версии классов меню из библиотеки Android.
Что делать? Вместо обходного решения с организацией импорта придется полностью уточнить ссылки на типы
MenuItem
,
Menu и
MenuInflater в onCreateOptionsMenu(…)
и onOptionsItemSelected(…)
. Возьмем для примера следующий код:
@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
}
Его необходимо записать в таком виде:
@Override public void onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu,
com.actionbarsherlock.view.MenuInflater inflater) {
}
Интеграция более высокого уровня
Если вы выполнили первое упражнение, значит, вы интегрировали ABS в свой проект. Однако для полноценного использования библиотеки необходимо изба- виться от кода совместимости. Для этого вызовите в коде getSherlockActivity().
getSupportActionBar()
вместо getActivity().getActionBar()
. Панель действий
SherlockActivity доступна всегда, поэтому ее использование позволит обойтись без кода защитной проверки. После этого можно переместить файл res/menu-v11/
fragment_crime_list.xml в res/menu
, чтобы избавиться от переключения версий ОС на уровне конфигурации.
Интеграция еще более высокого уровня
Ищете приключений? Следующим шагом на пути к идентичному поведению
CriminalIntent в разных версиях является отказ от использования
MultiChoic- eModeListener и контекстных меню. Удалить код контекстного меню несложно, но для замены
MultiChoiceModeListener потребуется имитация функциональности.
Как это сделать? Прежде всего можно использовать классический режим выбора
ListView
:
ListView.CHOICE_MODE_MULTIPLE
. В этой главе мы использовали режим
ListView.CHOICE_MODE_MULTIPLE_MODAL
, который работает только в новых версиях

312
Глава 18. Контекстные меню и режим контекстных действий
Android. Режим
ListView.CHOICE_MODE_MULTIPLE
не поддерживает современное по- ведение модальных долгих нажатий, но у него есть свое преимущество: он работает во всех версиях Android. Выбор режима выделения
ListView.CHOICE_MODE_MULTIPLE
для
ListView позволит выделять несколько элементов списка. Чтобы запретить выделение, верните значение
ListView.CHOICE_MODE_NONE
Следующим шагом должна стать имитация модального поведения панели дей- ствий, реализованного
CHOICE_MODE_MULTIPLE_MODAL
. Чтобы сделать это способом, универсальным для всех версий, следует вызвать getSherlockActivity().startAc- tionMode()
. Будьте внимательны и используйте версию, получающую com.action- barsherlock.view.ActionMode.Callback
, а не обычную версию Android.
Наконец, необходимо организовать обнаружение долгих нажатий. Для это- го можно передать слушателя
OnItemLongClickListener при вызове
ListView.
setOnItemLongClickListener(…)

Камера I: Viewfinder
К описанию места преступления полезно приложить фотографию. В следующих двух главах мы добавим в приложение возможность создания снимков через API камеры.
API камеры при всей своей мощности не отличаются компактностью или просто- той. Вам придется вводить большой объем кода, а время от времени — сражаться с достаточно сложными концепциями, что может показаться перебором. Пожалуй, кто-то подумает: «Мне нужно сделать простую фотографию. Неужели для этого нет стандартного интерфейса?»
Есть. С камерой можно взаимодействовать через неявный интент. На большин- стве устройств Android установлено приложение для работы с камерой, которое прослушивает интент, созданный с кодом
MediaStore.ACTION_IMAGE_CAPTURE
. Вы научитесь работать с неявными интентами в главе 21.
К сожалению, на момент написания книги в интерфейсе неявных интентов присут- ствовала ошибка, из-за которой на многих устройствах сохранение полноразмерной фотографии становилось невозможным. Если приложению достаточно миниатюр, неявные интенты работают хорошо. Однако приложению CriminalIntent необхо- димы более крупные фотографии, поэтому вам придется осваивать API камеры.
В этой главе мы создадим активность на основе фрагмента, а также используем класс
SurfaceView и камеру для вывода «живого» предварительного изображения с камеры.
19

314
Глава 19. Камера I: Viewfinder
Рис. 19.1. Предварительное изображение с камеры
На рис. 19.2 изображены новые объекты, которые будут созданы в приложении.
Представление
Модель
Контроллер запускает
Рис. 19.2. Диаграмма объектов для работы с камерой в CriminalIntent
Экземпляр
Camera предоставляет доступ к камере устройства на аппаратном уров- не. Камера относится к ресурсам монопольного доступа; только одна активность может обращаться к камере.

Создание макета фрагмента
315
Экземпляр
SurfaceView будет выполнять функции видоискателя.
SurfaceView
— специальное представление для отображения контента прямо на экране.
Начнем с создания макета для представления
CrimeCameraFragment
, самого класса
CrimeCameraFragment и класса
CrimeCameraActivity
. Затем мы организуем создание и управление видоискателем в
CrimeCameraFragment
. Наконец, в
CrimeFragment будет включена поддержка запуска экземпляра
CrimeCameraActivity
Создание макета фрагмента
Создайте новый файл
Android
XML
Layout с именем fragment_crime_camera.xml и назначьте его корневым элементом
FrameLayout
. Добавьте виджеты, изображенные на рис. 19.3.
Рис. 19.3. Макет CrimeCameraFragment (fragment_crime_camera.xml)
В файле макета единственным потомком
FrameLayout является виджет
LinearLay- out
, из-за чего выводится предупреждение о бесполезности
LinearLayout
. Пока не обращайте внимания; мы назначим
FrameLayout второе дочернее представление в главе 20.
В элементе
LinearLayout для размещения дочерних представлений используется комбинация атрибутов layout_width и layout_weight
. Место, необходимое для виджета
Button
, выделяется из-за наличия атрибута android:layout_width="wrap_
content"
, а
SurfaceView не достается ничего (
android:layout_width="0dp"
). При распределении оставшегося пространства только виджет
SurfaceView имеет атрибут layout_weight
, поэтому все оставшееся пространство достается
SurfaceView
На рис. 19.4 показано, как выглядит этот макет.

316
Глава 19. Камера I: Viewfinder
Рис. 19.4. Область предварительного просмотра и кнопка
В файле strings.xml добавьте строковый ресурс для текста кнопки.
Листинг 19.1. Добавление строки для кнопки камеры (strings.xml)
Show Subtitle
Sometimes tolerance is not a virtue.
Take!

Создание класса CrimeCameraFragment
Создайте новый класс с именем
CrimeCameraFragment и назначьте его суперклассом android.support.v4.app.Fragment
. В файле
CrimeCameraFragment.java добавьте новые поля, приведенные в листинге 19.2. Переопределите метод onCreateView(…)
так, чтобы он заполнял макет и получал ссылки на виджеты. Пока назначьте кнопке слушателя, который просто завершает активность-хоста; при этом пользователь возвращается к предыдущему экрану.
Листинг 19.2. Исходный фрагмент камеры (CrimeCameraFragment.java)
public class CrimeCameraFragment extends Fragment {
private static final String TAG = "CrimeCameraFragment";
private Camera mCamera;
private SurfaceView mSurfaceView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_crime_camera, parent, false);
Button takePictureButton = (Button)v
.findViewById(R.id.crime_camera_takePictureButton);

Включение активности и разрешений камеры в манифест
317
takePictureButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
getActivity().finish();
}
});
mSurfaceView = (SurfaceView)v.findViewById(R.id.crime_camera_surfaceView);
return v;
}
}
Создание класса CrimeCameraActivity
Создайте новый субкласс
SingleFragmentActivity с именем
CrimeCameraActivity
Переопределите метод createFragment()
, чтобы он возвращал новый экземпляр
CrimeCameraFragment
Листинг 19.3. Создание активности камеры (CrimeCameraActivity.java)
public class CrimeCameraActivity extends SingleFragmentActivity {
@Override
protected Fragment createFragment() {
return new CrimeCameraFragment();
}
}
Включение активности и разрешений камеры
в манифест
На следующем шаге следует объявить
CrimeCameraActivity в манифесте. Кроме того, следует запросить для приложения право на использование камеры, добавив в манифест элемент uses-permission
Внесите в файл
AndroidManifest.xml изменения, представленные в листинге 19.4.
Листинг 19.4. Добавление разрешений и активности камеры в манифест (AndroidManifest.xml)

package="com.bignerdranch.android.criminalintent"
android:versionCode="1"
android:versionName="1.0" >



продолжение


318
Глава 19. Камера I: Viewfinder
Листинг 19.4 (продолжение)

android:screenOrientation="landscape"
android:label="@string/app_name">



Элемент uses-feature сообщает, что вашему приложению необходима указанная функция устройства. Значение android.hardware.camera гарантирует, что когда ваше приложение появится в Google Play, оно будет предлагаться только для устройств, оснащенных камерой.
Обратите внимание на то, что в объявлении активности мы принудительно за- ставляем активность использовать альбомный режим при помощи атрибута android:screenOrientation
. Тем самым предотвращается изменение интерфейса активности в то время, как пользователь пытается подобрать правильный угол для снимка.
У атрибута screenOrientation неожиданно много возможных значений. Напри- мер, можно назначить активности такую же ориентацию, как у ее родителя, или выбрать альбомную ориентацию в любом направлении в зависимости от аппа- ратного датчика. За дополнительной информацией обращайтесь к документации элемента

Использование API камеры
До настоящего момента мы занимались подготовительным созданием активностей.
Пришло время заняться концепциями и классами, относящимися непосредственно к камере.
Открытие и освобождение камеры
Начнем с управления ресурсом камеры. Мы предоставили
CrimeCameraFragment экземпляр
Camera
. Камера является важным общесистемным ресурсом, поэтому очень важно получать ее только тогда, когда она нужна, и освобождать сразу же после завершения работы. В противном случае камера окажется недоступной для других устройств до перезагрузки устройства.
Для управления камерой используются следующие методы класса
Camera
:
public static Camera open(int cameraId)
public static Camera open()
public final void release()
Метод open(int)
появился в API уровня 9, а в API уровня 8 используется метод open()
без параметров.
Методы обратного вызова точек жизненного цикла
CrimeCameraFragment
, в которых происходит открытие и освобождение камеры, называются onResume()
и onPause()

Использование API камеры
319
Эти два метода обозначают границы, в пределах которых пользователь может взаимодействовать с представлением камеры. (Обратите внимание: onResume()
вызывается тогда, когда фрагмент впервые появляется на экране.)
В методе
CrimeCameraFragment.onResume()
мы инициализируем камеру статическим методом
Camera.open(int)
и передаем 0, чтобы открыть первую камеру, доступную на устройстве. Обычно это камера на задней панели, но если она отсутствует на устройстве (как, например, на Nexus 7), открывается камера на передней панели.
В API уровня 8 вызывается метод
Camera.open()
без параметров. Чтобы защитить свой код для Froyo, проверьте версию устройства и вызовите
Camera.open()
в API уровня 8.
Листинг 19.5. Открытие камеры в методе onResume() (CrimeCameraFragment.java)
@TargetApi(9)
@Override public void onResume() {
super.onResume();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
mCamera = Camera.open(0);
} else {
mCamera = Camera.open();
}
}
(Android Lint может выдать предупреждения относительно открытия камеры в главном потоке. Эти предупреждения обоснованы, но мы не будем обращать на них внимания, пока не познакомимся поближе с многопоточностью в главе 26.)
Когда фрагмент уходит с экрана, следует освободить ресурс камеры, чтобы он стал доступным для других приложений. Соблюдайте правила хорошего тона и пере- определите метод onPause()
для освобождения камеры.
Листинг 19.6. Реализация методов жизненного цикла (CrimeCameraFragment.java)
public void onResume() {
super.onResume();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { mCamera = Camera.open(0);
} else {
mCamera = Camera.open();
}
}
@Override
public void onPause() {
super.onPause();
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
Обратите внимание на проверку наличия экземпляра камеры перед вызовом release()
. Всегда используйте ее перед выполнением кода камеры. Хотя вы выдали

320
1   ...   25   26   27   28   29   30   31   32   ...   55
Образовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей