SlideShare una empresa de Scribd logo
1 de 10
Descargar para leer sin conexión
1.-Posibilidades de recepción de eventos: listener y método.
Eventos con listener Eventos sin listener (método para el evento definido en propiedades)
package com.carlosblanco.android;
import android.os.Bundle; //todos los widget:button, TextView, ..., etc
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.*;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Button boton = (Button) findViewById(R.id.button1);
boton.setOnClickListener(new View.OnClickListener() {
public void onClick(View sender)
{
Toast.makeText(getApplicationContext(), "Hola DAM2
con listener y toast", Toast.LENGTH_LONG).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}//activity
package com.carlosblanco.android;
import android.os.Bundle; //todos los widget:button, TextView, ..., etc
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.*;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
public void procesar(View clickedButton) {
Toast.makeText(getApplicationContext(), "Hola 2ºDAM eventos
sin listener", Toast.LENGTH_LONG).show();
}
}
//Recuerda poner procesar en el evento on click del botón en sus
// propiedades desde la pantalla de diseño de layouts
Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 1 / 10
2.-Controles Android:
Control Abrev. Uso Dibujo Atributos Métodos Listener / Código de uso
Adapter Estructura de datos
para controles de
selección: Spinner,
ListView, GridView,
Gallery, ...
//ArrayAdapter:Es el más sencillo de todos los adaptadores, y provee de datos a un control de selección a partir de un array de objetos de cualquier tipo.
final String[] datos = new String[]{"Elem1","Elem2","Elem3","Elem4","Elem5"};
ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this,android. R.layout.simple_spinner_item, datos); //this es la actividad actual, cte del sistema, y el vector de
datos.
//SimpleAdapter: Se utiliza para mapear datos sobre los diferentes controles definidos en un fichero XML de layout.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="valores_array">
<item>Elem1</item> <item>Elem2</item> <item>Elem3</item> <item>Elem4</item> <item>Elem5</item>
</string-array>
</resources>
ArrayAdapter<CharSequence> adaptador = ArrayAdapter.createFromResource(this, R.array.valores_array, android.R.layout.simple_spinner_item); //activiy, id_arr_xml, cte)
//SimpleCursorAdapter: Se utiliza para mapear las columnas de un cursor abierto sobre una base de datos, sobre los diferentes elementos visuales del control de selección. pendiente...
Ejemplos de adaptadores sobre el vector Java anterior:
ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this,android. R.layout.simple_spinner_item, datos); //this=actividad actual, item=cte , y datos=vector.
ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this,android. R.layout.simple_list_item_1, datos); ...pendiente de acabar otros ejemplos con listas, etc...
Activity dp=Density-independent Pixels sp = Scale-independent Pixels .setTitle(String)
Button cmd Botón de comando
simple o con imagen
(drawableLeft)
android:text="texto"
android:text="@string/cadena"
android:background="color"
android:typeface="fuente"
android:drawableLeft=img
android:textSize="10sp|10dp",
...
final btnBoton1 = (Button)findViewById(R.id.BtnBoton1);
final lblMensaje=(TextView)findViewById(R.id.TextView1);
cmdBoton1.setOnClickListener(new View.OnClickListener() {
public void onClick(View sender)
{
lblMensaje.setText("Botón 1 pulsado!");
}
});
CheckBox chk Interruptor on/off. android:text="@string/cadena"
android:checked="false"
Boolean .isChecked()
.setChecked(Boolean);
final CheckBox fumador = (CheckBox)findViewById(R.id.checkBox1);
fumador.setOnCheckedChangeListener(
new CheckBox.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (isChecked) …; else …;
//algo que hacer en cada estado ON/OFF
} //onCheckedChange
}); //Listener
EditText txt Caja de texto
editable con
plantillas para
número, email, ...
nombre y clave.
android:lines="5"
android:hint="texto" (ayuda)
android:inputType="normal|phone|num
ber|textPersonName|textUri|textEmailAd
dress|textPassword|text"
String .getText().toString()
.setText(String)
int .length()
final EditText txtCaja = (EditText) findViewById(R.id.editText1);
String s=txtCaja.getText().toString();
txtCaja.setText("Otro texto en pantalla");
lblTexto.setText("Hola " + etCaja.getText().toString());
Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 2 / 10
GridView android:numColumns=”entero|auto_fit”
android:columnWidth=”enterosp|dp|px”,
android:horizontalSpacing=”enterosp|dp”
android:verticalSpacing=”enterosp|dp”
android:stretchMode=“columnWidth|spacingWidth”
Una vez definida la interfaz de usuario, la forma de asignar los datos desde
el código de la aplicación es completamente análoga a la ya comentada
tanto para las listas desplegables como para las listas estáticas: creamos un
array genérico que contenga nuestros datos de prueba, declaramos un
adaptador de tipo ArrayAdapter pasándole en este caso un layout genérico
(simple_list_item_1, compuesto por un simple TextView) y asociamos el
adaptador al control GridView mediante su método setAdapter():
String[] datos = new String[25]; //mejor si es 1 atributo de la clase
for(int i=1; i<=25; i++) datos[i-1] = "Dato " + i;
ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, datos);
final grdOpciones = (GridView)findViewById(R.id.GridOpciones);
grdOpciones.setAdapter(adaptador);
grdOpciones.setOnItemClickListener(
new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent,
android.view.View v, int position, long id) {
lblMensaje.setText("Opción seleccionada: " + datos[position]);
}
});
ImageButton cmd Botón con una
imagen en su
interior.
android:src="@drawable/ok" //ok.png .show()
.setDuration(Toast.LENGTH_
LONG/SHORT);
( = = = setOnClickListener)
ImageView img Permite mostrar
imágenes en la app.
android:src="@drawable/hola" //hola.png
android:scaleType = “entero”
(5=CENTER, 6=CENTER_CROP,
7=CENTER_INSIDE, …)
final ImageView img= (ImageView)findViewById(R.id.imageView1);
img.setImageResource(R.drawable.hola); //cambiar img en Java
ListView lst La cte a usar en el adaptador es:
android.R.layout.simple_list
_item_1
final lstOpciones = (ListView)findViewById(R.id.LstOpciones);
lstOpciones.setAdapter(adaptador);
RadioButton ra Opción única de
entre varias.
android:text="@string/cadena"
android:checked="false"
Boolean .isChecked() String s;
final RadioButton raMill= (RadioButton) findViewById(R.id.raMill);
if (raMill.isChecked()) s="Has seleccionado la opción de ser millonario";
RadioGroup rg Agrupa varios
RadioButtons para
que solo uno de ellos
sea marcado,
desactivando los
demás.
Int .getCheckedRadioButtonId()
Boolean .check(R.id.cte) //ON
.clearCheck() //todos a OFF
String s;
RadioGroup radios=(RadioGroup) findViewById(R.id.radioGroup1);
RadioButton masculino=(RadioButton) findViewById(R.id.radio0);
RadioButton femenino=(RadioButton) findViewById(R.id.radio1);
int selectedId = radios.getCheckedRadioButtonId();
if (selectedId==masculino.getId()) s="Veo que eres un hombren";
if (selectedId==R.id.radio1) s="Veo que eres una mujern"; //otra forma
RatingBar android:numStars="10"
android:stepSize="1.0"
android:rating="2.0"
android:isIndicator="false" (v4.0)
.getRating() ratingBar = (RatingBar) findViewById(R.id.ratingBar);
txtRatingValue = (TextView) findViewById(R.id.txtRatingValue);
//si la puntuación cambia, mostrarla en el textview
ratingBar.setOnRatingBarChangeListener(new
OnRatingBarChangeListener() {
public void onRatingChanged(RatingBar ratingBar, float rating,
Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 3 / 10
boolean fromUser) {
txtRatingValue.setText(String.valueOf(rating));
}
});
SeekBar android:max="100"
android:progress="50"
android:secondaryProgress="75"
.getProgress() barra.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) { ... }
@Override
public void onStartTrackingTouch(SeekBar seekBar) { ... }
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if(fromUser) …; //el usuario ha cambiado la posición
}
}); //listener
Spinner cmb Selector de una
opción entre varias
(combo).
Requiere un String[]
o un string-array
de .xml
Android:prompt="Choose a Planet" .getSelectedItem()
.setAdapter(adapter);
En listener definimos 2 métodos
onItemSelected para cuando se
seleccione una opción en la lista
desplegable. onNothingSelected
cuando no haya ninguna opción
seleccionada (pej adaptador sin
datos).
cmbOpciones.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent,
android.view.View v, int position, long id) {
lblMensaje.setText("Seleccionado: " + datos[position]);
}
public void onNothingSelected(AdapterView<?> parent) {
lblMensaje.setText("");
}
});
TextView lbl Enlace a URL,
teléfono o google
maps al hacer clic.
android:autoLink="none|web|email|pho
ne| map|All"
(todos los del textview normal)
TextView lbl Texto no editable android:text="Texto de ejemplo"
android:background="#AA44FF"
android:typeface="monospace"
.setText(String) final lblMensaje=(TextView)findViewById(R.id.TextView1);
lblMensaje.setText("El texto ha cambiado!!!");
lblMensaje.setBackGroundColor(Color.Blue);
Toast Mensaje temporal en
pantalla.
Toast.makeText(getApplicationContext(), "Mensaje que desaparece
Rapido",Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "Has seleccionado G",
Toast.LENGTH_LONG).show();
ToggleButton cmd Fusión de un botón y
un checkbox.
Permite un texto
para cada estado.
android:textOn="texto"
android:textoOff ="texto"
Boolean .isChecked() final btnBoton2 = (ToggleButton)findViewById(R.id.BtnBoton2);
btnBoton2.setOnClickListener(new View.OnClickListener() {
public void onClick(View sender)
{
if(btnBoton2.isChecked()) lblMensaje.setText("Botón 2: ON");
else lblMensaje.setText("Botón 2: OFF");
}
});
Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 4 / 10
3.-Programando:
Media Volume
Permite acceso a
los volúmenes de
audio.
AudioManager.STREAM_MUSIC
AudioManager.STREAM_RING
AudioManager.STREAM_ALARM
AudioManager.STREAM_NOTIFICATION
AudioManager.STREAM_SYSTEM
AudioManager.STREAM_VOICECALL
El último parámetro para setStreamVolume(), es un flasg
que dice como indicar al usuario el cambio en el volumen.
FLAG_PLAY_SOUND – hacer un beep
FLAG_SHOW_UI – con un toast
FLAG_VIBRATE – con una vibración
mAudioManager.adjustStreamVolume(AudioManager.STR
EAM_MUSIC, AudioManager.ADJUST_RAISE,
AudioManager.FLAG_SHOW_UI);
ADJUST_LOWER Bajar volumen
ADJUST_RAISE Subir volumen
ADJUST_SAME Dejar el mismo volumen
private AudioManager audio;
audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE); //dentro del onCreate
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
audio.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
return true;
case KeyEvent.KEYCODE_VOLUME_DOWN:
audio.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);
return true;
default:
return false;
}
}
//Poner volumen de videos al máximo
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC /*cuál*/, audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
/*volumen*/, AudioManager.FLAG_SHOW_UI /*indicador al usuario*/);
Camera <manifest ... >
<uses-feature android:name="android.hardware.camera" />
...
</manifest ... >
http://developer.android.com/training/camera/photobasics.html
Camera myCamera=Camera.open();
if(myCamera!=null){
try{
//set camera parameters if you want to
//...
// here, the unused surface view and holder
SurfaceView dummy=new SurfaceView(context)
myCamera.setPreviewDisplay(dummy.getHolder());
myCamera.startPreview();
myCamera.takePicture(null, null, getJpegCallback()):
}finally{ myCamera.close(); }
}else{ ; } //booo, failed!
private PictureCallback getJpegCallback(){
PictureCallback jpeg=new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
FileOutputStream fos;
try { fos = new FileOutputStream("foto.jpg"); fos.write(data); fos.close(); } catch (IOException e) { ; } //do something about it
} } }; } }
MediaPlayer Métodos:
.start();
MediaPlayer mPlayer = MediaPlayer.create(this, R.raw.ficheromp3);
try {
Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 5 / 10
.pause()
.stop();
Boolean .isPlaying();
Int .getCurrentPosition();
Int .getDuration();
.seekTo(Int);
mPlayer.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mPlayer.start();
Calls
android.content.*;
android.net.*;
android.os.*;
android.util.*;
new Intent(Intent.ACTION_CALL);
.setData(Uri.parse("tel:600111222"));
try {
Intent llamar = new Intent(Intent.ACTION_CALL);
llamar.setData(Uri.parse("tel:600111222"));
startActivity(llamar);
} catch (ActivityNotFoundException activityException) {
Log.e("Codigo de llama", "Ha fallado la llamada!!!", activityException); //Añadimos un log de ERROR (e=Error, w=Warning, )
}
SMS
android.telephony.*
Debes usar try & catch SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage("600111222", null, "Texto del SMS...", null, null);
.
4,-Recursos: Clic derecho en Values->New->Android XML File/
Color Creación del .XML: Clic derecho en Values/New/Android XML File/
Resource Type: Values. Project: dejamos así nuestro proyecto activo.
File: color. Root Element: resources. (clic en finalizar).
Formato de los colores: #RGB | #ARGB | #RRGGBB | #AARRGGBB
Acceso como propiedad: @color/[NombreDelColor]. Ej: @color/Rojo
Acceso desde código Java: R.color.NombreDelColor. Ej: R.color.Rojo
Puede haber más de un fichero de colores, se gestionarán como uno solo
< ?xml version="1.0" encoding="utf-8"?>
< resources>
< color name="Negro">#000000</color>
< color name="Blanco">#FFFFFF</color>
< color name="Gris">#808080
< color name="Amarillo">#FFFF00
<color name="rojotranslucido">#80ff0000</color>
< color name="Rojo">#FF0000
< color name="Verde">#00FF00
< /resources>
final RadioButton estado = (RadioButton) findViewById(R.id.Radio1);
estado.setTextColor(getResources().getColor(R.color.Rojo));
Image Permite png, jpg, gif.
@drawable/ok => ok.png
android:contentDescription="texto alternativo" final ImageView img=(ImageView)findViewById(R.id.img);
img.setImageResource(R.drawable.android);
Drawable Fichero que los contiene: strings.xml
http://docs.since2006.com/android/2.1-drawables.php
http://guajirandro.blogspot.com.es/2012/09/aplicando-estilos-css-y-degrad
ados-en.html
< ?xml version="1.0" encoding="utf-8"?>
< resources>
<drawable name="redBox">#ff0000</drawable>
< /resources>
final TextView txt=(TextView)findViewById(R.id.txt);
txt.setBackgroundResource(R.drawable.redBox); //fondo componente
ImageView img2 = (ImageView)findViewById(R.id.img2);
img2.setImageResource(R.drawable.ic_menu_camera); //usar icono
Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 6 / 10
String Permiten definir recursos de tipo texto para facilitar traducciones de apps.
Acceso como propiedad: @string/[NombreCadena]. Ej: @string/saludo
Acceso desde Java: getString(R.string.NombreCadena);.
Ej: String x=getString(R.string.autor);
String con formato:%1 primer param, %2 segundo ,... . $s=string; $d=int;
%1$s => primer parámetro será una cadena
%2$d => segundo parámetro será un entero (es simila a sprintf en PHP)
Cadenas con HTML: CharSequence styledText = Html.fromHtml(str);
Convertir a String: String cadenaformateada=styleText.toString();
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Ejemplo1</string>
<string name="euros">%1$s tiene %1$d eur</string>
<string name="autor">Carlos Blanco</string>
<string name="aviso">Debes <b>meter</b> tu
<u>nombre</u> en la caja</string>
</resources>
final lblMensaje=(TextView)findViewById(R.id.TextView1);
lblMensaje.setText(getString(R.string.autor));
int dinero = 200; //200 euros
String autor=getString(R.string.autor); //Carlos Blanco
String strfmt = getResources().getString(R.string.euros); //%1$ ...
String resultado = String.format(strfmt, autor, dinero);
//resultado="Carlos Blanco tiene 200 eur";
CharSequence styledText = Html.fromHtml(getString(R.string.aviso));
String cadenaformateada=styledText.toString(); //La convierte a String
String otraforma=getString(R.string.aviso);
//Coge la cadena con Html del fichero de recursos: @string/aviso
String-array Es un conjunto de elementos o array de cadenas, que se define en un
fichero de cadenas como por ejemplo strings.xml.
Se usa para Spinners que siempre tienen las mismas elecciones.
<string-array name="planetas_array">
<item>Mercurio</item>
<item>Venus</item>
<item>Tierra</item>
</string-array>
.
Menus ./res/menu/
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/MnuOpc1" android:title="Informatica">
<menu>
<item android:id="@+id/MnuOpc1a" android:title="DAM" />
<item android:id="@+id/MnuOpc1b" android:title="ASIR" />
</menu>
</item>
<item android:id="@+id/SubMnuOpc2" android:title="RAE" />
</menu>
public boolean onOptionsItemSelected(MenuItem item) {
String s="";
switch (item.getItemId()) {
case R.id.MnuOpc1:
s="Opcion 1. Informatica”; break;
case R.id.MnuOpc1a:
s="Opcion 1a. DAM"; break;
case R.id.MnuOpc1b:
s="Opcion 1b. ASIR"; break;
case R.id.SubMnuOpc2:
s="Opcion 2. RAE"; break;
default: return super.onOptionsItemSelected(item);
}
if (s.length()>0) //si elección válida, s!=””
Toast.makeText(getApplicationContext(), s,
Toast.LENGTH_SHORT).show();
return true; //volver siempre con true desde un menú
}
Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 7 / 10
5.- Errores de eclipse:
En algunos casos Eclipse da un error que no existe, que evita poder ejecutar el código. Este error se distingue porque solo aparece una X roja junto a la carpeta contenedora del proyecto, pero
en ningún otro lugar del proyecto, como puede ser: clase, layout, String.xml, etc. Es un problema de Eclipse por no poder referenciar R. Este error viene por problemas con las referencias que
provocan que R no puede regenerarse. Normalmente se corrige solo, pero alguna veces no. Existen varias soluciones que pueden corregir el problema. Recomendamos empezar por la primera
solución propuesta y ver si se soluciona, sino pasar a la siguiente.
1.- cerrar eclipse , en win7 C:Users(username).android borrar la carpeta .android y luego abrir eclipse y todo funcionará bien.
2.- Comprobamos que Eclipse tenga marcado el tick “Build Automatically” que se encuantra en el menú “Project”.
3.- Comprobar que los XML estén bien formados. Es decir, abrir archivo a archivo de la carpeta “res”, para ver si Eclipse al abrirla marca el XML con fallo
(X roja) o Warning que impida la referencias (los Warning de “deprecated” o recomendaciones no son la causa). Normalmente el error viene porque
aparece un Warning sobre algún ID del XML, que se arregla eliminado la línea entera del ID, guardando todo, volviendo a crear el ID desde cero, y
guardando otra vez todo. Si es así, realizar los cambios oportunos y guardar todo.
4.- Para esta solución recomendamos realizar una copia de seguridad de todo el proyecto, por si acaso poder recuperar.
La mayoría de las veces este error se soluciona en la pestaña “Project” de la barra de tareas. Y seleccionando “Clean…”. Esto sirve para limpiar y recargar
el historial de errores de Eclipse. NOTA: Se recomienda encarecidamente hacer una copia del proyecto antes de hacer el “Clean…”.
Probamos a seleccionar “Clean projects selected below”, y seleccionamos exclusivamente el proyecto que tenga el problema. Damos a “OK”.
5.- Después de haber hecho un solo clean de la “Solución 4″ volvemos a reiniciar Eclipse.
Modificar un fichero cualquiera XML de la carpeta “res”. Por ejemplo, para que se quede como está añadir un espacio y quitarlo, luego guardarlo todo.
Ficheros LECTURA (obligatorio el uso de try & catch):
// abrir fichero en modo lectura
InputStream instream = null;
instream=openFileInput("fichero.txt");
// si hubo éxito en modo lectura, preparar la lectura
InputStreamReader inputreader = new InputStreamReader(instream);
BufferedReader buffreader = new BufferedReader(inputreader);
String linea,texto="";
// mientras haya líneas, cogerlas una a una
while (( linea = buffreader.readLine())!=null)
texto+=linea+"n"; //el n se pierde al leer cada línea
// Hacer lo que se desee con el texto leído
Toast.makeText(getApplicationContext(), texto, Toast.LENGTH_SHORT).show();
// cerrar el fichero
instream.close();
Ficheros ESCRITURA (obligatorio el uso de try & catch):
OutputStreamWriter out = new
OutputStreamWriter(openFileOutput("fichero.txt",MODE_APPEND));
//0 para sobreescribir (en vez de añadir)
String texto=”Linea1nLinea2nLinea3n...”;
// sacar la cadena
out.write(texto+"n");
out.close(); // cerrar fichero
LIMPIAR un fichero = 0 Bytes (obligatorio el uso de try & catch):
OutputStreamWriter out = new
OutputStreamWriter(openFileOutput("fichero.txt",0)); //0 para
sobreescribir
out.write(""); // sacar cadena vacía
out.close(); // cerrar fichero
Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 8 / 10
6.- Uso general
PACKAGE-IMPORT:
package ejemplo.conversor; import ejemplo.conversor.EurosptasActivity; import ejemplo.conversor.R; //año pasado 12-13 (si se pierde R y no funcionase automáticamente)
package es.carlosblanco.miapp; import android.app.Activity; //este año 13-14
import android.app.*; //Dialog, ...
import android.os.Bundle; import android.view.View; import android.view.View.*; //Listeners
import android.widget.*; //todos los widgets: Button, TextView, ..., etc
import android.content.*; import android.net.*; import android.os.*; import android.util.*; //llamadas
TOAST: Toast.makeText(getApplicationContext(), texto, Toast.LENGTH_SHORT).show(); //forma más rápida
HTML:
public void mostrar(View v)
{
final TextView visor=(TextView) findViewById(R.id.visor);
String textoconformato=Html.toHtml((Spanned) visor.getText()); //coger como spanned el texto y devolverlo como html con sus tags
Toast t=Toast.makeText(getApplicationContext(), textoconformato, Toast.LENGTH_SHORT);
t.show();
}
public void cambiar(View v)
{
final TextView visor=(TextView) findViewById(R.id.visor);
visor.setText(Html.fromHtml("<p>Hola en <b>negrita!!!</b></p>"));
}
DIALOG:
Primero definir un layout dialogo.xml... <LinearLayout ...> <TextView android:id="@+id/zonatexto" ... /> </LinearLayout>
Dialog d = new Dialog(AlertaActivity.this); //nuevo dialogo de mi programa.this
d.setContentView(R.layout.dialogo); //su diseño lo marca el fichero dialogo.xml (layout)
d.setCancelable(true); //Cancelable=SI
d.setTitle("Texto del dialogo"); //modifico el contenido del diálogo
d.show(); //lo muestro
CERRAR APP: finish(); //ej: en un on click
CHECKBOX:
public void desactivar(View v)
{
final CheckBox chkMillonario = (CheckBox)findViewById(R.id.chkMillonario);
if (chkMillonario.isChecked()) chkMillonario.setChecked(false);//si aceptas ser millonario, te lo desactivo. Ej: Activar/Desactivar
}
RADIOGROUP-RADIOBUTTON: //Para activar uno, se deben desactivar los demás usando el método: .setChecked(boolean);
final RadioGroup radios=(RadioGroup) findViewById(R.id.radioGroup1);
final RadioButton masculino=(RadioButton) findViewById(R.id.radio0);
final RadioButton femenino=(RadioButton) findViewById(R.id.radio1);
int selectedId = radios.getCheckedRadioButtonId();
if (selectedId==masculino.getId()) ; else if (selectedId==femenino.getId()) ; //Marcado masculino o sinó miro si marcado fenemino
Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 9 / 10
SPINNER(cmb): Oncreate para meterle los datos...
final TextView lblMensaje = (TextView)findViewById(R.id.LblMensaje);
final Spinner cmbOpciones = (Spinner)findViewById(R.id.cmbOpciones);
final String[] datos = new String[]{"ASIR","DAM","RAE","AF","GA","PCPI informática"};
//Alternativa 1: Array java. El adaptador usará el vector: datos
ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, datos); //layout standar para spinner
//Alternativa 2: Recurso XML de tipo string-array. El recurso es @resource
valores_array.xml en res/values: <?xml ...?><resources> <string-array name="valores_array"><item>Elem1</item><item>Elem2</item>...</string-array></resources>
//ArrayAdapter<CharSequence> adaptador = ArrayAdapter.createFromResource(this, R.array.valores_array, android.R.layout.simple_spinner_item);
adaptador.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); //mostrar los elementos en un visor por defecto (con el piquito abajo derecha)
cmbOpciones.setAdapter(adaptador); //decir al combo que coja los elementos del adaptador
//***Para recoger el elem seleccionado: String textoseleccionado = cmbOpciones.getSelectedItem().toString();
//Elegir una opción sabiendo el valor que contiene de tipo string: int i=.getPosition(textolinea); .setSelection(i);
//Elegir una opción por su posición/índice de 0..N-1: .setSelection(indice);
VALUES:
./res/values/strings.xml: <resources> <string name="app_name">Android Spinner</string>...</resources>
./res/values/valores_array.xml: <?xml ...?><resources> <string-array name="valores_array"><item>Elem1</item><item>Elem2</item>...</string-array></resources>
./res/values/styles.xml: <resources><style name="AppTheme" parent="android:Theme.Light" /> ... </resources>
BUNDLE: contenedor que permite guardar datos (+- como una lista o vector) con métodos para leerlos desde otra clase/actividad (clase, pantalla o form)
//Métodos: .getFloat(strIndex) .getDouble(strIndex) .getString(strIndex) .getInt(strIndex) .getLong(strIndex) y sus correspondientes put.
Bundle contenedor = new Bundle(); //Create bundle to reference values in next class
contenedor.putInt("ODD", 1);
contenedor.putLong("EVEN", 2);
contenedor.putString("AUTOR", "Carlos Blanco");
contenedor.putFloat("PI", 3.141592625);
//After all data has been entered and calculated, go to new page for results (inicio la otra actividad)
Intent myIntent = new Intent(); //actividad==intent
myIntent.setClass(getBaseContext(), Results.class); //la clase que llamará es Results.java, aunque puedo cambiar el valor a ´lo que sea´.class
startActivity(myIntent);
//Add the bundle into myIntent for referencing variables
myIntent.putExtras(contenedor);
//En la zona destino para acceder a los valores haremos...: Bundle contenedor = getIntent().getExtras(); int odd=contenedor.getInt("ODD"); String
autor=contenedor.getString("AUTOR");
Ej clase FLOAT:
Float euro=new Float(166.386); Float ptas=new Float(textocaja); Float resul=ptas*euro; String s=resul.toString();
Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 10 / 10

Más contenido relacionado

La actualidad más candente

Manejo de eventos en java
Manejo de eventos en javaManejo de eventos en java
Manejo de eventos en javaaleja09_40
 
Swing
SwingSwing
SwingEPN
 
AWT- JAVA
AWT- JAVAAWT- JAVA
AWT- JAVAale8819
 
Manejo de Eventos en java
Manejo de Eventos en javaManejo de Eventos en java
Manejo de Eventos en javaSilvana Vargas
 
Miswing 110511215936-phpapp01
Miswing 110511215936-phpapp01Miswing 110511215936-phpapp01
Miswing 110511215936-phpapp01Ricardo Garcia
 
Desarrollo de apps Android basadas en localización
Desarrollo de apps Android basadas en localizaciónDesarrollo de apps Android basadas en localización
Desarrollo de apps Android basadas en localizaciónSlashMobility.com
 
Programa Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viverosPrograma Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viverosjubacalo
 

La actualidad más candente (13)

Manejo de eventos en java
Manejo de eventos en javaManejo de eventos en java
Manejo de eventos en java
 
Swing
SwingSwing
Swing
 
Clase 6 objetos de javaScript
Clase 6 objetos de javaScriptClase 6 objetos de javaScript
Clase 6 objetos de javaScript
 
J query
J queryJ query
J query
 
Clase 7 objetos globales de javaScript
Clase 7 objetos globales de javaScriptClase 7 objetos globales de javaScript
Clase 7 objetos globales de javaScript
 
Clase 5 funciones en javaScript
Clase 5 funciones en javaScriptClase 5 funciones en javaScript
Clase 5 funciones en javaScript
 
Vbr Awt 01
Vbr Awt 01Vbr Awt 01
Vbr Awt 01
 
AWT- JAVA
AWT- JAVAAWT- JAVA
AWT- JAVA
 
Manejo de Eventos en java
Manejo de Eventos en javaManejo de Eventos en java
Manejo de Eventos en java
 
Swing, awt y JOptionPane de java
Swing, awt y JOptionPane de java Swing, awt y JOptionPane de java
Swing, awt y JOptionPane de java
 
Miswing 110511215936-phpapp01
Miswing 110511215936-phpapp01Miswing 110511215936-phpapp01
Miswing 110511215936-phpapp01
 
Desarrollo de apps Android basadas en localización
Desarrollo de apps Android basadas en localizaciónDesarrollo de apps Android basadas en localización
Desarrollo de apps Android basadas en localización
 
Programa Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viverosPrograma Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viveros
 

Similar a Carlos blanco resumen mm android controles 10pag v5

ANDROID BOOTCAMP 101: MI PRIMERA APLICACIÓN ANDROID - CÓMO INICIAR UN EMPREND...
ANDROID BOOTCAMP 101: MI PRIMERA APLICACIÓN ANDROID - CÓMO INICIAR UN EMPREND...ANDROID BOOTCAMP 101: MI PRIMERA APLICACIÓN ANDROID - CÓMO INICIAR UN EMPREND...
ANDROID BOOTCAMP 101: MI PRIMERA APLICACIÓN ANDROID - CÓMO INICIAR UN EMPREND...leofishman
 
Android Bootcamp - GTUG Uruguay
Android Bootcamp - GTUG UruguayAndroid Bootcamp - GTUG Uruguay
Android Bootcamp - GTUG Uruguaygtuguruguay
 
LabAndroid: Taller "Mi Primera Aplicación Android"
LabAndroid: Taller "Mi Primera Aplicación Android"LabAndroid: Taller "Mi Primera Aplicación Android"
LabAndroid: Taller "Mi Primera Aplicación Android"Alberto Ruibal
 
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con Android
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con AndroidTutorial Nro. 2 de Desarollo de Aplicaciones Móviles con Android
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con AndroidLuis Ernesto Castillo Alfaro
 
Tutorial Nro 1 de Desarrollo de Aplicaciones Móviles con Android
Tutorial Nro 1 de Desarrollo de Aplicaciones Móviles con AndroidTutorial Nro 1 de Desarrollo de Aplicaciones Móviles con Android
Tutorial Nro 1 de Desarrollo de Aplicaciones Móviles con AndroidLuis Ernesto Castillo Alfaro
 
Hola mundo1
Hola mundo1Hola mundo1
Hola mundo1arecerv
 
Las aplicasiones de androi ddd
Las aplicasiones de androi dddLas aplicasiones de androi ddd
Las aplicasiones de androi dddSinai Rosales
 
Aplicación móvil con acceso a datos
Aplicación móvil con acceso a datosAplicación móvil con acceso a datos
Aplicación móvil con acceso a datosSusi Perez Gallegos
 
CLASE MUESTRA.pptx
CLASE MUESTRA.pptxCLASE MUESTRA.pptx
CLASE MUESTRA.pptxAdrinGarca77
 
TEMAS DE JAVA DEL 11 AL 23
TEMAS DE JAVA DEL 11 AL 23TEMAS DE JAVA DEL 11 AL 23
TEMAS DE JAVA DEL 11 AL 23equipotresamp
 
Android 2 traducido
Android 2 traducidoAndroid 2 traducido
Android 2 traducidoUPBC
 
Tips componentes swing_v5
Tips componentes swing_v5Tips componentes swing_v5
Tips componentes swing_v5ggzhack
 

Similar a Carlos blanco resumen mm android controles 10pag v5 (20)

ANDROID BOOTCAMP 101: MI PRIMERA APLICACIÓN ANDROID - CÓMO INICIAR UN EMPREND...
ANDROID BOOTCAMP 101: MI PRIMERA APLICACIÓN ANDROID - CÓMO INICIAR UN EMPREND...ANDROID BOOTCAMP 101: MI PRIMERA APLICACIÓN ANDROID - CÓMO INICIAR UN EMPREND...
ANDROID BOOTCAMP 101: MI PRIMERA APLICACIÓN ANDROID - CÓMO INICIAR UN EMPREND...
 
Android Bootcamp - GTUG Uruguay
Android Bootcamp - GTUG UruguayAndroid Bootcamp - GTUG Uruguay
Android Bootcamp - GTUG Uruguay
 
LabAndroid: Taller "Mi Primera Aplicación Android"
LabAndroid: Taller "Mi Primera Aplicación Android"LabAndroid: Taller "Mi Primera Aplicación Android"
LabAndroid: Taller "Mi Primera Aplicación Android"
 
Android
AndroidAndroid
Android
 
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con Android
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con AndroidTutorial Nro. 2 de Desarollo de Aplicaciones Móviles con Android
Tutorial Nro. 2 de Desarollo de Aplicaciones Móviles con Android
 
Tutorial Nro 1 de Desarrollo de Aplicaciones Móviles con Android
Tutorial Nro 1 de Desarrollo de Aplicaciones Móviles con AndroidTutorial Nro 1 de Desarrollo de Aplicaciones Móviles con Android
Tutorial Nro 1 de Desarrollo de Aplicaciones Móviles con Android
 
Introduccion a Android
Introduccion a AndroidIntroduccion a Android
Introduccion a Android
 
Hola mundo1
Hola mundo1Hola mundo1
Hola mundo1
 
Hola mundo
Hola mundoHola mundo
Hola mundo
 
Las aplicasiones de androi ddd
Las aplicasiones de androi dddLas aplicasiones de androi ddd
Las aplicasiones de androi ddd
 
Manual marichuy
Manual marichuyManual marichuy
Manual marichuy
 
Manual marichuy
Manual marichuyManual marichuy
Manual marichuy
 
Clases de Programación Android
Clases de Programación AndroidClases de Programación Android
Clases de Programación Android
 
Aplicación móvil con acceso a datos
Aplicación móvil con acceso a datosAplicación móvil con acceso a datos
Aplicación móvil con acceso a datos
 
CLASE MUESTRA.pptx
CLASE MUESTRA.pptxCLASE MUESTRA.pptx
CLASE MUESTRA.pptx
 
TEMAS DE JAVA DEL 11 AL 23
TEMAS DE JAVA DEL 11 AL 23TEMAS DE JAVA DEL 11 AL 23
TEMAS DE JAVA DEL 11 AL 23
 
Android 2 traducido
Android 2 traducidoAndroid 2 traducido
Android 2 traducido
 
Preguntasviri
PreguntasviriPreguntasviri
Preguntasviri
 
Multimedia en android
Multimedia en androidMultimedia en android
Multimedia en android
 
Tips componentes swing_v5
Tips componentes swing_v5Tips componentes swing_v5
Tips componentes swing_v5
 

Último

Theme design in Plone 6 - World Plone Day 2024
Theme design in Plone 6 - World Plone Day 2024Theme design in Plone 6 - World Plone Day 2024
Theme design in Plone 6 - World Plone Day 2024Leonardo J. Caballero G.
 
Presentación de html, css y javascript.
Presentación  de html, css y javascript.Presentación  de html, css y javascript.
Presentación de html, css y javascript.CeteliInmaculada
 
Semana 5-Conceptualización del lenguaje de programación C++
Semana 5-Conceptualización del lenguaje de programación C++Semana 5-Conceptualización del lenguaje de programación C++
Semana 5-Conceptualización del lenguaje de programación C++luzgaray6
 
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxMacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxcalzadillasluis134
 
Introducción a Plone CMS - World Plone Day 2024
Introducción a Plone CMS - World Plone Day 2024Introducción a Plone CMS - World Plone Day 2024
Introducción a Plone CMS - World Plone Day 2024Leonardo J. Caballero G.
 
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVOSISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVOELIAMARYTOVARFLOREZD
 

Último (6)

Theme design in Plone 6 - World Plone Day 2024
Theme design in Plone 6 - World Plone Day 2024Theme design in Plone 6 - World Plone Day 2024
Theme design in Plone 6 - World Plone Day 2024
 
Presentación de html, css y javascript.
Presentación  de html, css y javascript.Presentación  de html, css y javascript.
Presentación de html, css y javascript.
 
Semana 5-Conceptualización del lenguaje de programación C++
Semana 5-Conceptualización del lenguaje de programación C++Semana 5-Conceptualización del lenguaje de programación C++
Semana 5-Conceptualización del lenguaje de programación C++
 
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxMacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
 
Introducción a Plone CMS - World Plone Day 2024
Introducción a Plone CMS - World Plone Day 2024Introducción a Plone CMS - World Plone Day 2024
Introducción a Plone CMS - World Plone Day 2024
 
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVOSISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
 

Carlos blanco resumen mm android controles 10pag v5

  • 1. 1.-Posibilidades de recepción de eventos: listener y método. Eventos con listener Eventos sin listener (método para el evento definido en propiedades) package com.carlosblanco.android; import android.os.Bundle; //todos los widget:button, TextView, ..., etc import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.*; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final Button boton = (Button) findViewById(R.id.button1); boton.setOnClickListener(new View.OnClickListener() { public void onClick(View sender) { Toast.makeText(getApplicationContext(), "Hola DAM2 con listener y toast", Toast.LENGTH_LONG).show(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }//activity package com.carlosblanco.android; import android.os.Bundle; //todos los widget:button, TextView, ..., etc import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.*; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public void procesar(View clickedButton) { Toast.makeText(getApplicationContext(), "Hola 2ºDAM eventos sin listener", Toast.LENGTH_LONG).show(); } } //Recuerda poner procesar en el evento on click del botón en sus // propiedades desde la pantalla de diseño de layouts Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 1 / 10
  • 2. 2.-Controles Android: Control Abrev. Uso Dibujo Atributos Métodos Listener / Código de uso Adapter Estructura de datos para controles de selección: Spinner, ListView, GridView, Gallery, ... //ArrayAdapter:Es el más sencillo de todos los adaptadores, y provee de datos a un control de selección a partir de un array de objetos de cualquier tipo. final String[] datos = new String[]{"Elem1","Elem2","Elem3","Elem4","Elem5"}; ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this,android. R.layout.simple_spinner_item, datos); //this es la actividad actual, cte del sistema, y el vector de datos. //SimpleAdapter: Se utiliza para mapear datos sobre los diferentes controles definidos en un fichero XML de layout. <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="valores_array"> <item>Elem1</item> <item>Elem2</item> <item>Elem3</item> <item>Elem4</item> <item>Elem5</item> </string-array> </resources> ArrayAdapter<CharSequence> adaptador = ArrayAdapter.createFromResource(this, R.array.valores_array, android.R.layout.simple_spinner_item); //activiy, id_arr_xml, cte) //SimpleCursorAdapter: Se utiliza para mapear las columnas de un cursor abierto sobre una base de datos, sobre los diferentes elementos visuales del control de selección. pendiente... Ejemplos de adaptadores sobre el vector Java anterior: ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this,android. R.layout.simple_spinner_item, datos); //this=actividad actual, item=cte , y datos=vector. ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this,android. R.layout.simple_list_item_1, datos); ...pendiente de acabar otros ejemplos con listas, etc... Activity dp=Density-independent Pixels sp = Scale-independent Pixels .setTitle(String) Button cmd Botón de comando simple o con imagen (drawableLeft) android:text="texto" android:text="@string/cadena" android:background="color" android:typeface="fuente" android:drawableLeft=img android:textSize="10sp|10dp", ... final btnBoton1 = (Button)findViewById(R.id.BtnBoton1); final lblMensaje=(TextView)findViewById(R.id.TextView1); cmdBoton1.setOnClickListener(new View.OnClickListener() { public void onClick(View sender) { lblMensaje.setText("Botón 1 pulsado!"); } }); CheckBox chk Interruptor on/off. android:text="@string/cadena" android:checked="false" Boolean .isChecked() .setChecked(Boolean); final CheckBox fumador = (CheckBox)findViewById(R.id.checkBox1); fumador.setOnCheckedChangeListener( new CheckBox.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) …; else …; //algo que hacer en cada estado ON/OFF } //onCheckedChange }); //Listener EditText txt Caja de texto editable con plantillas para número, email, ... nombre y clave. android:lines="5" android:hint="texto" (ayuda) android:inputType="normal|phone|num ber|textPersonName|textUri|textEmailAd dress|textPassword|text" String .getText().toString() .setText(String) int .length() final EditText txtCaja = (EditText) findViewById(R.id.editText1); String s=txtCaja.getText().toString(); txtCaja.setText("Otro texto en pantalla"); lblTexto.setText("Hola " + etCaja.getText().toString()); Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 2 / 10
  • 3. GridView android:numColumns=”entero|auto_fit” android:columnWidth=”enterosp|dp|px”, android:horizontalSpacing=”enterosp|dp” android:verticalSpacing=”enterosp|dp” android:stretchMode=“columnWidth|spacingWidth” Una vez definida la interfaz de usuario, la forma de asignar los datos desde el código de la aplicación es completamente análoga a la ya comentada tanto para las listas desplegables como para las listas estáticas: creamos un array genérico que contenga nuestros datos de prueba, declaramos un adaptador de tipo ArrayAdapter pasándole en este caso un layout genérico (simple_list_item_1, compuesto por un simple TextView) y asociamos el adaptador al control GridView mediante su método setAdapter(): String[] datos = new String[25]; //mejor si es 1 atributo de la clase for(int i=1; i<=25; i++) datos[i-1] = "Dato " + i; ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datos); final grdOpciones = (GridView)findViewById(R.id.GridOpciones); grdOpciones.setAdapter(adaptador); grdOpciones.setOnItemClickListener( new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, android.view.View v, int position, long id) { lblMensaje.setText("Opción seleccionada: " + datos[position]); } }); ImageButton cmd Botón con una imagen en su interior. android:src="@drawable/ok" //ok.png .show() .setDuration(Toast.LENGTH_ LONG/SHORT); ( = = = setOnClickListener) ImageView img Permite mostrar imágenes en la app. android:src="@drawable/hola" //hola.png android:scaleType = “entero” (5=CENTER, 6=CENTER_CROP, 7=CENTER_INSIDE, …) final ImageView img= (ImageView)findViewById(R.id.imageView1); img.setImageResource(R.drawable.hola); //cambiar img en Java ListView lst La cte a usar en el adaptador es: android.R.layout.simple_list _item_1 final lstOpciones = (ListView)findViewById(R.id.LstOpciones); lstOpciones.setAdapter(adaptador); RadioButton ra Opción única de entre varias. android:text="@string/cadena" android:checked="false" Boolean .isChecked() String s; final RadioButton raMill= (RadioButton) findViewById(R.id.raMill); if (raMill.isChecked()) s="Has seleccionado la opción de ser millonario"; RadioGroup rg Agrupa varios RadioButtons para que solo uno de ellos sea marcado, desactivando los demás. Int .getCheckedRadioButtonId() Boolean .check(R.id.cte) //ON .clearCheck() //todos a OFF String s; RadioGroup radios=(RadioGroup) findViewById(R.id.radioGroup1); RadioButton masculino=(RadioButton) findViewById(R.id.radio0); RadioButton femenino=(RadioButton) findViewById(R.id.radio1); int selectedId = radios.getCheckedRadioButtonId(); if (selectedId==masculino.getId()) s="Veo que eres un hombren"; if (selectedId==R.id.radio1) s="Veo que eres una mujern"; //otra forma RatingBar android:numStars="10" android:stepSize="1.0" android:rating="2.0" android:isIndicator="false" (v4.0) .getRating() ratingBar = (RatingBar) findViewById(R.id.ratingBar); txtRatingValue = (TextView) findViewById(R.id.txtRatingValue); //si la puntuación cambia, mostrarla en el textview ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() { public void onRatingChanged(RatingBar ratingBar, float rating, Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 3 / 10
  • 4. boolean fromUser) { txtRatingValue.setText(String.valueOf(rating)); } }); SeekBar android:max="100" android:progress="50" android:secondaryProgress="75" .getProgress() barra.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { ... } @Override public void onStartTrackingTouch(SeekBar seekBar) { ... } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if(fromUser) …; //el usuario ha cambiado la posición } }); //listener Spinner cmb Selector de una opción entre varias (combo). Requiere un String[] o un string-array de .xml Android:prompt="Choose a Planet" .getSelectedItem() .setAdapter(adapter); En listener definimos 2 métodos onItemSelected para cuando se seleccione una opción en la lista desplegable. onNothingSelected cuando no haya ninguna opción seleccionada (pej adaptador sin datos). cmbOpciones.setOnItemSelectedListener( new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, android.view.View v, int position, long id) { lblMensaje.setText("Seleccionado: " + datos[position]); } public void onNothingSelected(AdapterView<?> parent) { lblMensaje.setText(""); } }); TextView lbl Enlace a URL, teléfono o google maps al hacer clic. android:autoLink="none|web|email|pho ne| map|All" (todos los del textview normal) TextView lbl Texto no editable android:text="Texto de ejemplo" android:background="#AA44FF" android:typeface="monospace" .setText(String) final lblMensaje=(TextView)findViewById(R.id.TextView1); lblMensaje.setText("El texto ha cambiado!!!"); lblMensaje.setBackGroundColor(Color.Blue); Toast Mensaje temporal en pantalla. Toast.makeText(getApplicationContext(), "Mensaje que desaparece Rapido",Toast.LENGTH_SHORT).show(); Toast.makeText(getApplicationContext(), "Has seleccionado G", Toast.LENGTH_LONG).show(); ToggleButton cmd Fusión de un botón y un checkbox. Permite un texto para cada estado. android:textOn="texto" android:textoOff ="texto" Boolean .isChecked() final btnBoton2 = (ToggleButton)findViewById(R.id.BtnBoton2); btnBoton2.setOnClickListener(new View.OnClickListener() { public void onClick(View sender) { if(btnBoton2.isChecked()) lblMensaje.setText("Botón 2: ON"); else lblMensaje.setText("Botón 2: OFF"); } }); Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 4 / 10
  • 5. 3.-Programando: Media Volume Permite acceso a los volúmenes de audio. AudioManager.STREAM_MUSIC AudioManager.STREAM_RING AudioManager.STREAM_ALARM AudioManager.STREAM_NOTIFICATION AudioManager.STREAM_SYSTEM AudioManager.STREAM_VOICECALL El último parámetro para setStreamVolume(), es un flasg que dice como indicar al usuario el cambio en el volumen. FLAG_PLAY_SOUND – hacer un beep FLAG_SHOW_UI – con un toast FLAG_VIBRATE – con una vibración mAudioManager.adjustStreamVolume(AudioManager.STR EAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI); ADJUST_LOWER Bajar volumen ADJUST_RAISE Subir volumen ADJUST_SAME Dejar el mismo volumen private AudioManager audio; audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE); //dentro del onCreate @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: audio.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI); return true; case KeyEvent.KEYCODE_VOLUME_DOWN: audio.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI); return true; default: return false; } } //Poner volumen de videos al máximo AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); audioManager.setStreamVolume(AudioManager.STREAM_MUSIC /*cuál*/, audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC) /*volumen*/, AudioManager.FLAG_SHOW_UI /*indicador al usuario*/); Camera <manifest ... > <uses-feature android:name="android.hardware.camera" /> ... </manifest ... > http://developer.android.com/training/camera/photobasics.html Camera myCamera=Camera.open(); if(myCamera!=null){ try{ //set camera parameters if you want to //... // here, the unused surface view and holder SurfaceView dummy=new SurfaceView(context) myCamera.setPreviewDisplay(dummy.getHolder()); myCamera.startPreview(); myCamera.takePicture(null, null, getJpegCallback()): }finally{ myCamera.close(); } }else{ ; } //booo, failed! private PictureCallback getJpegCallback(){ PictureCallback jpeg=new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { FileOutputStream fos; try { fos = new FileOutputStream("foto.jpg"); fos.write(data); fos.close(); } catch (IOException e) { ; } //do something about it } } }; } } MediaPlayer Métodos: .start(); MediaPlayer mPlayer = MediaPlayer.create(this, R.raw.ficheromp3); try { Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 5 / 10
  • 6. .pause() .stop(); Boolean .isPlaying(); Int .getCurrentPosition(); Int .getDuration(); .seekTo(Int); mPlayer.prepare(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } mPlayer.start(); Calls android.content.*; android.net.*; android.os.*; android.util.*; new Intent(Intent.ACTION_CALL); .setData(Uri.parse("tel:600111222")); try { Intent llamar = new Intent(Intent.ACTION_CALL); llamar.setData(Uri.parse("tel:600111222")); startActivity(llamar); } catch (ActivityNotFoundException activityException) { Log.e("Codigo de llama", "Ha fallado la llamada!!!", activityException); //Añadimos un log de ERROR (e=Error, w=Warning, ) } SMS android.telephony.* Debes usar try & catch SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage("600111222", null, "Texto del SMS...", null, null); . 4,-Recursos: Clic derecho en Values->New->Android XML File/ Color Creación del .XML: Clic derecho en Values/New/Android XML File/ Resource Type: Values. Project: dejamos así nuestro proyecto activo. File: color. Root Element: resources. (clic en finalizar). Formato de los colores: #RGB | #ARGB | #RRGGBB | #AARRGGBB Acceso como propiedad: @color/[NombreDelColor]. Ej: @color/Rojo Acceso desde código Java: R.color.NombreDelColor. Ej: R.color.Rojo Puede haber más de un fichero de colores, se gestionarán como uno solo < ?xml version="1.0" encoding="utf-8"?> < resources> < color name="Negro">#000000</color> < color name="Blanco">#FFFFFF</color> < color name="Gris">#808080 < color name="Amarillo">#FFFF00 <color name="rojotranslucido">#80ff0000</color> < color name="Rojo">#FF0000 < color name="Verde">#00FF00 < /resources> final RadioButton estado = (RadioButton) findViewById(R.id.Radio1); estado.setTextColor(getResources().getColor(R.color.Rojo)); Image Permite png, jpg, gif. @drawable/ok => ok.png android:contentDescription="texto alternativo" final ImageView img=(ImageView)findViewById(R.id.img); img.setImageResource(R.drawable.android); Drawable Fichero que los contiene: strings.xml http://docs.since2006.com/android/2.1-drawables.php http://guajirandro.blogspot.com.es/2012/09/aplicando-estilos-css-y-degrad ados-en.html < ?xml version="1.0" encoding="utf-8"?> < resources> <drawable name="redBox">#ff0000</drawable> < /resources> final TextView txt=(TextView)findViewById(R.id.txt); txt.setBackgroundResource(R.drawable.redBox); //fondo componente ImageView img2 = (ImageView)findViewById(R.id.img2); img2.setImageResource(R.drawable.ic_menu_camera); //usar icono Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 6 / 10
  • 7. String Permiten definir recursos de tipo texto para facilitar traducciones de apps. Acceso como propiedad: @string/[NombreCadena]. Ej: @string/saludo Acceso desde Java: getString(R.string.NombreCadena);. Ej: String x=getString(R.string.autor); String con formato:%1 primer param, %2 segundo ,... . $s=string; $d=int; %1$s => primer parámetro será una cadena %2$d => segundo parámetro será un entero (es simila a sprintf en PHP) Cadenas con HTML: CharSequence styledText = Html.fromHtml(str); Convertir a String: String cadenaformateada=styleText.toString(); <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Ejemplo1</string> <string name="euros">%1$s tiene %1$d eur</string> <string name="autor">Carlos Blanco</string> <string name="aviso">Debes <b>meter</b> tu <u>nombre</u> en la caja</string> </resources> final lblMensaje=(TextView)findViewById(R.id.TextView1); lblMensaje.setText(getString(R.string.autor)); int dinero = 200; //200 euros String autor=getString(R.string.autor); //Carlos Blanco String strfmt = getResources().getString(R.string.euros); //%1$ ... String resultado = String.format(strfmt, autor, dinero); //resultado="Carlos Blanco tiene 200 eur"; CharSequence styledText = Html.fromHtml(getString(R.string.aviso)); String cadenaformateada=styledText.toString(); //La convierte a String String otraforma=getString(R.string.aviso); //Coge la cadena con Html del fichero de recursos: @string/aviso String-array Es un conjunto de elementos o array de cadenas, que se define en un fichero de cadenas como por ejemplo strings.xml. Se usa para Spinners que siempre tienen las mismas elecciones. <string-array name="planetas_array"> <item>Mercurio</item> <item>Venus</item> <item>Tierra</item> </string-array> . Menus ./res/menu/ <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/MnuOpc1" android:title="Informatica"> <menu> <item android:id="@+id/MnuOpc1a" android:title="DAM" /> <item android:id="@+id/MnuOpc1b" android:title="ASIR" /> </menu> </item> <item android:id="@+id/SubMnuOpc2" android:title="RAE" /> </menu> public boolean onOptionsItemSelected(MenuItem item) { String s=""; switch (item.getItemId()) { case R.id.MnuOpc1: s="Opcion 1. Informatica”; break; case R.id.MnuOpc1a: s="Opcion 1a. DAM"; break; case R.id.MnuOpc1b: s="Opcion 1b. ASIR"; break; case R.id.SubMnuOpc2: s="Opcion 2. RAE"; break; default: return super.onOptionsItemSelected(item); } if (s.length()>0) //si elección válida, s!=”” Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show(); return true; //volver siempre con true desde un menú } Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 7 / 10
  • 8. 5.- Errores de eclipse: En algunos casos Eclipse da un error que no existe, que evita poder ejecutar el código. Este error se distingue porque solo aparece una X roja junto a la carpeta contenedora del proyecto, pero en ningún otro lugar del proyecto, como puede ser: clase, layout, String.xml, etc. Es un problema de Eclipse por no poder referenciar R. Este error viene por problemas con las referencias que provocan que R no puede regenerarse. Normalmente se corrige solo, pero alguna veces no. Existen varias soluciones que pueden corregir el problema. Recomendamos empezar por la primera solución propuesta y ver si se soluciona, sino pasar a la siguiente. 1.- cerrar eclipse , en win7 C:Users(username).android borrar la carpeta .android y luego abrir eclipse y todo funcionará bien. 2.- Comprobamos que Eclipse tenga marcado el tick “Build Automatically” que se encuantra en el menú “Project”. 3.- Comprobar que los XML estén bien formados. Es decir, abrir archivo a archivo de la carpeta “res”, para ver si Eclipse al abrirla marca el XML con fallo (X roja) o Warning que impida la referencias (los Warning de “deprecated” o recomendaciones no son la causa). Normalmente el error viene porque aparece un Warning sobre algún ID del XML, que se arregla eliminado la línea entera del ID, guardando todo, volviendo a crear el ID desde cero, y guardando otra vez todo. Si es así, realizar los cambios oportunos y guardar todo. 4.- Para esta solución recomendamos realizar una copia de seguridad de todo el proyecto, por si acaso poder recuperar. La mayoría de las veces este error se soluciona en la pestaña “Project” de la barra de tareas. Y seleccionando “Clean…”. Esto sirve para limpiar y recargar el historial de errores de Eclipse. NOTA: Se recomienda encarecidamente hacer una copia del proyecto antes de hacer el “Clean…”. Probamos a seleccionar “Clean projects selected below”, y seleccionamos exclusivamente el proyecto que tenga el problema. Damos a “OK”. 5.- Después de haber hecho un solo clean de la “Solución 4″ volvemos a reiniciar Eclipse. Modificar un fichero cualquiera XML de la carpeta “res”. Por ejemplo, para que se quede como está añadir un espacio y quitarlo, luego guardarlo todo. Ficheros LECTURA (obligatorio el uso de try & catch): // abrir fichero en modo lectura InputStream instream = null; instream=openFileInput("fichero.txt"); // si hubo éxito en modo lectura, preparar la lectura InputStreamReader inputreader = new InputStreamReader(instream); BufferedReader buffreader = new BufferedReader(inputreader); String linea,texto=""; // mientras haya líneas, cogerlas una a una while (( linea = buffreader.readLine())!=null) texto+=linea+"n"; //el n se pierde al leer cada línea // Hacer lo que se desee con el texto leído Toast.makeText(getApplicationContext(), texto, Toast.LENGTH_SHORT).show(); // cerrar el fichero instream.close(); Ficheros ESCRITURA (obligatorio el uso de try & catch): OutputStreamWriter out = new OutputStreamWriter(openFileOutput("fichero.txt",MODE_APPEND)); //0 para sobreescribir (en vez de añadir) String texto=”Linea1nLinea2nLinea3n...”; // sacar la cadena out.write(texto+"n"); out.close(); // cerrar fichero LIMPIAR un fichero = 0 Bytes (obligatorio el uso de try & catch): OutputStreamWriter out = new OutputStreamWriter(openFileOutput("fichero.txt",0)); //0 para sobreescribir out.write(""); // sacar cadena vacía out.close(); // cerrar fichero Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 8 / 10
  • 9. 6.- Uso general PACKAGE-IMPORT: package ejemplo.conversor; import ejemplo.conversor.EurosptasActivity; import ejemplo.conversor.R; //año pasado 12-13 (si se pierde R y no funcionase automáticamente) package es.carlosblanco.miapp; import android.app.Activity; //este año 13-14 import android.app.*; //Dialog, ... import android.os.Bundle; import android.view.View; import android.view.View.*; //Listeners import android.widget.*; //todos los widgets: Button, TextView, ..., etc import android.content.*; import android.net.*; import android.os.*; import android.util.*; //llamadas TOAST: Toast.makeText(getApplicationContext(), texto, Toast.LENGTH_SHORT).show(); //forma más rápida HTML: public void mostrar(View v) { final TextView visor=(TextView) findViewById(R.id.visor); String textoconformato=Html.toHtml((Spanned) visor.getText()); //coger como spanned el texto y devolverlo como html con sus tags Toast t=Toast.makeText(getApplicationContext(), textoconformato, Toast.LENGTH_SHORT); t.show(); } public void cambiar(View v) { final TextView visor=(TextView) findViewById(R.id.visor); visor.setText(Html.fromHtml("<p>Hola en <b>negrita!!!</b></p>")); } DIALOG: Primero definir un layout dialogo.xml... <LinearLayout ...> <TextView android:id="@+id/zonatexto" ... /> </LinearLayout> Dialog d = new Dialog(AlertaActivity.this); //nuevo dialogo de mi programa.this d.setContentView(R.layout.dialogo); //su diseño lo marca el fichero dialogo.xml (layout) d.setCancelable(true); //Cancelable=SI d.setTitle("Texto del dialogo"); //modifico el contenido del diálogo d.show(); //lo muestro CERRAR APP: finish(); //ej: en un on click CHECKBOX: public void desactivar(View v) { final CheckBox chkMillonario = (CheckBox)findViewById(R.id.chkMillonario); if (chkMillonario.isChecked()) chkMillonario.setChecked(false);//si aceptas ser millonario, te lo desactivo. Ej: Activar/Desactivar } RADIOGROUP-RADIOBUTTON: //Para activar uno, se deben desactivar los demás usando el método: .setChecked(boolean); final RadioGroup radios=(RadioGroup) findViewById(R.id.radioGroup1); final RadioButton masculino=(RadioButton) findViewById(R.id.radio0); final RadioButton femenino=(RadioButton) findViewById(R.id.radio1); int selectedId = radios.getCheckedRadioButtonId(); if (selectedId==masculino.getId()) ; else if (selectedId==femenino.getId()) ; //Marcado masculino o sinó miro si marcado fenemino Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 9 / 10
  • 10. SPINNER(cmb): Oncreate para meterle los datos... final TextView lblMensaje = (TextView)findViewById(R.id.LblMensaje); final Spinner cmbOpciones = (Spinner)findViewById(R.id.cmbOpciones); final String[] datos = new String[]{"ASIR","DAM","RAE","AF","GA","PCPI informática"}; //Alternativa 1: Array java. El adaptador usará el vector: datos ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, datos); //layout standar para spinner //Alternativa 2: Recurso XML de tipo string-array. El recurso es @resource valores_array.xml en res/values: <?xml ...?><resources> <string-array name="valores_array"><item>Elem1</item><item>Elem2</item>...</string-array></resources> //ArrayAdapter<CharSequence> adaptador = ArrayAdapter.createFromResource(this, R.array.valores_array, android.R.layout.simple_spinner_item); adaptador.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); //mostrar los elementos en un visor por defecto (con el piquito abajo derecha) cmbOpciones.setAdapter(adaptador); //decir al combo que coja los elementos del adaptador //***Para recoger el elem seleccionado: String textoseleccionado = cmbOpciones.getSelectedItem().toString(); //Elegir una opción sabiendo el valor que contiene de tipo string: int i=.getPosition(textolinea); .setSelection(i); //Elegir una opción por su posición/índice de 0..N-1: .setSelection(indice); VALUES: ./res/values/strings.xml: <resources> <string name="app_name">Android Spinner</string>...</resources> ./res/values/valores_array.xml: <?xml ...?><resources> <string-array name="valores_array"><item>Elem1</item><item>Elem2</item>...</string-array></resources> ./res/values/styles.xml: <resources><style name="AppTheme" parent="android:Theme.Light" /> ... </resources> BUNDLE: contenedor que permite guardar datos (+- como una lista o vector) con métodos para leerlos desde otra clase/actividad (clase, pantalla o form) //Métodos: .getFloat(strIndex) .getDouble(strIndex) .getString(strIndex) .getInt(strIndex) .getLong(strIndex) y sus correspondientes put. Bundle contenedor = new Bundle(); //Create bundle to reference values in next class contenedor.putInt("ODD", 1); contenedor.putLong("EVEN", 2); contenedor.putString("AUTOR", "Carlos Blanco"); contenedor.putFloat("PI", 3.141592625); //After all data has been entered and calculated, go to new page for results (inicio la otra actividad) Intent myIntent = new Intent(); //actividad==intent myIntent.setClass(getBaseContext(), Results.class); //la clase que llamará es Results.java, aunque puedo cambiar el valor a ´lo que sea´.class startActivity(myIntent); //Add the bundle into myIntent for referencing variables myIntent.putExtras(contenedor); //En la zona destino para acceder a los valores haremos...: Bundle contenedor = getIntent().getExtras(); int odd=contenedor.getInt("ODD"); String autor=contenedor.getString("AUTOR"); Ej clase FLOAT: Float euro=new Float(166.386); Float ptas=new Float(textocaja); Float resul=ptas*euro; String s=resul.toString(); Carlos Blanco Domínguez – 2013-2014 -Desarrollo de Aplicaciones Multiplataforma - www.cmaleon.es - DAM2 Pág 10 / 10