Professional Documents
Culture Documents
Android Very Simple Book
Android Very Simple Book
) (2010 /
) (2011 /
)(Java SE
)(Android SDK
)(Eclipse
)(ADT
)(Eclipse
)(Android
) (
) (
) (Mash up ) (
)(2009
) (4 )(2010
.
.
.
4
) (
) (iPhone/iPad )(Android
) (Windows Mobile )(Blackberry
www.badwi.com :
badwisoft@gmail.com :
00966503415343 :
http://twitter.com/badwi :
http://www.facebook.com/badwi :
) (
..Data Mining
)(.
wael.alalwani@gmail.com :
http://twitter.com/waelalwani :
) (2005
) .(2007
) (Open Handset Alliance) (OHA
) (48
. ) (2008
) (HTC
) (Android ) (2009
) (T-Mobile
) (HTC )( .
) Linux 2.6
(kernel ) (GNU/Linux
) (native windowing system ) glibc
(support ) (GNU/Linux
) (security ) memory
(management ) process
(management ) network
(stack ) (driver model
). (abstraction layer
)( ) (Java ) (Managed Code
6
) (Java ) Java5
(SE ) (JDV ) Java Dalvik
(Virtual ) (JVM ) Java Virtual
. (Machine
.
.
.
) (Web Kit OSS
) . (Google chrome
) (OpenGL ES
) (SQLite .
) (GPS
). (accelerometer
. .
) (Linux Kernel
:
Display Driver
Bluetooth Driver
Camera Driver
7
:
Dalvik Virtual Machine
Core Libraries
:
Surface Manager
Media Framework
SQLite
OpenGL ES
Free Type
Web Kit
SGL
SSL
Libbc
:
Activity Manager
Window Manager
Content Provider
View System
Notification Manager
Package Manager
Telephony Manager
Resource
Location Manager
Sensor Manager
:
Home
Contacts
Phone
Browser
.
: -
10
:
Activity
Intent
Service
Content Provider
:
)(Activity
) (Class
) (Intent
.
)(Activity
) (Start ) (Activity
On Create
On Start
Om Restore Instance State
On Resume
11
) (Running :
On Start
On Restart
On Resume
On Push
On Save Instance State
) (Paused :
On Save Instance State
On Resume
On Stop
) (Destroyed :
On Destroy
/ )(Intent
.
12
)(Service
) (Media Player
).(Service
)(Content Provider
).(Contacts
)(Activity
) (Window
)(Linear Layout
) vertical or
.(horizontal
13
) (Frame Layout
.
)(Relative Layout
) (A ).(B
)(Table Layout
).(HTML
14
)SDK (Software Development Kit
\
.
)NDA (Native Development Kit
)ADT (Android Development Tools
)JDK (Java Development Kit
)JRE (Java Runtime Environment
)JVM (Java Virtual Machine
)AVD (Android Virtual Device
)AVDM (Android Virtual Device Manager
)APK (Android Package
15
16
17
)(Java SE
) (Java SE ) Java
(Standard Edition ) (JDK 6
)(JDK ((Java Development Kit
) (JRE ) (Java Runtime Environment
) (JRE ) (JDK
:
http://java.sun.com/javase/downloads/index.jsp
:
)(Windows
18
) (Skip
) Sun Download
(Manager
19
) (Save
20
) (70
)(Accept
21
)(Next
22
)(Next
23
) (Finish
24
)(Android SDK
) Android
(SDK
http://developer.android.com/sdk/index.html
) (Windows
25
( : - ) (Download
)(Save
26
) (Save
) (22
) (WinZip
) (Windows
27
) (Copy
) (Paste
) (android-sdk-windows
28
) (SDK Setup
) (https
29
) (Close
) (Cancel
) (Settings
30
) (Force Https
) (Https
) (Available Packages
) (1.6
31
) (1.6 )(2.1
) (%50
) .(1.6
.
) (1.5
.
) (Install Selected
32
) (Accept All
) (Install
..
33
)(Eclipse
) (Eclipse
) (IBM
.
:
http://www.Eclipsee.org/downloads
)(Eclipse Classic 3.5.2
34
) (Torrent
.
) (Save
35
) (Save
)Eclipsee-SDK-3.5.2-
(win32
36
) (163
) (Win Zip
) (Windows :
) (Copy
) (Paste :
) (Eclipse
37
38
)(ADT
) (ADT
)(Eclipse
) (Eclipse
) (Use this as default and do not ask again
) (OK
39
) (welcome
) (X
40
) (ADT ) (Help
) (Install New Software
41
) (Add
) (Android ) (Name
)(Location
/https://dl-ssl.google.com/android/Eclipsee
) (OK
42
) (S
) (https ) (http
43
) (Next
44
) (I accept
) (Finish
)(Eclipse
45
.
.
window ) (Preferences
:
46
47
) (Android
:
) (Browse
:
48
) (OK
:
49
) (Apply
:
.
.
50
)(Hell World
) (
.
) (
.
) (Eclipse
51
52
) (Next
53
) (1.6
:
) (Finish
) (Res ) (Layout
) (main.xml
55
) Hello
(World
56
) (Eclipse
) (Properties
) (Advanced
57
) (Environment Variables
58
) (User Environment
) (New
) (Name ) (Path
) (Variable Value
C:\Documents and Settings\UserName\Desktop\android-sdk-windows\tools
) (UserName
) (tools
59
) (OK
60
) (OK
)(OK
) (Start >> Run )(CMD
61
) (OK
android list target
)(Enter
62
) (1
android create project -n AndroidVerySimple -p c:\1\ -k
com.book.VerySimple -a Activity_VerySimple -t 1
)
(
:
) (AndroidVerySimple )(Project Name
)(-n
63
) (com.book.VerySimple ) Package
(Name )(-k
) (Activity_VerySimple ) (Activity Name
)(-a
)\ (c:\1
)(Path )(-p
) (1
) (Target )(-t
) (Enter
) (c:\1
64
) (Eclipse
C:\Documents and Settings\UserName\workspace
65
)(Android
)(Window
) Android SDK and AVD
(Manager
66
)android-
(sdk-windows ) (SDK Setup
.
) (Virtual Devices
) (New
.
67
) (1.6
) (SD
.
) (VM_Android1.6
) (1.6
) (500
68
) (Hardware
) (New
) (SD Card Support
) (OK ) (New
GPS Support
Accelerometer
69
) (Create AVD
) (OK
70
) (Start
)(Launch
71
) (Run As
)(Android Application
72
)(HelloWorld
73
) (Project ) (Clean
74
)(OK
) (X
.
75
) Environment
(Variables
) (Start >> Run
) (CMD
) (OK
76
Android h
)(enter
) (android -h ) (h
) (android
77
android list target
)(Enter
78
) (1
)(Enter
android create avd -n VM_Android1.6 -t 1
) (VM_Android1.6 ) create
(avd -n ) (-t
) (1
) (yes ) (No )(Enter
][yes
79
:
) (VM_Android1.6
)(VM_Android1.6_1
emulator -avd VM_Android1.6_1
80
:
) (SDK Setup
.
81
)
DroidSans-Bold.ttf, :
(DroidSansFallback.ttf, DroidSans.ttf
adb remount
adb shell rm /system/fonts/*
adb push c:\fontss\DroidSans-Bold.ttf
/system/fonts/
adb push c:\fontss\DroidSansFallback.ttf
/system/fonts/
adb push c:\fontss\DroidSans.ttf /system/fonts/
:
adb shell rm /system/app/AlarmClock.apk
adb install c:\Vending.apk
82
)(DDMS
) (Eclipse
) (DDMS
) (+
) (DDMS
83
) (DDMS
) (Java
) (DDMS
84
)(File Explorer
) (Threads )(Heap
)(Allocation Tracker
) (File Explorer
) (sd card
.
:
) (
.
) (Devices
) USB
85
(Driver ) (SDK
.
) Emulator
(Control
) (SMS
) (GPS
) (Longitude ) (latitude
). (GPS
86
) (Browser
87
) (Google.com in English
:
88
)(slideme.org
89
) (SAM v2.42
90
91
) (Done
) Slide
(Me
) (Menu
92
) (Settings
93
) (Applications
) (Unknown sources
) (Development
94
) (DDMS
) (Slide Me
95
) (slideme.org
) (Utilities
) (OI Shopping List
) (Utilities ) OI Shopping
(List
96
97
) (Install
) (Notifications
98
) (Install
) (Open
) (apk
) (Download
) (SD Card
Slide Me
) (Apps Installer
) (apk
)(Slide Me
99
.
: ) (DDMS
) (Devices
) ( ) (Screen Capture
android-sdk-windows\platforms\android-1.6\skins\HVGA
100
) (
.
)(
.
) (Eclipse
) (Task List :
101
102
) (X
) (Project >> Clean
.
)( ) (src
) (com.android.TaskList
)(Activity_TaskList
103
) (
) (res
) (layout
) (main.xml
104
) (main.xml
) (Config ) (Landscape )(Portrait
105
)(Layout
) (Views
.
)(main.xml
) (layout ) (main.xml
:
106
1 <?xml version="1.0" encoding="utf-8"?>
2<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/andr
oid"
3 android:orientation="vertical"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent"
6 >
7 <TextView
8 android:layout_width="fill_parent"
9 android:layout_height="wrap_content"
10 android:text="@string/hello"
11 />
12 </LinearLayout>
107
) (Eclipse
)(Show Line Numbers
108
1 <?xml version="1.0" encoding="utf-8"?>
( UTF-8) ( XML)
2<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/andr
oid"
3 android:orientation="vertical"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent">
109
) (2 ) (6
) (LinearLayout
) (4
) (LinearLayout
) (orientation
) (horizontal ) (layout_width
) (layout_height
) (fill_parent
7 <TextView
"8 android:layout_width="fill_parent
"9 android:layout_height="wrap_content
>10 android:text="@string/hello"/
110
) (7 ) (11
) (layout_width
) (fill_parent
) (layout_height ) (wrap_content
) (text
) (@string/hello
>12 </LinearLayout
) (12 ) (LinearLayout
) (TextView
) (res
) (Value )(
111
) (hell
)(!Hello World, Activity_TaskList
) (Task List
112
) (app_name
) (Task List ) (My 1st Application
) (add
113
) (color ) (OK
Name : TextViewBackColor
Value: #FF0000
114
) (#FF0000 ) (RGB
) (HTML
) (FF ) (R ) (Red
) (00 ) (G
) (Green ) (00 )(B
) (Blue
) (string.xml
) (main.xml
) (layout
>/
<TextView
"android:layout_width="fill_parent
"android:layout_height="wrap_content
"android:text="@string/hello
"android:background="@color/TextViewBackColor
) (background
) (TextViewBackColor
115
: ) (String
) (String
116
<TextView
"android:layout_width="fill_parent
"android:layout_height="wrap_content
"android:text="Task List
>android:background="@color/TextViewBackColor" /
) (TextView
) (MainTextView
) (res >> layout
) (Properties ) (id
) (MainTextView
117
) (main.xml
<TextView
"android:layout_width="fill_parent
"android:layout_height="wrap_content
"android:text="Task List
"android:background="@color/TextViewBackColor
>android:id="@+id/MainTextView"/
"android:id="@+id/MainTextView
118
) (MainTextView
) (Relative
) (@+id/
@id/MainTextView
) (+
) (
) (Title
)(Details
119
( Menu)
(Menu)
( Activity_TaskList)
( Menu)
(View)
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.Menu;
import android.widget.TextView;
public class Activity_TaskList extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
120
;)super.onCreate(savedInstanceState
;)setContentView(R.layout.main
}
}
) (
)(activities,alertdialog,toast
) (Welcome
;import android.widget.Toast
{ )public void onCreate(Bundle savedInstanceState
;)super.onCreate(savedInstanceState
;)setContentView(R.layout.main
)(Toast.makeText(Activity_TaskList.this,"Welcome",0).show
;
121
;TextView[] tvs
;]tvs = new TextView[10
)for (int i=0; i<10; ++i
{
;)tvs[i] = new TextView(this
;)"tvs[i].setText("hi
}
}
) (Menu
) (Save
@Override
{ )public boolean onCreateOptionsMenu(Menu menu
;)super.onCreateOptionsMenu(menu
;)"MenuItem item1 = menu.add(0, 1, 0, "Save
;) item1.setIcon(android.R.drawable.ic_menu_save
;return true
}
) (
;import android.util.Log
122
@Override
public boolean onOptionsItemSelected(MenuItem item) {
TextView MainTextView =
(TextView)findViewById(R.id.MainTextView);
switch (item.getItemId())
{
case 1 :
Log.v("Task:",MainTextView.getText().toString());
return true;
}
return false;
}
123
) (50
) (keytool
) (JDK
C:\Program Files\Java\jdk1.6.0_18\bin\keytool.exe
keytool -list -alias alias_name -keystore myrelease-key.keystore
124
( badwi.keystore)
:
Windows Vista or 7:
C:\Users\<user>\.android\badwi.keystore
Windows XP:
C:\Documents and Settings\<user>\.android\badwi.keystore
125
126
127
http://market.android.com/publish/Home
)(Upload Application
128
129
130
131
132
RestDroid-mini
133
RestDroid-mini
RestDroid
.
.
.
RestDroid
RestDroid-mini.
:
RestDroid API
:
. . ) ).
. . ) ).
. :
API. .:
134
:
http://www.youtube.com/watch?v=BEDuS6gq4JA
-
.
.
:
. :
:
.
:
.
) ( + +
)
(.
:
.
Classes
Methods .
)
- -
(
135
XML ) +
(
XML :
intro Best50
ViewOnMapActivity.
:
RestDroidApplication.java
Application Activities
Classes .
136
.
( Global Variables
\
( .
.
RatedItem.java
Object .
: + + + .
RatedRestaurantListItem.java
rest_list_item.xml
.
.
)
(
) (
)
RatedItem.java (.
137
AddressOverlay.java
.
.
138
:
RestDroidApplication.java
Application )
Application Activity (.
Activity .
) (Auxiliary )
RatedRestaurantListItem.java ) AddressOverlay.java
.
RatedRestaurantListItem.java rest_list_item.xml
)
(.
:
File>new>project
Android Android Project
139
140
141
UTF-8 .
Properties:
142
Classintro:
143
( ) android.app.Activity
)
(
. main.xml
.
144
:
.
main.xml
colors.xml ( values
values new>file>colors.xml .
lower case
).
:
>?"<?xml version="1.0" encoding="utf-8
><resources
><color name="background">#FFFFFFFF</color
></resources
145
.
strings.xml
.
main.xml :
<!--
> --
>?"<?xml version="1.0" encoding="utf-8
<LinearLayout
"xmlns:android="http://schemas.android.com/apk/res/android
"android:layout_width="fill_parent
"android:layout_height="fill_parent
>"android:background="@color/background
<RelativeLayout
"xmlns:android="http://schemas.android.com/apk/res/android
"android:layout_width="fill_parent
>"android:layout_height="fill_parent
> -- <!--
<ImageView
146
android:id="@+id/ImageView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/andbooklogo"
android:adjustViewBounds="true"
android:layout_centerHorizontal="true"
>
</ImageView>
<!-- -->
<Button android:id="@+id/search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/ImageView01"
android:paddingLeft="20px"
android:paddingRight="20px"
android:layout_centerInParent="true"
android:layout_marginTop="20px"
/>
</RelativeLayout>
</LinearLayout>
. ImageView
) res/drawable res/drawable-hdpi
).
RelativeLayout LinearLayout
.
147
RelativeLayout
) (
.
. android:layout_below
.
Layout :
intro . ) :
)
;package android.prog.easily
148
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class intro extends Activity
{
//
private Button getbest50;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
main
//
setContentView(R.layout.main);
setUpViews();
}
private void setUpViews()
{
getbest50 = (Button)findViewById(R.id.search);
");
getbest50.setText("
//
getbest50.setOnClickListener(new
View.OnClickListener()
{
public void onClick(View v)
149
{
;)(top50Handler
}
;)}
}
)(protected void top50Handler
{
}
}
:
.
( intro.java
(
RatedItem.java :
;package android.prog.easily
;import java.io.Serializable
public class RatedItem implements Serializable
{
= private static final long serialVersionUID
;5500258407135652423L
150
this.id = id;
}
public int getVoteCount()
{
return voteCount;
}
public void setVoteCount(int voteCount)
{
this.voteCount = voteCount;
}
public double getwScore()
{
return wScore;
}
public void setwScore(int wScore)
{
this.wScore = wScore;
}
}
RestDroidApplication.java
Activities
). )
152
:
package android.prog.easily;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Application;
public class RestDroidApplication extends Application
{
// Qaym API Key
private String key = "xxxxxxxxxxxxxxxxxxxx";
private int[] countryAndCityIds;
private JSONObject[] ratedRestaurants;
private ArrayList<RatedItem> globalAdapterData;
private RatedItem itemOnMap;
private String branchesDetailsText;
public String getBranchesDetailsText()
153
{
return branchesDetailsText;
}
public void setBranchesDetailsText(String
branchesDetailsText)
{
this.branchesDetailsText = branchesDetailsText;
}
public RatedItem getItemOnMap()
{
return itemOnMap;
}
public void setItemOnMap(RatedItem itemOnMap)
{
this.itemOnMap = itemOnMap;
}
@Override
public void onCreate()
{
super.onCreate();
}
@Override
public void onTerminate()
{
super.onTerminate();
}
154
HTTP //
REST
public String queryRESTurl(String url)
{
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
HttpResponse response;
try
{
response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null)
{
InputStream instream = entity.getContent();
String result1 =
convertStreamToString(instream);
instream.close();
return result1;
}
}
catch (IOException e)
155
{
}
return null;
}
String //
public String convertStreamToString(InputStream is)
throws IOException
{
if (is != null)
{
StringBuilder sb = new StringBuilder();
String line;
try
{
BufferedReader reader = new BufferedReader(new
while ((line = reader.readLine()) != null)
{
sb.append(line).append("\n");
}
}
finally
{
is.close();
}
156
;)(return sb.toString
}
else
{
;"" return
}
}
*/
JSON
JSON
Key/value ..
) ( ..
""
JSON
*/
)public JSONObject[] retrieveJSONs(String urlString
{
;)String result = queryRESTurl(urlString
;JSONObject[] jarr = null
)if (result != null
{
try
{
)(result = result.substring(1, result.length;)1
157
int counter = 0;
boolean firstSeen = false;
boolean secondSeen = false;
for
JSON
//
}
}
jarr = new JSONObject [counter];
int ind1 = 0;
int ind2 = 0;
boolean firstSeenS = false;
boolean secondSeenS = false;
JSON //
for (int i = 0; i < result.length(); i++)
{
firstSeenS = false;
secondSeenS = false;
if (result.charAt(i) == '{' && firstSeenS
false)
==
{
firstSeenS = true;
ind1 = i;
for (int j = i+1; j < result.length();
j++)
{
if (result.charAt(j) == '{' &&
{
secondSeenS = true;
}
159
{
String service_url = "http://api.qaym.com/0.1/";
String url = "";
url = service_url + command + "/key=" + key;
return url;
}
public void setCountryAndCityIds(int[]
countryAndCityIds)
{
this.countryAndCityIds = countryAndCityIds;
}
public int[] getCountryAndCityIds()
{
return countryAndCityIds;
}
public JSONObject[] getRatedRestaurants()
{
return ratedRestaurants;
}
public void setRatedRestaurants(JSONObject[]
ratedRestaurants)
{
this.ratedRestaurants = ratedRestaurants;
}
public ArrayList<RatedItem> getGlobalAdapterData()
161
{
return globalAdapterData;
}
public void
setGlobalAdapterData(ArrayList<RatedItem>
globalAdapter)
{
this.globalAdapterData = globalAdapter;
}
public RatedItem getGlobalAdapterDataItem(int
position)
{
return globalAdapterData.get(position);
}
}
: intro.java
protected void top50Handler()
{
try
{
API //
" "
String attrcommand = "cities/" + "57" +
"/items/top";
162
//
accessApplicationMethods()
RestDroidApplication.java
String attributesCommand =
accessApplicationMethods().getUrlStringCommand(attrcom
mand);
JSONObject[] topCities =
accessApplicationMethods().retrieveJSONs(attributesComma
nd);
//
\ReatedItem
JSON
ArrayList<RatedItem> sRest = new
ArrayList<RatedItem>();
if (topCities != null)
{
for (int ff = 0; ff < topCities.length;
ff++)
{
//
" item_id" JSON
int id =
Integer.parseInt(topCities[ff].getString("item_id"));
163
String name =
topCities[ff].getString("item_name");
int voteConutt =
Integer.parseInt(topCities[ff].getString("total_number_of_vot
es"));
double weScore =
Double.parseDouble(topCities[ff].getString("weighted_score
"));
//
double weScoreR = weScore *
100;
weScoreR =
Math.round(weScoreR);
weScoreR = weScoreR / 10 / 2;
RatedItem singleRest = new
id,
voteConutt, weScoreR);
sRest.add(singleRest);
}
}
else
{
RatedItem singleRest = new
0, 0, 0);
sRest.add(singleRest);
}
164
RatedItem(name,
RatedItem("Empty List",
accessApplicationMethods().setGlobalAdapterData(sRest);
// ***
goToBest50Act();
}
catch (JSONException e)
{
}
}
//
RestDroidApplication.java
protected RestDroidApplication
accessApplicationMethods()
{
return (RestDroidApplication)getApplication();
}
.
:
// ***
: goToBest50Act
protected void goToBest50Act()
{
Intent goToBest = new Intent(this, Best50.class);
startActivity(goToBest);
}
165
: intro.java
package android.prog.easily;
import java.util.ArrayList;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class intro extends Activity
{
//
private Button getbest50;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
main
//
setContentView(R.layout.main);
setUpViews();
}
private void setUpViews()
166
{
getbest50 = (Button)findViewById(R.id.search);
setText("
//
getbest50.setOnClickListener(new
View.OnClickListener()
{
public void onClick(View v)
{
top50Handler();
}
});
}
protected void goToBest50Act()
{
Intent goToBest = new Intent(this, Best50.class);
startActivity(goToBest);
}
protected void top50Handler()
{
try
{
API //
" "
String attrcommand = "cities/" + "57" +
"/items/top";
167
//
accessApplicationMethods()
RestDroidApplication.java
String attributesCommand =
accessApplicationMethods().getUrlStringCommand(attrcom
mand);
JSONObject[] topCities =
accessApplicationMethods().retrieveJSONs(attributesComma
nd);
//
\ReatedItem
JSON
ArrayList<RatedItem> sRest = new
ArrayList<RatedItem>();
if (topCities != null)
{
for (int ff = 0; ff < topCities.length;
ff++)
{
//
" item_id" JSON
int id =
Integer.parseInt(topCities[ff].getString("item_id"));
String name =
topCities[ff].getString("item_name");
int voteConutt =
168
Integer.parseInt(topCities[ff].getString("total_number_of_vot
es"));
double weScore =
Double.parseDouble(topCities[ff].getString("weighted_score
"));
//
double weScoreR = weScore *
100;
weScoreR =
Math.round(weScoreR);
weScoreR = weScoreR / 10 / 2;
RatedItem singleRest = new
id,
voteConutt, weScoreR);
sRest.add(singleRest);
}
}
else
{
RatedItem singleRest = new
0, 0, 0);
sRest.add(singleRest);
}
RatedItem(name,
RatedItem("Empty List",
//
RestDroidApplication.java
Activities
169
;)accessApplicationMethods().setGlobalAdapterData(sRest
;)(goToBest50Act
}
)catch (JSONException e
{
}
}
//
RestDroidApplication.java
protected RestDroidApplication
)(accessApplicationMethods
{
;)(return (RestDroidApplication)getApplication
}
}
RestDroidApplications
.
( Intent action (
.
170
Best50.java.
:
RatedRestaurantListItem.java
rest_list_item.xml
)( - -
\
RelativeLayout .
RelativeLayout xml
- -.
RatedRestaurantListItem.java :
;package android.prog.easily
;import android.content.Context
;import android.util.AttributeSet
;import android.widget.RelativeLayout
public class RatedRestaurantListItem extends RelativeLayout
{
public RatedRestaurantListItem(Context context,
)AttributeSet attr
{
;)super(context, attr
}
}
rest_list_item.xml :
171
layout res>layout (
): ))( new>file).
<?xml version="1.0" encoding="utf-8"?>
<android.prog.easily.RatedRestaurantListItem
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<!-- ->
<CheckedTextView
android:layout_width="wrap_content"
android:id="@+id/ctext"
android:layout_height="wrap_content"
android:textSize="30sp"
>
</CheckedTextView>
<!--
-->
<RatingBar
android:id="@+id/rate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/ctext"
android:numStars="5"
style="?android:attr/ratingBarStyleIndicator"
/>
172
<!-- -->
<TextView
android:id="@+id/ratedlabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/ctext"
android:textSize="20sp"
android:layout_toRightOf="@id/rate"
android:paddingLeft="30px"
/>
<TextView
android:id="@+id/scorelabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/rate"
android:textSize="20sp"
android:paddingTop="10px"
android:paddingRight="10px"
/>
</android.prog.easily.RatedRestaurantListItem>
RatedRestaurantListItem.java
: .()
173
package android.prog.easily;
import android.prog.easily.R;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.CheckedTextView;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class RatedRestaurantListItem extends RelativeLayout
{
private CheckedTextView ratedButton;
private RatedItem ratedItem1;
private TextView texty;
private TextView texty2;
public RatedRestaurantListItem(Context context,
AttributeSet attr)
{
super(context, attr);
}
//
xml
@Override
protected void onFinishInflate()
{
super.onFinishInflate();
ratedButton =
(CheckedTextView)findViewById(R.id.ctext);
174
texty =
(TextView)findViewById(R.id.ratedlabel);
texty2 =
(TextView)findViewById(R.id.scorelabel);
}
//
public void setRatedItem(RatedItem ratedItem1)
{
this.ratedItem1 = ratedItem1;
ratedButton.setText(ratedItem1.getName());
: texty.setText("
"+ratedItem1.getVoteCount());
: "+ratedItem1.getwScore() texty2.setText("
+ "/5");
}
public RatedItem getRatedItem()
{
return ratedItem1;
}
}
: Best50.java
rated_rest_list.xml
:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
175
"xmlns:android="http://schemas.android.com/apk/res/android
"android:orientation="vertical
"android:layout_width="fill_parent
>"android:layout_height="fill_parent
"<TextView android:id="@+id/RRselect
"android:layout_width="fill_parent
>android:layout_height="wrap_content"/
<ListView
"android:layout_width="fill_parent
"android:layout_height="wrap_content
"android:id="@id/android:list
>android:layout_below="@id/RRselect"/
></RelativeLayout
Best50.java.
.
\ Activity
intro.java. ListActivity
List
Adapter Design Patterns .
)(
)
Best50).
Best50
Best50.java.
) (
176
!
inner class
.
:
package android.prog.easily;
import java.util.ArrayList;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.RatingBar;
import android.widget.TextView;
public class Best50 extends ListActivity
{
private TextView selectAttr;
private RatedRestaurantListAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState)
{
177
super.onCreate(savedInstanceState);
setContentView(R.layout.rated_rest_list);
setUpViews();
}
//
@Override
protected void onListItemClick(ListView l, View v, int
position, long id)
{
super.onListItemClick(l, v, position, id);
RatedItem ite =
accessApplicationMethods().getGlobalAdapterDataItem(posi
tion);
accessApplicationMethods().setItemOnMap(ite);
goToViewOnMapActivity();
}
private void goToViewOnMapActivity()
{
Intent goToMapActivity = new Intent(this,
startActivity(goToMapActivity);
}
private void setUpViews()
178
{
selectAttr =
(TextView)findViewById(R.id.RRselect);
"); selectAttr.setText("
//
adapter = new RatedRestaurantListAdapter
setListAdapter(adapter);
}
Adapter InnerClass //
.
//
ArrayAdapter
class RatedRestaurantListAdapter extends
ArrayAdapter<RatedItem>
{
Activity context;
private ArrayList<RatedItem> myRatedItems;
RatedRestaurantListAdapter(Activity context,
{
super(context, R.layout.rest_list_item,
items);
this.context=context;
this.myRatedItems = items;
}
- //
-
public View getView(int position, View
179
parent)
{
convertView, ViewGroup
RatedRestaurantListItem row =
(RatedRestaurantListItem)convertView;
if (null == row)
{
LayoutInflator //
//
//
LayoutInflater
inflater=context.getLayoutInflater();
row =
(RatedRestaurantListItem)inflater.inflate(R.layout.rest_list_it
em, null);
}
row.setRatedItem(myRatedItems.get(position));
RatingBar rateBar =
(RatingBar)row.findViewById(R.id.rate);
rateBar.setStepSize((float) 0.1);
rateBar.setRating((float)myRatedItems.get(position).getwSco
180
;))(re
;return row
}
)public RatedItem getItem(int position
{
;)return myRatedItems.get(position
}
)(public void reload
{
//
;)(notifyDataSetChanged
}
}
protected RestDroidApplication
)(accessApplicationMethods
{
;)(return (RestDroidApplication)getApplication
}
}
OnListItemClick
.
)
position
181
.
(
.
ViewOnMapActivity.java
( xml ( .
: view_map.xml :
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/restaurantNameMap"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="30sp"
/>
<com.google.android.maps.MapView
android:id="@+id/map"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/restaurantNameMap"
android:clickable="true"
android:apiKey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
182
>xx" /
></RelativeLayout
android:apikey
.
)
SDK- debugging
( . )
cmdtrminal shell):
\ $ keytool -list -alias androiddebugkey
\ -keystore xxx
-storepass android -keypass android
xxx :
Windows Vista: C:\Users\<user>\.android\debug.keystore
Windows XP: C:\Documents
and
Settings\<user>\.android\debug.keystore
OS X and Linux: ~/.android/debug.keystore
:
Certificate fingerprint (MD5):
94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98
:
http://code.google.com/android/maps-api-signup.html
183
API .
xxxxxxxxxx.
:
http://code.google.com/android/add-ons/googleapis/mapkey.html
ViewOnMapActivity.java
: AddressOverlay.java:
package android.prog.easily;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.location.Address;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;
public class AddressOverlay extends Overlay
{
private static final int CONTAINER_RADIUS
private static final int
= 1;
CONTAINER_SHADOW_OFFSET
184
ViewOnMapActivity.java:
package android.prog.easily;
import java.io.IOException;
import java.util.List;
import org.json.JSONException;
import org.json.JSONObject;
import android.graphics.Bitmap;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.widget.TextView;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
187
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
public class ViewOnMapActivity extends MapActivity
{
public static final String ADDRESS_RESULT =
"address";
mapCurrentAddress();
}
//
private void bringRestLocations()
{
try
{
ID //
Best50.java
RestDroidApplication
int restNum =
accessApplicationMethods().getItemOnMap().getId();
API //
String command = "items/" + restNum +
"/locations";
String restaurantsCommand =
accessApplicationMethods().getUrlStringCommand(comman
d);
restaurantsLocObjects =
accessApplicationMethods().retrieveJSONs(restaurantsCom
mand);
restaurantsBranchesNames = new
String[restaurantsLocObjects.length];
longLat = new double[restaurantsLocObjects.length][2];
189
}
catch (JSONException e)
{
}
}
//
protected void mapCurrentAddress()
{
Geocoder g = new Geocoder(this);
List<Address> addresses;
boolean firstTime = true;
for (int i = 0; i <
restaurantsBranchesNames.length; i++)
{
try
{
addresses =
g.getFromLocation(longLat[i][0], longLat[i][1], 1);
if (addresses.size() > 0)
{
address = addresses.get(0);
List<Overlay> mapOverlays =
mapView.getOverlays();
AddressOverlay addressOverlay
= new AddressOverlay(address);
191
mapOverlays.add(addressOverlay);
//
zoom
//
if (firstTime)
{
minLat =
addressOverlay.getGeopoint().getLatitudeE6();
maxLat =
addressOverlay.getGeopoint().getLatitudeE6();
minLon =
addressOverlay.getGeopoint().getLongitudeE6();
maxLon =
addressOverlay.getGeopoint().getLongitudeE6();
firstTime = false;
}
minLat = (minLat >
addressOverlay.getGeopoint().getLatitudeE6()) ?
addressOverlay.getGeopoint().getLatitudeE6() : minLat;
maxLat = (maxLat <
addressOverlay.getGeopoint().getLatitudeE6()) ?
addressOverlay.getGeopoint().getLatitudeE6() : maxLat;
minLon = (minLon >
addressOverlay.getGeopoint().getLongitudeE6()) ?
192
addressOverlay.getGeopoint().getLongitudeE6() : minLon;
maxLon = (maxLon <
addressOverlay.getGeopoint().getLongitudeE6()) ?
addressOverlay.getGeopoint().getLongitudeE6() : maxLon;
mapView.invalidate();
}
else
{
}
}
catch (IOException e)
{
}
}
final MapController mapController =
mapView.getController();
GeoPoint center = new GeoPoint((maxLat +
minLat)/2,(maxLon + minLon)/2);
mapController.animateTo(center, new Runnable()
{
public void run()
{
mapController.zoomToSpan(maxLat minLat,maxLon - minLon);
}
193
});
}
private void setUpViews()
{
restName =
(TextView)findViewById(R.id.restaurantNameMap);
restName.setText(accessApplicationMethods().getItemOnMa
p().getName());
mapView = (MapView)findViewById(R.id.map);
Zoomin/out //
mapView.setBuiltInZoomControls(true);
}
@Override
protected boolean isLocationDisplayed()
{
return true;
}
@Override
protected boolean isRouteDisplayed()
{
return false;
}
protected RestDroidApplication
194
accessApplicationMethods()
{
return (RestDroidApplication)getApplication();
}
}
:
195
! .. AndroidManifest.xml
196
.
.
:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="android.prog.easily"
android:versionCode="1"
android:versionName="1.0">
<!--
-->
<application
android:name=".RestDroidApplication"
android:icon="@drawable/icon"
android:label="@string/app_name">
<!-- " "
.java -->
<activity android:name=".intro"
android:label="@string/app_name">
<!--
-->
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
197
</intent-filter>
</activity>
<activity android:name=".Best50"
android:label="Best 50 rest">
</activity>
<activity android:name=".ViewOnMapActivity"
android:label="view on Map">
</activity>
<!-- -->
<uses-library android:name="com.google.android.maps"
/>
</application>
<!-- -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCAT
ION" />
<!-- -
- -->
<uses-sdk android:minSdkVersion="7" />
198
></manifest
:
199
200
201
202
:
)( :
$ cd /Developer/android-sdk-mac_86/tools/
$ ./adb devices
:
List of devices attached
emulator-5554 device
) (
:
$ cd /Developer/android-sdk-mac_86/tools/
$ ./emulator -avd GPSenables -partition-size 500
-avd
GPSenables \
.
.
) (
:
203
$ ./adb remount
remount succeeded
): )
$ ./adb push /Users/wa2el/Desktop/fontss/DroidSans-Bold.ttf
/system/fonts/
$ ./adb push /Users/wa2el/Desktop/fontss/DroidSans.ttf
/system/fonts/
$ ./adb push
/Users/wa2el/Desktop/fontss/DroidSansFallback.ttf
/system/fonts/
xml) )
.
204
:
:
<LinearLayout>-
<TableLayout>-
<ScrollView>-
<LinearLayout>-
: \
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
Orientation
Vertical . Widgets
. Horizontal
205
layout_width
fill_parent.
layout_height
.
.
<Button
"android:text="@+id/Button01
"android:id="@+id/Button01
"android:layout_width="wrap_content
>"android:layout_height="wrap_content
></Button
android:text
. android:id
.
. . fill_parent
206
207
( Layout
..
XML
)
:
<Button
"android:text="Ardroid
"android:id="@+id/Button01
"android:layout_width="300px
208
android:layout_height="100px">
</Button>
.
LinearLayout
: Widgets Orientation.
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
): )
209
<Button
android:text="Ardroid"
android:id="@+id/Button02"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
android:layout_weight
: .
<Button
android:text="Ardroid"
android:id="@+id/Button01"
210
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
>
</Button>
<Button
android:text="Ardroid"
android:id="@+id/Button02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"
>
</Button>
211
Widgets android:layout_agravity
Widgets
alignment .
android:layout_marginLeft Pixels
.
android:layout_marginLeft
android:orientation=horizontal :
<Button
"android:text="Ardroid
"android:id="@+id/Button02
"android:layout_width="wrap_content
"android:layout_height="wrap_content
212
android:layout_marginLeft="180px"
>
</Button>
android:layout_gravity
android:orientation=vertical:
<Button
android:text="Ardroid"
android:id="@+id/Button02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
>
213
></Button
android:gravity
android:paddingLeft .
\
Orientation .
.
;)x.setOrientation(LinearLayout.HORIZONTAL
214
x Widget .
- ><TableLayout
. < >TableRow
. :
- android:layout_span :
.
Columns .
- android:layout_column :
Widget.
.
- android:stretchColumns : )
) Widgets
.
- android:shrinkColumns : .
:
:
215
:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
216
android:stretchColumns="2"
>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello!"
android:layout_column="2"
android:layout_gravity="center"
/>
</TableRow>
<TableRow>
<SeekBar
android:id="@+id/SeekBar01"
217
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_span="2"
android:layout_column="1">
</SeekBar>
</TableRow>
<TableRow>
<Button
android:text="Ardroid"
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="2"
>
218
</Button>
<CheckBox
android:text="checkBox"
android:id="@+id/CheckBox01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="0"
>
</CheckBox>
</TableRow>
<TableRow>
<RadioButton
android:text="Radio Button"
android:id="@+id/RadioButton01"
219
"android:layout_width="wrap_content
"android:layout_height="wrap_content
>
></RadioButton
></TableRow
></TableLayout
- ><ScrollView
.
.
) Widgets
).
>?"<?xml version="1.0" encoding="utf-8
<ScrollView
"xmlns:android="http://schemas.android.com/apk/res/android
"android:layout_width="fill_parent
220
android:layout_height="wrap_content">
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="2"
>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello!"
android:layout_column="2"
221
android:layout_gravity="center"
/>
</TableRow>
<TableRow>
<SeekBar
android:id="@+id/SeekBar01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_span="2"
android:layout_column="1">
</SeekBar>
</TableRow>
<TableRow>
<Button
222
android:text="Ardroid"
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="2"
>
</Button>
<CheckBox
android:text="checkBox"
android:id="@+id/CheckBox01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="0"
>
223
</CheckBox>
</TableRow>
<TableRow>
<RadioButton
android:text="Radio Button"
android:id="@+id/RadioButton01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
</RadioButton>
</TableRow>
<TableRow>
<RadioButton
android:text="Radio Button"
224
android:id="@+id/RadioButton01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
</RadioButton>
</TableRow>
<TableRow>
<RadioButton
android:text="Radio Button"
android:id="@+id/RadioButton01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
</RadioButton>
225
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello!"
android:layout_column="2"
android:layout_gravity="center"
/>
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
226
android:text="Hello!"
android:layout_column="2"
android:layout_gravity="center"
/>
</TableRow>
<TableRow>
<SeekBar
android:id="@+id/SeekBar01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_span="2"
android:layout_column="1">
</SeekBar>
</TableRow>
227
<TableRow>
<SeekBar
android:id="@+id/SeekBar01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_span="2"
android:layout_column="1">
</SeekBar>
</TableRow>
<TableRow>
<SeekBar
android:id="@+id/SeekBar01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
228
android:layout_span="2"
android:layout_column="1">
</SeekBar>
</TableRow>
</TableLayout>
</ScrollView>
229
230