Taller
Mi Primera Aplicación Android
Sobroso Party
Abril 2011
Alberto Alonso Ruibal
[email protected]
http://www.mobialia.com
T: @mobialia @albertoruibal
Nuestra aplicación: Wikiplaces
Obtendrá los lugares de la Wikipedia cerca de
nuestra posición mostrándolos en un mapa y en una
lista
Veremos ejemplos de:
● Layouts, ListViews, PreferenceActivity...
● API de geolocalización
● API de Google Maps
● Obtención de datos mediante JSON
Desarrollar para Android
● Lenguaje Java
● También posible en C, hay un
NDK
● API muy completa y sencilla
● SDK para Linux/Windows/Mac
con emulador
● Eclipse IDE (es la opción oficial,
hay otras posibilidades como
IntelliJ IDEA)
El SDK de Android
● http://developer.android.com/sdk/
● En el SDK/AVD manager se seleccionan las
plataformas necesarias y se descargan
● También permite configurar los dispositivos
emulados
(Virtual Devices)
El emulador
● Permite simular distintos dispositivos / tamaños
de pantala
● Completamente funcional aunque algo lento
Eclipse IDE
IDE muy versátil para Java, PHP, C++...
http://www.eclipse.org
Instalación del plugin ADT
● Abrir Eclipse
● Seleccionar Help → Software Updates… →
Available Software
● En la ventana escoger “Add Site” , e introducir la
ubicación:
https://dl-ssl.google.com/android/eclipse/
Crear un nuevo proyecto en Eclipse
File->New->Android Project
Cubrimos los detalles con:
Project name: WikiPlaces
Build Target : Google APIs 1.6
Application name: WikiPlaces
Package name:
com.mobialia.wikiplaces
Create Activity: WikiPlaces
Min SDK Version: 4
Pulsa Finish
Componentes de una aplicación
Se definen en el AndroidManifest.xml, en el cual
también se indican los permisos necesarios, la
versión de Android exigida, etc
● Actividades
● Servicios
● Intents: sistema de comunicación entre
aplicaciones/actividades
Estructura de directorios
src/
gen/
assets/
res/
| drawable-hdpi/
| drawable-ldpi/
| drawable-mdpi/
| layout/
| raw/
| values/
| values-es/
Código fuente
Archivos generados a partir de los recursos
Ficheros a los que va a acceder la aplicación
Carpeta de recursos
Imágenes alta resolución (dpi)
Imágenes baja resolución
Imágenes media resolución
Disposición de elementos en pantalla
Archivos de datos (sonidos por ejemplo)
Definición de textos, colores, estilos, etc
Cadenas localidadas a un idimoa linguaxe
Primera actividad: Dashboard
Vamos a implementar en la clase WikiPlacesActivity
un Dashboard desde el cual accederemos a las
distintas secciones de la aplicación:
● Ver un mapa
● Ver una lista
● Actualizar los datos
● Acceder a las preferencias
Utilizaremos los patrones Dashboard y ActionBar
http://www.google.com/events/io/2010/sessions/android-ui-design-patterns.html
Ciclo de vida de las Actividades
Hay varios métodos
dentro de nuestra
actividad que son
llamados cuando
cambia de estado
Definición del Layout
● ViewGroups:
LinearLayout,
TableLayout,
RelativeLayout...
● Views: TextView,
ListView, o
personalizadas
● Editor WYSIWYG: pero
siempre es mejor acudir
al XML
Dashboard: Layout
Crearemos un res/layout/dashboard.xml para el cual
nos debería llegar con:
● LinearLayout
● Button, ImageButton,Textview
Simplificaremos el layout utilizando:
● values/strings.xml para las cadenas de texto
● values/colors.xml para los colores
● values/styles.xml para los estilos
http://www.alonsoruibal.com/using-styles-on-android-layouts/
Dashboard: Activity
En la clase WikiplacesActivity introduciremos:
public void onCreate(Bundle bundle) {
super.onCreate(icicle);
// Quitamos la barra de título
requestWindowFeature(Window.FEATURE_NO_TITLE);
requestWindowFeature(Window.FEATURE_PROGRESS);
// Establecemos el contenido
setContentView(R.layout.dashboard);
}
Dashboard: Botones con imágenes
● drawable_hdpi/dashboard_preferences_default.png
● drawable_hdpi/dashboard_preferences_selected.png
● drawable/dashboard_preferences.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@drawable/dashboard_preferences_selected"/>
<item android:state_pressed="true" android:drawable="@drawable/dashboard_preferences_selected"/>
<item android:state_focused="false" android:state_pressed="false"
android:drawable="@drawable/dashboard_preferences_default"/>
</selector>
● Y en nuestro layout ponemos:
<Button style="@style/DashBoardAction"
android:drawableTop="@drawable/dashboard_preferences"
android:text="@string/dashboard_preferences"
android:onClick="onPreferencesAction"
/>
● Al pulsarlo llamará al método onPreferencesAction de nuestra
actividad
public void onPreferencesAction(View v) {
...
}
Lanzando otra actividad: Intents
● Por ejemplo, para lanzar una nueva actividad
cuando pulsamos el botón de preferencias:
public void onPreferencesAction(View v) {
Intent intent = new Intent(getApplicationContext(), PreferencesActivity.class);
startActivity(intent);
}
● Creamos la nueva clase de la actividad: también
debemos añadirla en el AndroidManifest.xml:
<activity android:name="PreferencesActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.EMBED" />
</intent-filter>
</activity>
Actividad para las prefencias
● La clase de la Actividad es tremendamente sencilla:
public class PreferencesActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML
addPreferencesFromResource(R.layout.preferences);
}
}
● En layout/preferences.xml definimos los campos que
va a tener nuestra pantalla de preferencias con
ListPreference, CheckboxPreference,
EditTextPrefrence...
Definiendo preferencias en el XML
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
android:key="distance"
android:title="@string/preferences_distance"
android:summary="@string/preferences_distance_summary"
android:entries="@array/distances_texts"
android:entryValues="@array/distances_values"
android:dialogTitle="@string/preferences_distance"
android:defaultValue="20"
android:selectable="true"
/>
<CheckBoxPreference
android:key="satellite"
android:title="@string/preferences_satellite"
android:summary="@string/preferences_satellite_summary"
android:defaultValue="false"/>
<CheckBoxPreference
android:key="fullscreen"
android:title="@string/preferences_fullscreen"
android:summary="@string/preferences_fullscreen_summary"
android:defaultValue="false"/>
</PreferenceScreen>
Obteniendo valores de preferencias
● Ya de nuevo en el onResume de WikiplacesActivity
vamos a obtener la preferencia “fullscreen” y actuar en
función de su valor:
SharedPreferences sharedPref =
PreferenceManager.getDefaultSharedPreferences(this);
fullscreen = sharedPref.getBoolean("fullscreen", false);
if (fullscreen) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
getWindow().setFlags(0,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
Obteniendo la ubicación (I)
● Para hacer que nuestra actividad principal obtenga la ubicación,
primero añadimos los permisos en el AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
● Después implementamos LocationListener
.... implements LocationListener
public void onLocationChanged(Location location) {
Log.d(TAG, “Location Received!!!!”);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
Obteniendo la ubicación (II)
● Ahora solicitamos actualizaciones de la ubicación con dos proveedores
de ubicación (sí dos!):
manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(false);
criteria.setPowerRequirement(Criteria.POWER_LOW);
criteria.setAccuracy(Criteria.ACCURACY_FINE);
providerFine = manager.getBestProvider(criteria, true);
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
providerCoarse = manager.getBestProvider(criteria, true);
if (providerCoarse != null) manager.requestLocationUpdates(providerCoarse, 5*60000, 100,
this); // update each 5 minutes
if (providerFine != null) manager.requestLocationUpdates(providerFine, 5*60000, 100, this
); // update each 5 minutes
http://www.alonsoruibal.com/using-two-locationproviders-on-android/
Simulando la ubicación en el
emulador
● Nuestro ordenador no
tiene GPS, pero el
emulador nos permite
“simular” ubicaciones
introduciendo longitud
y latitud
Obteniendo los datos a mostrar
● Añadir a la aplicación el permiso para conectarse Internet
<uses-permission android:name="android.permission.INTERNET" />
● Utilizaremos los servicios de GeoNames
http://www.geonames.org/
● Primero creamos una cuenta en
http://www.geonames.org/login
● Y habilitamos los “Free Web Services” en:
http://www.geonames.org/manageaccount
● Par
Comentarios de: Taller - Mi Primera Aplicación Android (0)
No hay comentarios