Version 9.6
Copyright © 2009, 2010, 2011, 2012 Lars Vogel
01.02.2012
| Revision History | |
|---|---|
| Revision 0.1 | 04.07.2009 |
| Created | |
| Revision 0.2 - 9.6 | 07.07.2009 - 01.02.2012 |
| bug fixing and enhancements | |
Table of Contents
Android is an operating system based on Linux with a Java programming interface.
The Android Software Development Kit (Android SDK) provides all necessary tools to develop Android applications. This includes a compiler, debugger and a device emulator, as well as its own virtual machine to run Android programs.
Android is officially guided by the Open Handset Alliance. In reality Google leads the project.
Android allows background processing, provides a rich user interface library, supports 2-D and 3-D graphics using the OpenGL libraries, access to the file system and provides an embedded SQLite database.
An Android application consists out of the following parts:
Activity
represents the presentation layer of an Android
application. A
simplified (and slightly incorrect) description is that an
Activity
is a
a screen which the user sees. This is slightly incorrect as
Activities
can be displayed as dialogs or transparent.
An Android
application
can
have
several
activities and it can be
switched
between them during
runtime of the
application.
Views
are user interface widgets, e.g. buttons or text fields. The base
class for all
Views
is
android.view.View.
The
layout of the
Views
is managed by subclasses of type
android.view.ViewGroups.
Views
often have attributes which can be used to
change their appearance
and behavior.
Services
perform background tasks without providing
an UI.
They can notify
the user via the notification framework in
Android.
ContentProvider
provides an structured interface to data. Via a
ContentProvider
your
application can
share data with other
applications. Android
contains an SQLite
database which is frequently used in conjunction
with a
ContentProvider
to persists the data of the
ContentProvider.
Intents
are asynchronous messages which allow the
application to request
functionality from other components of the Android systen, e.g.
from
Services
or
Activities. An application can call a component directly (explicit
intent) or
ask the Android
system to evaluate registered components
for a
certain
Intents
(implicit intents). For example
the
application could implement
sharing of data via an
Intent
and all components which allow sharing of data would be available
for the user to select.
Applications register
themselves to an
intent via an
IntentFilter.
Intents
allow to combine loosely
coupled
components to perform certain
tasks.
BroadcastReceiver
can be registered to
receives system messages and
Intents.
BroadcastReceiver
will get notified by the Android system if the specified situation
happens. For example a
BroadcastReceiver
could get called once the system completed its boot process or if
a phone call is received.
Widgets
are interactive components which are primary used on the Android
homescreen. They typically display some kind of data and allow the
user to perform actions via them. For example a Widget could
display a short summary of new emails and if the user select a
email
it could start the email application with the selected email.
Android provide much more components but the list above describes the most important ones. Other Android components are "Live Folders" and "Live Wallpapers". Live Folders display data on the homescreen without launching the corresponding application.
During deployment on an Android device, the Android system will create a unique user and group ID for every Android application. Each application file is private to this generated user, e.g. other applications cannot access these files.
In addition each Android application will be started in its own process.
Therefore by means of the underlying Linux operating system, every Android application is isolated from other running applications. A misbehaving application cannot easily harm other Android applications.
If data should be shared the application must do this explicitly,
e.g.
via a
Service
or a
ContentProvider.
Android also contains a permission system. Android predefines permissions for certain tasks but every application can also define its own permissions.
An application must declare in its configuration file (AndroidManifest.xml) that it requires certain permissions.
Depending on the details of the defined permission, the Android system will during installation either automatically grant the permission, reject it or ask the user if he grants these permissions to the application.
If for example the application declares that is requires Internet access then the user need to confirm this during installation.
This is called "user driven security". The user decides to grant a permission or to deny it. If the user does not want to give all permissions required by the application, this application cannot be installed. The check of the permission is only performed during installation, permissions cannot be denied or granted after the installation.
Typically not all users check the permissions in detail but some users do and if there is something strange with them, they will write bad reviews on the corresponding Android markets.
Google provides the Android Development Tools (ADT) to develop Android applications with Eclipse. ADT is a set of plug-in which extended the Eclipse IDE with Android development capabilities.
ADT contains all required functionality to create, compile, debug and deploy Android applications from the Eclipse IDE and from the command line. Other IDE's, e.g. IntellJ, are also reusing components of ADT.
ADT also provides an Android device emulator, so that Android applications can be tested without a real Android phone.
The Android system uses a special virtual machine, i.e. the Dalvik Virtual Machine to run Java based applications. Dalvik uses special bytecode which is different from Java bytecode.
Therefore you cannot run standard Java bytecode on Android.
Android applications are primary written in the Java programming language. The Java source files are converted to Java class files by the Java compiler.
Android provides a tool
dx
which
converts Java
class
files
into a
dex
(Dalvik Executable)
file. All class files of one application are
placed in one compressed .dex file. During this conversion process
redundant
information in the class files are optimized in the .dex
file. For example if the same String in
different class file is found,
the .dex file
is stored only once and reference this String in the corresponding
classes.
.dex files are therefore much smaller in size then the corresponding class files.
The .dex file and the resources of an Android project, e.g. the
images and
XML files are packed into an
.apk
(Android Package)
file. The program
aapt
(Android Asset Packaging Tool) perform this packaging.
The resulting .apk file contains all necessary data to run the Android application and can be deployed to an Android device via the "adb" tool.
The Android Development Tools (ADT) allows that all these steps are performed transparent to the user; either within Eclipse or via the command line.
If you use the ADT tooling you press a button or run a script and the whole Android application (.apk file) will be created and deployed.
An Android application is described in the file
AndroidManifest.xml. This file must declare all
Activities,
Services,
BroadcastReceivers
and
ContentProvider
of the
application. It must also contain the
required permissions for
the
application. For example if
the
application requires network access
it
must be specified here.
AndroidManifest.xml
can be
thought as the
deployment descriptor for
an Android application.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="de.vogella.android.temperature" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Convert" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="9" /> </manifest>
The
package
attribute defines the base package for the
following Java elements. It
also must be unique as the Android
Marketplace only allows application
for a specific package once.
Therefore a good habit is to use your
reverse domain name as a
package
to avoid collisions with other
developers.
android:versionName
and
android:versionCode
specify the
version of your application.
versionName
is what the user sees and
can be any string.
versionCode
must be an integer and the Android
Market uses this to determine if
you provided a newer version to
trigger the update on devices which
have your application installed.
You typically start with "1" and
increase this value by one if you
roll-out a new version of your
application.
The tag
<activity>
defines an
Activity, in this
example pointing to the
class
"de.vogella.android.temperature.Convert". An intent filter is
registered for this class which defines that this
Activity
is
started
once
the application starts (action
android:name="android.intent.action.MAIN"
). The category definition
category android:name="android.intent.category.LAUNCHER"
defines
that this application is added to the application directory on
the
Android device. The
@string/app_name
value refer to resource files which contain
the actual values. This
makes it easy to provide different
resources,
e.g. strings, colors,
icons, for different devices and makes it easy
to translate
applications.
The "uses-sdk" part of the "AndroidManifest.xml" defines the minimal SDK version for which your application is valid. This will prevent your application being installed on devices with older SDK versions.
defines the minimal SDK version your application is valid for
The directory
gen
in an Android project contains generated
values.
R.java
is a
generated class which contains references to
resources of the
res
folder in the project. These resources are
defined in the
res
directory and can
be values, menus, layouts,
icons
or pictures or
animations. For example a resource can be an
image or an
XML file which
defines strings.
If you
create a new
resource, the corresponding
reference is
automatically
created in
R.java. The references are static
int values,
the Android
system
provides
methods to access the
corresponding
resource. For
example to
access a
String with the
reference id
R.string.yourString
use the
method
getString(R.string.yourString));. R.java is automatically maintained by the Eclipse development
environment, manual changes are not necessary.
While the directory
res
contains structured values which
are
known to the
Android
platform the
directory
assets
can be used
to
store any kind
of
data. In Java you can access this data
via the
AssetsManager
and the
method
getAssets().
In your XML files, e.g. your layout files you can refer to
other
resources via the
@
sign. For example if you want to refer to a
color you defined as
resources you can refer to it via
@color/your_id
or if you have defined a "hello" string as resource you can access it
via
@string/hello .
The user interface for
Activities
is defined via layouts.
At
runtime, layouts are instances of
android.view.ViewGroups . The
layout defines the UI elements, their properties and their
arrangement.
UI elements are based on the class
android.view.View .
ViewGroup
is a
subclass of the class
View
and a layout can contain
UI
components
(
Views
) or other layouts
(
ViewGroups
). You should not
nestle
ViewGroups
too deeply as this has a negative
impact on
performance.
A layout can be defined via Java code or via XML. You typically uses Java code to generate the layout if you don't know the content until runtime; for example if your layout depends on content which you read from the Internet.
XML based layouts are defined via a
resource
file in
the folder
/res/layout . This file specifies the
ViewGroups ,
Views ,
their
relationship and
their attributes for a specific layout. If a UI
element needs to be
accessed via Java code you have to give the UI
element an unique id
via the
android:id
attribute. To assign a new
id to an UI element
use
@+id/yourvalue . By conversion this will
create and assign a new
id
yourvalue
to the corresponding UI
element. In your Java code you
can later access
these UI elements via
the method
findViewById(R.id.yourvalue)
.
Defining layouts via XML is usually the preferred way as this separates the programming logic from the layout definition. It also allows the definition of different layouts for different devices. You can also mix both approaches.
The operating system controls the life cycle of your application. At any time the Android system may stop or destroy your application, e.g. because of an incoming call. The Android system defines a life cycle for activities via pre-defined methods. The most important methods are:
onSaveInstanceState()
- called if the activity is stopped.
Used to save data so that the
activity can restore its states if
re-started
onPause()
- always called if the Activity ends, can be used
to release
resource or save data
onResume()
- called if the Activity is re-started, can be
used to initialize
fields
The activity will also be restarted if a so called "configuration change" happens. A configuration change for example happens if the user changes the orientation of the device (vertical or horizontal). The activity is in this case restarted to enable the Android platform to load different resources for these configuration, e.g. layouts for vertical or horizontal mode. In the emulator you can simulate the change of the orientation via CNTR+F11.
You can avoid a restart of your application for certain
configuration
changes via the configChanges attribute on your
activity definition in
your
AndroidManifest.xml. The following
activity will
not be restarted in case of orientation
changes or
position of the
physical keyboard (hidden / visible).
<activity android:name=".ProgressTestActivity" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden|keyboard"> </activity>
The class
android.content.Context
provides the connections to
the
Android system. It is the interface to
global information about
the
application environment. Context also
provides access to Android
Services, e.g. theLocation Service. As Activities and Services extend the
class
Context
you
can directly
access the context via
this.
The following assume that you have already Eclipse installed. For details please see Eclipse Tutorial
The Android SDK is 32bit, therefore on an 64bit Linux system you need
to have the package
ia32-libs
installed. For Ubuntu you can do this via the following command.
apt-get install ia32-libs
Please check your distribution documentation if you are using a different flavor of Linux.
Use the Eclipse update manager to install all available components for the Android Development Tools (ADT) from the URL https://dl-ssl.google.com/android/eclipse/. If you are not familiar with the Eclipse update manager the usage is described in Eclipse update manager.
After the new Android development components are installed you will be prompted to install the Android SDK. You can use the following wizard or go to the next section to learn how to do it manually.



The previous step downloads the Android SDK automatically for you. You can also download the Android SDK from the Android SDK download page.
The download contains a zip file which you can extract to any place in your file system, e.g. I placed it under "c:\android-sdk-windows". Avoid using spaces in the path name otherwise you may experience problems later.
You also have to define the location of the Android SDK in the Eclipse Preferences. In Eclipse open the Preferences dialog via → . Select Android and enter the installation path of the Android SDK.

The Android SDK Manager allows you to install specific versions of Android. Select → from the Eclipse menu.

The dialog allows you to install new packages and also allows you to delete them.
Select "Available packages" and open the "Third Party Add-ons". Select the Google API 14 (Android 4.0) version of the SDK and press "Install".

Press the "Install" button and confirm the license for all packages. After the installation completes, restart Eclipse.
The following step is optional.
During Android development it is very useful to have the Android source code available as Android uses a lot of defaults.
As of Android 4.0 the Android development tools provides also the source code. You can download it via the Android SDK Manager by selecting the "Sources for Android SDK".
The sources are downloaded to the source directory located in "path_to_android_sdk/sources/android-xx". xx is the api level number (15 for 4.0.3).
In the Eclipse Package Explorer, right click on your android.jar and select → . Type in the source directory name and press OK. Afterwards you can browse through the source code.
For earlier versions Haris Peco maintains plugins, which provide the Android Source code code. Use the Eclipse update manager to install the Android Source plugin from the following update site: "http://adt-addons.googlecode.com/svn/trunk/source/com.android.ide.eclipse.source.update".
More details can be found on the project website.
The Android Development Tools (ADT) include an emulator to run an Android system. The emulator behaves like a real Android device (in most cases) and allows you to test your application without having a real device.
You can configure the version of the Android system you would like to run, the size of the SD card, the screen resolution and other relevant settings. You can define several devices with different configurations.
Via the emulator you select which device should be started, you can also start several in parallel. These devices are called "Android Virtual Device" (AVD).
The ADT allow to deploy and run your Android program on the AVD.
During the creation of an AVD you decide if you want an Android device or an Google device.
An AVD created for Android will contain the programs from the Android Open Source Project. An AVD created for the Google API's will also contain several Google applications, most notable the Google Maps application.
If you want to use functionality which is only provided via the Google API's, e.g. Cloud2DeviceMessaging or Google Maps you must run this application on an AVD with Google API's.
Obviously you can use the emulator via the keyboard on the right side of the emulator. But there are also some nice shortcuts which are useful.
Alt+Enter Maximizes the emulator. Nice for demos.
Ctrl+F11 changes the orientation of the emulator.
F8 Turns network on / off.
Try to use a smaller resolution for your emulator as for example HVGA. The emulator gets slower the more pixels its needs to render as it is using software rendering.
Also if you have sufficient memory on your computer, add at least 1 GB of memory to your emulator. This is the value "Device ram size" during the creation of the AVD.
Also set the flag "Enabled" for Snapshots. This will save the state of the emulator and let it start much faster.
To define an Android Virtual Device (ADV) open the "AVD Manager" via → and press "New".

Enter the following.

We can also select the box "Enabled" for Snapshots. This will make the second start of the virtual device much faster.
At the end press the button "Create AVD". This will create the AVD configuration and display it under the "Virtual devices".
To test if your setup is correct, select your device and press "Start".
After (a long time) your AVD starts. You are able to use it via the mouse and via the virtual keyboard of the emulator.
Things are not always working as they should. This section gives an overview over typical problems and how to solve them.
Several users report that get the following errors:
Project ... is missing required source folder: 'gen'
The project could not be built until build path errors are resolved.
Unable to open class file R.java.
To solve any of these errors, go to the project menu and select Project -> Clean.
The communication with the emulator or your Android device might have problems. This communication is handled by the Android Debug Bridge (adb).
Eclipse allows to reset the adb in case this causes problems. Select therefore the DDMS perspective via → → →
To restart the adb, select the "Reset adb" in the Device
View.

The
"LogCat"
View
shows you the log messages of your Android device and help
you analyze
problems. For example Java exceptions in your
program would be shown
here. To open this view, select
→ → → → .
If your emulator does not start, make sure that the android-sdk version is in a path without any spaces in the path name.
The @override annotation was introduced in Java 1.6. If you receive
an
error message for
@override, change the Java compiler level to Java 1.6. To do this right-click
on the
project, select
→ →
and select "1.6" in the drop-down box.
Java requires that classes which are not part of the standard Java Language be either fully qualified or declared via imports.
If you see error message with "XX cannot be resolved to a variable",
right-click in your
Editor
and select
→
to important required packages.
The tutorials of this document have been developed and tested with Android 4.0.3, API Level 15. Please use this version for all tutorials in this book. Higher version usually should also work. Lower version of the Android API might also work, but if you face issues, try the recommended version.
The base package for the projects is always the same as the project name, e.g. if you are asked to create a project "de.vogella.android.example.test" then the corresponding package name is "de.vogella.android.example.test".
The Application name, which must be entered on the Android project generation wizard, will not be predefined. Choose a name you like.
This app is also available on the Android Marketplace. Search for "vogella" for find this example.
Select → → → → and create the Android project "de.vogella.android.temperature". Enter the following.



Press "Finish". This should create the following directory structure.

While "res" contains structured values which are known to the Android platform the directory "assets" can be used to store any kind of data. In Java you can access this data via the AssetsManager and the method getAssets().
The Android SDK allows the developer to define certain artifacts, e.g. strings and UI's, in two ways: via a rich editor, and directly via XML.
The following description tries to use the rich UI but for validation the resulting XML is also displayed. You can switch between both things by clicking on the tab on the lower part of the screen. For example in the Package Explorer select "res/layout/main.xml".

Android allows you to create attributes for resources, e.g. for strings or colors. These attributes can be used in your UI definition via XML or in your Java source code.
Select the file "res/values/string.xml" and press "Add". Select "Color" and enter "myColor" as the name and "#3399CC" as the value.


Add also the following "String" attributes. String attributes allow the developer to translate the application at a later point.
Switch to the XML representation and validate the values.
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, Convert!</string> <string name="app_name">Temperature Converter</string> <color name="myColor">#3399CC</color> <string name="myClickHandler">myClickHandler</string> <string name="celsius">to Celsius</string> <string name="fahrenheit">to Fahrenheit</string> <string name="calc">Calculate</string> </resources>
Select "res/layout/main.xml" and open the Android editor via a double-click. This editor allows you to create the UI via drag and drop or via the XML source code. You can switch between both representations via the tabs at the bottom of the editor. For changing the position and grouping elements you can use the outline view.
The following shows a screenshot of the Palette view from which you can drag and drop new UI elements into your layout. Please note that the "Palette" view changes frequently so your view might be a bit different.

Right-click on the text object “Hello World, Hello!” in the layout. Select Delete on the popup menu to remove the text object. Then, from the “Palette” view, select Text Fields and locate “Plain Text”. Drag this onto the layout to create a text input field. All object types in the section "Text Fields” derive from the class "EditText", they just specify via an additional attribute which text type can be used.
Now select the Palette section “Form Widgets” and drag a “RadioGroup” object onto the layout. The number of radio buttons added to the radio button group depends on your version of Eclipse. Make sure there are two radio buttons by deleting or adding radio buttons to the group.
From the Palette section Form Widgets, drag a Button object onto the layout.
The result should look like the following.

Switch to "main.xml" and verify that your XML looks like the following.
<?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"> <EditText android:layout_height="wrap_content" android:id="@+id/editText1" android:layout_width="match_parent" android:text="EditText"></EditText> <RadioGroup android:layout_height="wrap_content" android:id="@+id/radioGroup1" android:layout_width="match_parent"> <RadioButton android:text="RadioButton" android:layout_width="wrap_content" android:id="@+id/radio0" android:layout_height="wrap_content" android:checked="true"></RadioButton> <RadioButton android:text="RadioButton" android:layout_width="wrap_content" android:id="@+id/radio1" android:layout_height="wrap_content"></RadioButton> </RadioGroup> <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> </LinearLayout>
If you select a UI element you can change its properties via the properties view. Most of the properties can be changed via the right mouse menu. You can also edit properties of fields directy in XML. Typically you change properties directly in the XML file as this is much faster. But the right mouse functionality is nice if you are searching for a certain property.
Open your file "main.xml" We will delete the initial text for the
EditText field in XML.
Switch
to
the XML tab called "main.xml" and
delete the
android:text="EditText"
property from the EditText part. Switch back to the "Graphical
Layout" tab and check that the text is removed.
Use the right mouse click on the first radio button to assign the "celsius" string attribute to its "text" property. Assign the and "fahrenheit" string attribute to the second radio button.


From now on I assume you are able to use the properties menu on the UI elements. You can either edit the XML file or modify the properties via right mouse click.
Set the property "Checked" to true for the first RadioButton. Assign "calc" to the text property of your button and assign "myClickHandler" to the "onClick" property. Set the "Input type" property to "numberSigned" and "numberDecimal" on your EditText.
All your other UI controls are contained in a LinearLayout. We want to assign a background color to this LinearLayout. Right-click on an empty space in Graphical Layout mode, then select → → . Select “Color” and then “myColor” in the list.

Switch to the "main.xml" tab and verify that the XML is correctly maintained.
<?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" android:background="@color/myColor"> <EditText android:layout_height="wrap_content" android:id="@+id/editText1" android:layout_width="match_parent" android:inputType="numberDecimal|numberSigned"></EditText> <RadioGroup android:layout_height="wrap_content" android:id="@+id/radioGroup1" android:layout_width="match_parent"> <RadioButton android:layout_width="wrap_content" android:id="@+id/radio0" android:layout_height="wrap_content" android:text="@string/celsius" android:checked="true"></RadioButton> <RadioButton android:layout_width="wrap_content" android:id="@+id/radio1" android:layout_height="wrap_content" android:text="@string/fahrenheit"></RadioButton> </RadioGroup> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/calc" android:onClick="myClickHandler"></Button> </LinearLayout>
During the generation of your new Android project you specified that
an
Activity
called
ConvertActivity
should get created. The project wizard also created the corresponding
Java classs.
Change your code in
ConvertActivity.java
to the following. Note that
the
myClickHandler
will be called based
on the
OnClick
property
of your button.
package de.vogella.android.temperature; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.RadioButton; import android.widget.Toast; public class ConvertActivity extends Activity { private EditText text; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); text = (EditText) findViewById(R.id.editText1); } // This method is called at button click because we assigned the name to the // "On Click property" of the button public void myClickHandler(View view) { switch (view.getId()) { case R.id.button1: RadioButton celsiusButton = (RadioButton) findViewById(R.id.radio0); RadioButton fahrenheitButton = (RadioButton) findViewById(R.id.radio1); if (text.getText().length() == 0) { Toast.makeText(this, "Please enter a valid number", Toast.LENGTH_LONG).show(); return; } float inputValue = Float.parseFloat(text.getText().toString()); if (celsiusButton.isChecked()) { text.setText(String .valueOf(convertFahrenheitToCelsius(inputValue))); celsiusButton.setChecked(false); fahrenheitButton.setChecked(true); } else { text.setText(String .valueOf(convertCelsiusToFahrenheit(inputValue))); fahrenheitButton.setChecked(false); celsiusButton.setChecked(true); } break; } } // Converts to celsius private float convertFahrenheitToCelsius(float fahrenheit) { return ((fahrenheit - 32) * 5 / 9); } // Converts to fahrenheit private float convertCelsiusToFahrenheit(float celsius) { return ((celsius * 9) / 5) + 32; } }
To start the Android Application, select your project, right click on it, and select → . Be patient, the emulator starts up very slowly.
You should get the following result.

Type in a number, select your conversion and press the button. The result should be displayed and the other option should get selected.
After you run your application on the virtual device you can start it again on the device. If you press the Home button you can also select your application.


Android provides two possible ways to display global actions which the user can select. The first one is the usage of the Action Bar in the application. The Action Bar is a window feature at the top of the activity that may display the activity title, navigation modes, and other interactive items.
The second option is that the app can open a menu which shows additional actions via a popup menu. Typically you define your menu entries in a way that they are added to the action bar if sufficient space is available in the action bar and if not, remaining menu items are displayed in the popup menu.
The option menu and the action bar of your activity is filled by the method onCreateOptionsMenu() of your activity.
The
ActionBar
also shows an icon of your application. You can also add an
action to
this icon. If you select this icon the
onOptionsItemSelected()
method will be called with the value
android.R.id.home. The recommendation is to return to the main
Activity
in your program.
// If home icon is clicked return to main Activity case android.R.id.home: Intent intent = new Intent(this, OverviewActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); break;
In this method you can create the menu programmatically or you can use a pre-defined XML resources which you inflate via the class "MenuInflator". Each activity has already an instance of the class available and this instance can get accessed via the method getMenuInflator().
onCreateContextMenu() is only called once. If you want to influence the menu later you have to use the method onPrepareOptionsMenu().
You can also assign a context menu to an UI widget (view). A context menu is activated if the user "long presses" the view.
A context menu for a view is registered via the method registerForContextMenu(view). The method onCreateContextMenu() is called every time a context menu is activated as the context menu is discarded after its usage. The Android platform may also add options to your view, e.g. "EditText" provides context options to select text, etc.
This chapter will demonstrate how to create and evaluate a option menu which is displayed in the action bar if sufficient space is available. This example will be extended in the chapter about preferences.
Create a project "de.vogella.android.socialapp" with the activity "OverviewActivity". Change the UI in the file "/res/layout/main.xml" to the following:
<?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:orientation="vertical" > <Button android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Show Preferences" > </Button> <Button android:id="@+id/Button02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Change Preferences" > </Button> </LinearLayout>
Select your project, right click on it and select → → → to create a new XML resource.
Select the option "Menu", enter as File "mainmenu.xml" and press the button "Finish".

This will create a new file "mainmenu.xml" in the folder "res/menu" of your project. Android provides a nice editor to edit this file, unfortunately this editor is not always automatically used due to bugs in the ADT. If that happens you can open this editor manually. Right-click on your menu file and select → .
Switch if necessary to the "Layout" tab of the editor. Press Add and select "Item". Maintain the following value. This defines the entries in your menu. We will also define that the menu entry is displayed in the action bar if there is sufficient space available.

Change your Activity class "OverviewActivity" to the following. The OnCreateOptionsMenu method is used to create the menu. The behavior in "onOptionsItemSelected" is currently hard-coded to show a Toast and will soon call the preference settings. In case you want to disable or hide menu items you can use the method "onPrepareOptionsMenu" which is called every time the menu is called.
package de.vogella.android.socialapp; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.Toast; public class OverviewActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.mainmenu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { Toast.makeText(this, "Just a test", Toast.LENGTH_SHORT).show(); return true; } }
Run your application. As there is enough space in the action bar your item will be displayed there. If there would be more items you could press "Menu" on the emulator to see them. If you select the menu item you should see a small info message.

The two "Preference" buttons are not yet active. We will use them in the next chapter.
Android supports the usage of Preferences to allow you to save data for your application. Preferences are stored as key values. The definition of Preferences can also be done via an XML resource.
Android provides the class "PreferenceActivity" which extends the class Activity. PreferenceActivity supports the simple handling of preferences. This activity can load a preference definition resources via the method addPreferencesFromResource().
To communicate between different components Android uses Intents. Typically the PreferenceActivity is started from another activity via an Intent.
In your application you can access the preference manager via the following:
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
Values can get access via the key of the preference setting.
String username = preferences.getString("username", "n/a");
To create or change preferences you have to call the edit() methods. Once you have changed the value you have to call commit() to apply your changes.
Editor edit = preferences.edit(); edit.putString("username", "new_value_for_user"); edit.commit();
We will continue using the example project "de.vogella.android.social".
Create an Android XML resource "preferences.xml" of type "PreferenceScreen".

Open the file via right-mouse click and → . Press Add, add a "PreferenceCategory" and add two preferences "EditTextPreferences" to this category : "User" and "Password".



You can also enter values for other properties of
EditTextField, e.g. the inputMethod.
Add the following attribute to
the
XML definition of your
password field
to make the input quoted with
*.
android:inputType="textPassword"
Create the class
MyPreferencesActivity
which extends
PreferenceActivity. This
Activity
will load the "preference.xml" file and will allow the user to change
the values.
package de.vogella.android.socialapp; import android.os.Bundle; import android.preference.PreferenceActivity; public class MyPreferencesActivity extends PreferenceActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } }
To make this class available as an activity for Android you need to register it in your "AndroidManifest.xml" file. Select "AndroidManifest.xml" and the tab "Application". Scroll to the botton of the view and add your new activity via the "Add" button.

To make use of our new preference activity and the preference values we adjust the "OverviewActivity". The first button will show the current values of the preferences via a Toast and the second button will revert the maintained user name to demonstrate how you could change the preferences via code.
package de.vogella.android.socialapp; import android.app.Activity; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class OverviewActivity extends Activity { SharedPreferences preferences; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button button = (Button) findViewById(R.id.Button01); // Initialize preferences preferences = PreferenceManager.getDefaultSharedPreferences(this); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { String username = preferences.getString("username", "n/a"); String password = preferences.getString("password", "n/a"); showPrefs(username, password); } }); Button buttonChangePreferences = (Button) findViewById(R.id.Button02); buttonChangePreferences.setOnClickListener(new OnClickListener() { public void onClick(View v) { updatePreferenceValue(); } }); } private void showPrefs(String username, String password){ Toast.makeText( OverviewActivity.this, "Input: " + username + " and password: " + password, Toast.LENGTH_LONG).show(); } private void updatePreferenceValue(){ Editor edit = preferences.edit(); String username = preferences.getString("username", "n/a"); // We will just revert the current user name and save again StringBuffer buffer = new StringBuffer(); for (int i = username.length() - 1; i >= 0; i--) { buffer.append(username.charAt(i)); } edit.putString("username", buffer.toString()); edit.commit(); // A toast is a view containing a quick little message for the // user. We give a little feedback Toast.makeText(OverviewActivity.this, "Reverted string sequence of user name.", Toast.LENGTH_LONG).show(); }
To open the new preference
Activity
we will use the
onOptionsItemSelected()
method. Even though we currently have only one option in our
menu we
use a switch to be ready for several new menu
entries. To see the
current values of the preferences we
define a button and use the class
PreferenceManager
to get the sharedPreferences.
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.mainmenu, menu); return true; } // This method is called once the menu is selected @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // We have only one menu option case R.id.preferences: // Launch Preference activity Intent i = new Intent(OverviewActivity.this, MyPreferencesActivity.class); startActivity(i); // Some feedback to the user Toast.makeText(OverviewActivity.this, "Enter your user credentials.", Toast.LENGTH_LONG).show(); break; } return true; }
Run your application. Press the "menu" hardware button and then select your menu item "Preferences". You should be able to enter your user settings then press the back hardware button to return to your main activity. The saved values should be displayed in a small message windows (Toast) if you press your first button. If you press the second button the username should be reversed.

We have already used a "Toast" which is a small message window which does not take the focus. In this chapter we will use the class "AlertDialog". AlertDialog is used to open a dialog from our activity. This modal dialog gets the focus until the user closes it.
An instance of this class can be created by the builder pattern, e.g. you can chain your method calls.
You should always open a dialog from the class onCreateDialog(int) as the Android system manages the dialog in this case for you. This method is automatically called by Android if you call showDialog(int).
Create a new Android project "de.vogella.android.alertdialog" with the activity "ShowMyDialog". Maintain the following layout for "main.xml".
<?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"> <Button android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Show Simple Dialog" android:onClick="openMyDialog"></Button> </LinearLayout>
Change the code of your activity to the following.
package de.vogella.android.alertdialog; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.View; import android.widget.Toast; public class ShowMyDialog extends Activity {/** Called when the activity is first created. */@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void openMyDialog(View view) { showDialog(10); } @Override protected Dialog onCreateDialog(int id) { switch (id) { case 10: // Create out AlterDialog Builder builder = new AlertDialog.Builder(this); builder.setMessage("This will end the activity"); builder.setCancelable(true); builder.setPositiveButton("I agree", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { ShowMyDialog.this.finish(); } }); builder.setNegativeButton("No, no", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Toast.makeText(getApplicationContext(),"Activity will continue",Toast.LENGTH_LONG).show(); } }); AlertDialog dialog = builder.create(); dialog.show(); } return super.onCreateDialog(id); } }
If you run your application and click your button you should see your dialog.

More on dialogs can be found on Android Dialogs standard documentation.
A layout manager is a subclass of
ViewGroup
and is responsible for the layout of itself and its child
Views. Android supports different default
layout
managers.
As of Android 4.0 the most relevant layout manager are
LinearLayout,
FrameLayout,
RelativeLayout
and
GridLayout.
All layouts allow the developer to define attributes. Children can also define attributes which may be evaluated by their parent layout.
AbsoluteLayoutLayout
is deprecated and
TableLayout
can be implemented more effectively via
GridLayout
LinearLayout
puts all its child elements into a single column or row depending on
the
android:orientation
attribute. Possible values for this attribute are
horizontal
and
vertical,
horizontal
is the default value.
LinearLayout
can be nested to achieve more complex layouts.
GridLayout
was introduced with Android 4.0. This layout allows you to organize a
view into a Grid. GridLayout
separates its drawing area into: rows,
columns, and cells.
You can specify how many columns you want for define for each
View
in which row and column it should be placed and how many columns and
rows it should use. If not specified
GridLayout
uses defaults, e.g. one column, one row and the position of
a
View
depends on the order of the declaration of the
Views.
Create the project
"de.vogella.android.layout.gridlayout" with
the
Activity
called
"DemoGridLayout".
Change "main.xml" to the following.
<?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/GridLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:columnCount="4" android:useDefaultMargins="true" > <TextView android:layout_column="0" android:layout_columnSpan="3" android:layout_gravity="center_horizontal" android:layout_marginTop="40dp" android:layout_row="0" android:text="User Credentials" android:textSize="32dip" /> <TextView android:layout_column="0" android:layout_gravity="right" android:layout_row="1" android:text="User Name: " > </TextView> <EditText android:id="@+id/input1" android:layout_column="1" android:layout_columnSpan="2" android:layout_row="1" android:ems="10" /> <TextView android:layout_column="0" android:layout_gravity="right" android:layout_row="2" android:text="Password: " > </TextView> <EditText android:id="@+id/input1" android:layout_column="1" android:layout_columnSpan="2" android:layout_row="2" android:ems="8" /> <Button android:id="@+id/button1" android:layout_column="2" android:layout_row="3" android:text="Login" /> </GridLayout>
Run your example. You should see a nice arranged layout.
This is a layout example wherefore we have not connected any
functionality to it.
To
extend
this example you could now connect the
Button
with a method in the
Activity
via its
android:onClick.
ScrollViews can be used to contain one view that might be to big to fit on one screen. If the view is to big the ScrollView will display a scroll bar to scroll the context. Of course this view can be a layout which can then contain other elements.
Create an android project "de.vogella.android.scrollview" with the activity "ScrollView". Create the following layout and class.
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:fillViewport="true" android:orientation="vertical" > <LinearLayout android:id="@+id/LinearLayout01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="8dip" android:paddingRight="8dip" android:paddingTop="8dip" android:text="This is a header" android:textAppearance="?android:attr/textAppearanceLarge" > </TextView> <TextView android:id="@+id/TextView02" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="1.0" android:text="@+id/TextView02" > </TextView> <LinearLayout android:id="@+id/LinearLayout02" android:layout_width="wrap_content" android:layout_height="wrap_content" > <Button android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1.0" android:text="Submit" > </Button> <Button android:id="@+id/Button02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1.0" android:text="Cancel" > </Button> </LinearLayout> </LinearLayout> </ScrollView>
package de.vogella.android.scrollview; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.TextView; public class ScrollView extends Activity {/** Called when the activity is first created. */@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView view = (TextView) findViewById(R.id.TextView02); String s=""; for (int i=0; i < 100; i++) { s += "vogella.de "; } view.setText(s); } }
The attribute "android:fillViewport="true"" ensures that the scrollview is set to the full screen even if the elements are smaller then one screen and the "layout_weight" tell the android system that these elements should be extended.

Fragment
components
allow you to organize your application code so that it is
easier to
support
different sized devices.
Fragments
are components with their own lifecycle and their own user interface.
They can be defined via layout files or via coding.
Fragments
always
run in the context of an
Activity. If an
Activity
is stopped its
Fragments
will also be stopped; if an
Activity
is destroyed its
Fragments
will also get destroyed.
If a
Fragment
component
is defined in an XML layout file, the
android:name
attribute points to the
Fragments
class.
The base class for
Fragments
is
android.app.Fragment. For special purposes you can also use more special classes, like
ListFragment
or
DialogFragment.
The onCreateView() method is called by Android once the
Fragment
should create its user interface. Here you can inflate an layout. The
onStart() method is called once the
Fragment
gets visible.
Fragments
can be dynamically added and removed from an
Activity
via
Fragment
transactions. This will add the action to the history stack of the
Activity, i.e. this will allow to revert the
Fragment
changes in the
Activity
via the back button.
Fragments
make it easy to re-use components
in different layouts, e.g. you
can
build
single-pane layouts for handsets
(phones) and multi-pane
layouts
for
tablets.
This is not limited to tablets; for example you can use
Fragments
also to support different layout for landscape and portrait
orientation. But as tablets offer significantly more space you
typically include more views into the layout and
Fragments
makes that
easier.
The typical example is a list of items in an activity. On a
tablet you
see the
details immediately on the same screen on the right
hand side
if
you
click on item. On a handset you jump to a new detail
screen. The
following discussion will assume that you have two
Fragments
(main and
detail) but you can also have more. We will also
have one
main
activity and one detailed activity. On a tablet the main
activity
contains both
Fragments
in its layout, on a handheld it only
contains the main fragment.
To check for an fragment you can use the FragmentManager.
DetailFragment fragment = (DetailFragment) getFragmentManager(). findFragmentById(R.id.detail_frag); if (fragment==null || ! fragment.isInLayout()) { // start new Activity } else { fragment.update(...); }
To create different layouts with
Fragments
you can:
Use one activity, which displays two
Fragments
for tablets
and only one on handsets devices. In this case you
would
switch the
Fragments
in the activity whenever necessary. This requires that
the fragment
is not declared in the layout file as such
Fragments
cannot be removed during runtime. It also requires an update of
the
action bar if the action bar status depends on the fragment.
Use separate activities to host each fragment on a handset.
For
example, when the tablet UI uses two
Fragments
in an activity,
use the same activity for handsets, but supply an
alternative
layout that includes just one fragment. When you need
to
switch
Fragments, start another
activity that hosts the other fragment.
The second approach is the most flexible and in general
preferable way
of using
Fragments. In this case the main activity
checks if the detail fragment is
available in the layout. If the
detailed fragment is there, the main
activity tells the fragment that
is should update itself. If the
detail
fragment is not available the
main activity starts the detailed
activity.
It is good practice that
Fragments
do not manipulate each other. For this purpose a
Fragment
typically implements an interface to get new data from its
host
Activity.
The following tutorial demonstrates how to use
Fragments. The entry
Activity
(called
MainActivity
of our application
)
will use different layouts for portrait and for
landscape mode.
In portrait mode
MainActivity
will show one Fragment with a list of names. If the user touches an
item in the list, a second
Activity
called
DetailActivity
will start and show the selected text.
In landscape mode
MainActivity
will show two
Fragments. The first is again the
Fragments
which shows the list of names. The second
Fragment
shows the text of the current selected item. This is similar to the
portrait mode, but the whole information will be shown on one screen.
Create a new project
de.vogella.android.fragments
with an
Activity
called
MainActivity.
Create or change the following layout files in the "res/layout/" folder.
First create the following file called "details.xml". This layout
will be
used by
the
DetailFragment.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/detailsText" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="center_horizontal|center_vertical" android:layout_marginTop="20dip" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" android:textSize="30dip" /> </LinearLayout>
Change the existing "main.xml" file. This layout
will be used by
MainActivity
in landscape mode and shows two
Fragments.
<?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:orientation="horizontal" > <fragment android:id="@+id/listFragment" android:layout_width="150dip" android:layout_height="match_parent" android:layout_marginTop="?android:attr/actionBarSize" class="de.vogella.android.fragments.ListFragment" ></fragment> <fragment android:id="@+id/detailFragment" android:layout_width="match_parent" android:layout_height="match_parent" class="de.vogella.android.fragments.DetailFragment" > <!-- Preview: layout=@layout/details --> </fragment> </LinearLayout>
Create now the
Fragment
classes. Create the
ListFragment
class.
package de.vogella.android.fragments; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; public class ListFragment extends android.app.ListFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); String[] values = new String[] { "Android", "iPhone", "WindowsMobile", "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2" }; ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, values); setListAdapter(adapter); } @Override public void onListItemClick(ListView l, View v, int position, long id) { String item = (String) getListAdapter().getItem(position); DetailFragment fragment = (DetailFragment) getFragmentManager() .findFragmentById(R.id.detailFragment); if (fragment != null && fragment.isInLayout()) { fragment.setText(item); } else { Intent intent = new Intent(getActivity().getApplicationContext(), DetailActivity.class); intent.putExtra("value", item); startActivity(intent); } } }
Create the
DetailFragment
class.
package de.vogella.android.fragments; import android.app.Fragment; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class DetailFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e("Test", "hello"); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.details, container, false); return view; } public void setText(String item) { TextView view = (TextView) getView().findViewById(R.id.detailsText); view.setText(item); } }
We want that Android uses a different main.xml file in portrait model then in landscape mode.
For this reason create the "res/layout-port" folder.
In portrait mode Android will check the "layout-port" folder for fitting layout files. Only if we would not have a "main.xml" file in "layout-port", Android would check the "layout" folder.
Therefore create the following "main.mxl" layout file in "res/layout-port".
<?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:orientation="horizontal" > <fragment android:id="@+id/listFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="?android:attr/actionBarSize" class="de.vogella.android.fragments.ListFragment" /> </LinearLayout>
Also create the "details_activity_layout.xml" layout file. This
layout will be
used in the
DetailActivity
which is only used in portrait mode. Please note that we could have
create this file also in the "layout" folder, but as it is only used
in portrait mode it is best practise to place it into this folder.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <fragment android:id="@+id/detailFragment" android:layout_width="match_parent" android:layout_height="match_parent" class="de.vogella.android.fragments.DetailFragment" /> </LinearLayout>
Create a new
Activity
called
DetailActivity
with the following class.
package de.vogella.android.fragments; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class DetailActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.details_activity_layout); Bundle extras = getIntent().getExtras(); if (extras != null) { String s = extras.getString("value"); TextView view = (TextView) findViewById(R.id.detailsText); view.setText(s); } } }
MainActivity
will remain unmodified.
package de.vogella.android.fragments; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity {/** Called when the activity is first created. */@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
Run your example. If you run the application in portrait mode you
should see only one
Fragment. Use Ctrl+F11 to switch the orientation. In horizontal mode you
should
see two
Fragments. If you select an item in portrait mode a new
Activity
should get started with the selected item. In horizontal mode your
second
Fragment
should display the select item.
Eclipse provides a
perspective
for interacting with your Android
(virtual) device and your Android
application program. Select
→ → →
to open this perspective. It includes several
Views
which can also be used independently and allows for example the
application to place calls and send SMS to the device. It also allows
the application to set the current geo position and allows you to
perform a performance trace of your application.
You can see the log (including System.out.print() statements) via the LogCat view.

You can access your Android emulator also via the console. Open a shell, switch to your "android-sdk" installation directory into the folder "tools". Start the shell via the following command "adb shell".
adb shell
You can also copy a file from and to your device via the following commands.
// Assume the gesture file exists on your Android device adb pull /sdcard/gestures ~/test // Now copy it back adb push ~/test/gesture /sdcard/gestures2
This will connect you to your device and give you Linux command line access to the underlying file system, e.g. ls, rm, mkdir, etc. The application data is stored in the directory "/data/data/package_of_your_app".
If you have several devices running you can issue commands to one individual device.
# Lists all devices adb devices #Result List of devices attached emulator-5554 attached emulator-5555 attached # Issue a command to a specific device adb -s emulator-5554 shell
You can uninstall an android application via the shell. Switch the data/app directory (cd /data/app) and simply delete your android application.
You can also uninstall an app via adb with the package name.
adb uninstall <packagename>
Alternatively to adb you can also use telnet to connect to the device. This allows you to simulate certain things, e.g. incoming call, change the network "stability", set your current geocodes, etc. Use "telnet localhost 5554" to connect to your simulated device. To exit the console session, use the command "quit" or "exit".
For example to change the power settings of your phone, to receive an sms and to get an incoming call make the following.
# connects to device telnet localhost 5554 # set the power level power status full power status charging # make a call to the device gsm call 012041293123 # send a sms to the device sms send 12345 Will be home soon # set the geo location geo fix 48 51
For more information on the emulator console please see Emulator Console manual
Turn on "USB Debugging" on your device in the settings. Select in the settings Applications > Development, then enable USB debugging. You also need to install the driver for your mobile phone. For details please see Developing on a Device . Please note that the Android version you are developing for must be the installed version on your phone.
To select your phone, select the "Run Configurations", select "Manual" selection and select your device.


Before posting questions, please see the vogella FAQ. If you have questions or find an error in this article please use the www.vogella.de Google Group. I have created a short list how to create good questions which might also help you.
Eclipse RCP Training (German) Eclipse RCP Training with Lars Vogel
Android Tutorial Introduction to Android Programming
GWT Tutorial Program in Java and compile to JavaScript and HTML
Eclipse RCP Tutorial Create native applications in Java
JUnit Tutorial Test your application
Git Tutorial Put everything you have under distributed version control system