Upload
evgeny-kaziak
View
2.430
Download
3
Embed Size (px)
DESCRIPTION
Citation preview
Первый опыт: Android SDK
Paul Malikovhttp://about.me/vokilam
содержание
• жизненный цикл Activity
• странности особенности процесса разработки
• полезная литература
•жизненный цикл
Act
ivity
запуск Activity// start activity from ListingsActivity
Intent i = new Intent(ListingActivity.this, WebActivity.class);i.putExtra("url", v.getRestaurantUrl());i.putExtra("crmid", v.getVenueCRMID());startActivity(i);
// process intent extras from WebActivityBundle b = getIntent().getExtras();String url;
if (b != null) { url = b.getString("url"); mCRMID = b.getString("crmid");}
android manifest<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.menulog.m"> <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true"> <activity android:name=".HomeActivity" android:label="@string/app_name" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".ListingActivity" android:label="@string/app_name" android:screenOrientation="portrait">
android manifest<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.menulog.m"> <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true"> <activity android:name=".HomeActivity" android:label="@string/app_name" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".ListingActivity" android:label="@string/app_name" android:screenOrientation="portrait">
Application does not have the attribute 'debuggable' set to TRUE in its manifest and cannot be debugged.
android manifest<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.menulog.m"> <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true"> <activity android:name=".HomeActivity" android:label="@string/app_name" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".ListingActivity" android:label="@string/app_name" android:screenOrientation="portrait">
Application does not have the attribute 'debuggable' set to TRUE in its manifest and cannot be debugged.
android manifest <activity
android:name=".ListingActivity" android:label="@string/app_name" android:screenOrientation="portrait"> </activity> <activity android:name=".MapViewActivity" android:label="@string/app_name" android:screenOrientation="portrait"/> <uses-library android:name="com.google.android.maps" /> </application> <uses-sdk android:maxSdkVersion="8" android:minSdkVersion="7" android:targetSdkVersion="7"></uses-sdk> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/></manifest>
android manifest <activity
android:name=".ListingActivity" android:label="@string/app_name" android:screenOrientation="portrait"> </activity> <activity android:name=".MapViewActivity" android:label="@string/app_name" android:screenOrientation="portrait"/> <uses-library android:name="com.google.android.maps" /> </application> <uses-sdk android:maxSdkVersion="8" android:minSdkVersion="7" android:targetSdkVersion="7"></uses-sdk> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/></manifest>
android manifest <activity
android:name=".ListingActivity" android:label="@string/app_name" android:screenOrientation="portrait"> </activity> <activity android:name=".MapViewActivity" android:label="@string/app_name" android:screenOrientation="portrait"/> <uses-library android:name="com.google.android.maps" /> </application> <uses-sdk android:maxSdkVersion="8" android:minSdkVersion="7" android:targetSdkVersion="7"></uses-sdk> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/></manifest>
android manifest <activity
android:name=".ListingActivity" android:label="@string/app_name" android:screenOrientation="portrait"> </activity> <activity android:name=".MapViewActivity" android:label="@string/app_name" android:screenOrientation="portrait"/> <uses-library android:name="com.google.android.maps" /> </application> <uses-sdk android:maxSdkVersion="8" android:minSdkVersion="7" android:targetSdkVersion="7"></uses-sdk> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/></manifest>
android manifest <activity
android:name=".ListingActivity" android:label="@string/app_name" android:screenOrientation="portrait"> </activity> <activity android:name=".MapViewActivity" android:label="@string/app_name" android:screenOrientation="portrait"/> <uses-library android:name="com.google.android.maps" /> </application> <uses-sdk android:maxSdkVersion="8" android:minSdkVersion="7" android:targetSdkVersion="7"></uses-sdk> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/></manifest>
android manifest
• не забывайте добавлять тег <activity /> при создании нового класса Activity
• не забывайте указывать разрешения <uses-permission /> для вашего приложения
• будьте внимательны
layouts<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /></LinearLayout>
layouts
• FrameLayout
• LinearLayout
• RelativeLayout
• TableLayout
layouts
• не забывайте определять атрибуты layout_width, layout_height или использовать стили
• не используйте AbsoluteLayout
• используйте dp (density pixels) и sp (scalable pixels) вместо px
9-patch imagesStretchable area
Padding box (optional)
9-patch imageswith padding box
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/button_bg" android:text="hello, cruel world!" android:gravity="right" />
9-patch imageswith padding box
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/button_bg" android:text="hello, cruel world!" android:gravity="right" />
9-patch imageswith padding box
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/button_bg" android:text="hello, cruel world!" android:gravity="right" />
9-patch imageswith padding box
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/button_bg" android:text="hello, cruel world!" android:gravity="right" />
9-patch imageswith padding box
9-patch imageswithout padding box
9-patch imageswithout padding box
9-patch imageswithout padding box
android:padding="0dp"
9-patch imageswithout padding box
android:padding="0dp"
9-patch images
• информация 9-patch располагается на однопиксельной белой (#FFFF) или прозрачной (#FFF0) рамке в виде рядов черных (#000F) пикселей
• при масштабировании такого изображения редактор может сглаживать границы - появление серых пикселей
• ./tools/draw9patch неудобный
9-patch images
• информация 9-patch располагается на однопиксельной белой (#FFFF) или прозрачной (#FFF0) рамке в виде рядов черных (#000F) пикселей
• при масштабировании такого изображения редактор может сглаживать границы - появление серых пикселей
• ./tools/draw9patch неудобный
android:padding="0dp"
google maps• для нормальной работы необходим Maps API key
• для этого нужно получить MD5 Fingerprint сертификата вашего приложения
• и зарегистрировать MD5 Fingerprint в Google Maps Service
• указать ключ при создании карты
mMapView = new MapView(this, "example_Maps_ApiKey_String");
слои google maps
• OverlayItem (точка)
• ItemizedOverlay (массив точек)
• Ваш собственный (extends Overlay)
• Координаты задаются в формате
(int) degree * 1e6
soft keyboard
• программный вызов работает в одном Activity и не работает в другом (?)
InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); mgr.showSoftInput(mSearchField, InputMethodManager.SHOW_IMPLICIT);
• как узнать, что пользователь свернул клавиатуру?
dialogs & menus• программное управление multiple choice dialog (?)
• AlertDialog.Builder удобноbuilder.setTitle(R.string.choose_country);
builder.setSingleChoiceItems( countryNames, index, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { } }); dialog = builder.create();
dialogs & menus• диалоги и меню кэшируются системой. чтобы внести изменения в существующие объекты, используются
onPrepareDilaog() onPrepareOptionsMenu()
• видимость диалога управляется методами Activity
showDialog(int id) dismissDialog(int id) removeDialog(int id)
ресурсы
• мощный инструмент выбора ресурсов основывается на различных критериях
• используется для локализации, поддержки ориентации дисплея, поддержки разных форматов дисплеев, клавиатуры
ресурсы
• drawable-mcc257-mnc02
• values-ru
• values-ru-ldpi-qwerty-v7
• layout-port
• menu-car-notnight
ресурсы• критерии должны разделяться символом ‘-’ и следовать в порядке убывания приоритета (приоритеты описаны в DevGuide)
• только одно значение критерия допускается в названии: values-ru-en => values-ru, values-en
• обращайте внимание на именование файлов, в частности для изображений: res/drawable-mdpi/Untitled6.9.png: Invalid file name: must contain only [a-z0-9_.]
логи• Log.v(String, String) verbose debug info warn error
• ToastToast.makeText(getApplicationContext(), R.string.msg, Toast.LENGTH_LONG).show();
emulator
• можно собрать устройство с любой конфигурацией
• медленный• отсутствуют настройки и описание горячих клавиш
• Ctrl + F12 переключиться в landscape режим
emulator
• устройства с hdpi дисплеем могут не помещаться на экран
• масштаб эмулятора задается через AVD Manager
emulator
• устройства с hdpi дисплеем могут не помещаться на экран
• масштаб эмулятора задается через AVD Manager
emulator
• устройства с hdpi дисплеем могут не помещаться на экран
• масштаб эмулятора задается через AVD Manager
литература• http://developer.android.com (DevGuide,
Resources, Reference, Videos)
• Professoinal Android 2 Application Development ISBN-13: 978-0-470-56552-0
• Google I/O Moblile Sessions
• Thinking In Java, 4th Edition ISBN 0-13-187248-6
• Effective Java, 2nd Edition ISBN-13: 978-0-321-35668-0, ISBN-10: 0-321-35668-3