Activities/Intents en Android LSUB, GSYC, URJC

Documentos relacionados
Ejercicio 18. Configuración de Widgets en Android. Android Con Java. Ejercicio 18. Configuración de Widgets en Android. Curso de Android con Java

ALMACENAMIENTOS DE DATOS EN ANDROID CON SQLITE

Android Manejo de Eventos. Rogelio Ferreira Escutia

Ejercicio 4. Manejo de Layouts en Android. Android Con Java. Ejercicio 4. Manejo de Layouts en Android. Curso de Android con Java

Programación Android. Alejandro Alcalde. elbauldelprogramador.com

Ejercicio 3. Manejo de la Vista y Eventos en Android Ejercicio 3 Curso de Android con Java Derechos Res Dere e c rvados hos Res Gl e obal rva

Programación en Android LSUB, GSYC, URJC

CODIGO PROYECTO: AppPixelproServicioWeb Proyecto Android - Servicio Web

Ejercicio 16. Mejora de Notificaciones en Android. Android Con Java. Ejercicio 16. Mejora de Notificaciones en Android. Curso de Android con Java

PRACTICAS DE ANDROID 12 - Lanzar un segundo "Activity" y pasar parámetros Problema:

Android Con Java. Ejercicio 2. Ciclo de Vida de las Actividades en Android. Ejercicio 2. Ciclo de Vida de las Actividades en Android

Cursos de orientación profesional

Manual Mca006. Manual Mca006 CURSO ANDROID DESARROLLO de APLICACIONES MÓVILES, 24 horas

Interfaz de usuario Layout Vistas Adaptadores Eventos de interacción Estilos y temas

Con este tutorial podrás aprender a cómo empezar a crear apps en Android, empezaremos con algo muy simple para que poco a poco vayas conociendo.

GUIA DE LABORATORIO N 1

Android Creación de una aplicación sencilla: Forwarding - Página 1 -

Servicios LSUB, GYSC, URJC

Interfaces de usuario [Desarrollo de aplicaciones para Android]

Temas. CopyRight emmmnmmma - All rights reserved 2

Hola Android. Introducción al desarrollo de aplicaciones para Android

Qué ofrece Autentia Real Business Solutions S.L?

Testing. Contenidos. Proyectos de tests. Curso 13/14

Curso 13/14. Desarrollo de aplicaciones Android. Testing

Red en Android LSUB, GYSC, URJC

Ejercicio 20. SQLite en Android. Android Con Java. Ejercicio 20. Uso de SQLite en Android. Curso de Android con Java

SALVADOR GÓMEZ OLIVER

TALLER DE INICIACIÓN A ANDROID

Introducción al manejo de Bases de Datos con SQLite. Version Android

Desarrollo de apps para móviles Android. Conceptos básicos de las aplicaciones Android

ANDROID BÁSICO - E-LEARNING - EN LÍNEA

CREACIÓN DE NUEVAS ACTIVIDADES

Curso de introducción a Android

Curso de Android con Java

INTRODUCCIÓN.

Programación Android. Rafael Morón Abad

Índice. Herramientas de desarrollo. Historia Qué es Android? Arquitectura del sistema. Componentes Android Modelos de Negocio

Servicios de la plataforma Android

Aplicaciones con Servicio Web

Taller Mi Primera Aplicación Android

SESIÓN 5 MANEJO DE BASES DE DATOS SQLITE

Introducción a Java LSUB. 30 de enero de 2013 GSYC

Programación Android. Rafael Morón Abad

Tema 2: Diseño de servicios para móviles

Componentes básicos de Android

1. INTRODUCCIÓN Acerca de este libro A quién va dirigido

Crear una Activity en Android. Paso por paso

ANEXO 2: Código fuente de la aplicación

Capitulo 4: Componentes Android

PROGRAMADOR JR. PARA EL SISTEMA OPERATIVO ANDROID

Anexo. Control de errores

GUIA DE PRACTICA (EX Aula opcional) LED RGB controlado por Arduino desde un dispositivo mo vil con SO Android 2.2 o superior.

Android. pág. 1 Tutoriales, mini-tutoriales y how-tos de Android //

14 - Almacenamiento de datos en un archivo de texto en la memoria interna Problema 1:

Escuela Superior de Ingeniería

Programación de Dispositivos Móviles. Introducción

MASTER DESARROLLO DE APLICACIONES ANDROID

10. Gráficos en dos dimensiones

Almacenamiento en Android

package com.example.dialogov1;

Programando para Android: una sencilla aplicación

Ejercicio 21. Manejo de Sonido en Android. Android Con Java. Ejercicio 21. Manejo de Sonido en Android. Curso de Android con Java

Android avanzado. Sesión 6: Depuración y pruebas. Experto en Desarrollo de Aplicaciones para Dispositivos Móviles

Interfaces de usuario [Desarrollo de aplicaciones para Android]

Programación Android. Rafael Morón Abad

Tutorial 1: Desarrollo de un plugin

Aplicación para lista de tareas

Diseño de interfaces gráficas. JOSE LUIS BERENGUEL GÓMEZ Febrero 2012

Interfaces de usuario [Desarrollo de aplicaciones para Android]

Desarrollo de apps para móviles Android. Creación de aplicaciones para móviles/tablets Android

Proyecto de Fin de Máster

Bienvenido al emocionante mundo del

TRABAJO FINAL DE CARRERA

Introducción a Android

Concurrencia en Android LSUB, GYSC, URJC

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

FACULTAD DE INGENIERÍA

MODELO DE IMPLEMENTACIÓN

Aplicación Android de Asistencia al Caminante

Taller Caldum Introducción al desarrollo Android

Unidad 5. Interfaz de Usuario

Servicios Avanzados. Índice. 1 Servicios en segundo plano Notificaciones AppWidgets Publicación de software...8

Tutorial básico del entorno de desarrollo Eclipse.

Hola, Mundo con pretensiones

Pruebas de unidad con JUnit

Clase Práctica Nº 1 ED 2015

INTRODUCCIÓN A ANDROID

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

ATLAS MANUAL DE USUARIO Pruebas con Selenium

Lenguaje Java Avanzado

Integración de guia1 y guia2 utilizando la aplicación Mixare

Google Cloud EndPoints (Parte II)

Principios de la programación en Android y API básico

Tutorial cliente Twitter para Android

Cursos de orientación profesional

Android Basic Development Jorge Luis Hernández C.

Android Guía de desarrollo de aplicaciones para Smartphones y Tabletas

Escrito por Renan Huanca Sábado, 28 de Febrero de :46 - Actualizado Sábado, 28 de Febrero de :09

La funcionalidad básica es la del proyecto 1 (Pacman III). Sobre ella reemplazamos la interfaz de usuario para adaptarla al nuevo entorno

ANDROID INTERMEDIO - E-LEARNING - EN LÍNEA

Transcripción:

Activities/Intents en Android LSUB, GSYC, URJC

Activity Una unidad de ejecución Para organizar una pantalla Ejecuta no mucho tiempo Y se comunica con otras Arranca otras

Intent Una operación que queremos hacer Referencia una Activity Directamente Con una URI

Bundles Un Bundle es un conjunto de claves:valor Java: (Activity, original) Intent activityintent = new Intent(this, NewActivity.class); Bundle newactivityinfo = new Bundle(); newactivityinfo.putblah( ); // putdouble, putstring, etc. activityintent.putextras(newactivityinfo); startactivity(activityintent); Java: (Activity, nueva) Intent intent = getintent(); Bundle info = intent.getextras(); if (info!= null) { /* Sacar valores con info.getblah(...) */ }

Opción 1: Meter el bundle entero Bundle newactivityinfo = new Bundle(); newactivityinfo.putdouble("clave1", 23.34); newactivityinfo.putstring("clave2", "valor"); miintent.putextras(newactivityinfo);

Opción II: Datos de uno en uno putextra está sobrecargado miintent.putextra("clave1", 34.64); miintent.putextra("clave2", "valor");

Ejemplo Una pantalla de login que arranca otra

AndroidManifest.xml <application android:allowbackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/apptheme" > <activity android:name="org.lsub.app11.mainactivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> Muestra datos, <activity no es la actividad inicial android:name="org.lsub.app11.welcomeactivity" android:label="@string/welcome_name" > <intent-filter> <action android:name="android.intent.action.view" /> <category android:name="android.intent.category.default" /> </intent-filter> </activity> </application>

activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".mainactivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/login_label" /> <EditText android:id="@+id/login_field" android:layout_height="wrap_content" android:layout_weight="1" android:hint="@string/login_hint" android:layout_width="0dp"/> </LinearLayout>

activity_main.xml <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/login_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/login_button" /> </LinearLayout> </LinearLayout>

activity_welcome.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <EditText android:id="@+id/login_field" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/login_hint" android:inputtype="textnosuggestions" android:maxlines="1" android:singleline="true" /> <TextView android:id="@+id/welcome_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="@string/welcome" /> </LinearLayout>

strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">login</string> <string name="welcome_name">welcome</string> <string name="menu_settings">settings</string> <string name="login_hint">type here</string> <string name="login_label">login:</string> <string name="login_button">press to log in</string> <string name="welcome">welcome! Mr</string> </resources>

MainActivity.java public class MainActivity extends Activity { @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); Button b = (Button)findViewById(R.id.login_button); b.setonclicklistener(new View.OnClickListener(){ public void onclick(view v){ Intent welcome = new Intent(MainActivity.this, WelcomeActivity.class); Bundle msg = new Bundle(); EditText fld = (EditText)findViewById(R.id.login_field); msg.putstring("usrname", fld.gettext().tostring()); // podiamos usar welcome.putextra("usrname", "blah") welcome.putextras(msg); startactivity(welcome); } }); }

StartActivity Sobrecargado Se le puede pasar otro parámetro que es un bundle, para construirlo: ActivityOptions Para transiciones y otras cosas

Intent Tiene flags para controlar la nueva activity (setflags) Controla la Back Stack https://developer.android.com/guide/ components/activities/tasks-and-backstack.html

WelcomeActivity.java public class WelcomeActivity extends Activity { @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_welcome); Intent i = getintent(); Bundle msg = i.getextras(); if(msg!= null){ String str = msg.getstring("usrname"); if(str!= null){ TextView lbl = (TextView)findViewById(R.id.welcome_label); lbl.settext("welcome " + str); } } }

Resultado

Resultado

Resultado

Otra opción Registramos una URI Invocamos a la Activity que la sirva

AndroidManifest.xml <activity android:name="org.lsub.app12.welcomeactivity" android:label="@string/welcome_name" > <intent-filter> <action android:name="android.intent.action.view" /> <category android:name="android.intent.category.default" /> <data android:scheme="welcome" android:host="lsub.org" /> </intent-filter> </activity>

Intent usando URI @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); Button b = (Button)findViewById(R.id.login_button); b.setonclicklistener(new View.OnClickListener(){ public void onclick(view v){ Uri u = Uri.parse("welcome://lsub.org/user"); Intent welcome = new Intent(Intent.ACTION_VIEW, u); Bundle msg = new Bundle(); EditText fld = (EditText)findViewById(R.id.login_field); msg.putstring("usrname", fld.gettext().tostring()); welcome.putextras(msg); startactivity(welcome); } }; }

Intent usando URI Y podemos usar también welcome://lsub.org/log?usrname=fjbc Y luego... Uri u = Uri.getIntent().getData(); uname = u.getqueryparameter("usrname");

Estado Hasta un cambio de orientación rearranca el Activity. Cargarlo usando Bundles como en los ejemplos Salvarlo usando este callback: public void onsaveinstancestate(bundle state){ super.onsaveinstancestate(state); state.putstring("usrname", "fjbc"); //... }

Fragments Fragmentos de una Activity Pensados para componerlos https://developer.android.com/guide/ components/fragments.html

Fragments AndroidManifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.lsub.app13" android:versioncode="1" android:versionname="1.0" > <application android:allowbackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/apptheme" > <activity android:name="org.lsub.app13.mainactivity" 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> </manifest>

Fragments res/layout/activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".mainactivity"> <fragment android:name="org.lsub.app13.holafragment" android:id="@+id/hola_fragment" android:layout_height="0dip" android:layout_weight="1" android:layout_width="match_parent" /> <fragment android:name="org.lsub.app13.caracolafragment" android:id="@+id/caracola_fragment" android:layout_height="0dip" android:layout_weight="1" android:layout_width="match_parent" /> </LinearLayout>

Fragments res/layout/hola_fragment.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:text="hola!" /> </LinearLayout>

Fragments res/layout/caracola_fragment.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:text="caracola" /> </LinearLayout>

Fragments MainActivity.java Ya no es necesario public class MainActivity extends FragmentActivity { @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; }

Fragments HolaFragment.java public class HolaFragment extends Fragment { @Override public View oncreateview(layoutinflater inf, ViewGroup view, Bundle savedinstancestate) { return inf.inflate(r.layout.hola_fragment, view, false); } }

Fragments CaracolaFragment.java public class CaracolaFragment extends Fragment { @Override public View oncreateview(layoutinflater inf, ViewGroup view, Bundle savedinstancestate) { return inf.inflate(r.layout.caracola_fragment, view, false); } }

Resultado

Pasando de uno a otro Cambiemos de uno a otro En tiempo de ejecución Todo como antes, salvo...

Fragments res/layout/activity_main.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main_frame" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".mainactivity"> </FrameLayout>

Fragments res/layout/hola_fragment.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:text="hola!" android:onclick="clicked" /> </LinearLayout>

Fragments MainActivity.java public class MainActivity extends FragmentActivity { @Override protected void oncreate(bundle state) { super.oncreate(state); setcontentview(r.layout.activity_main); if(state!= null) return; HolaFragment hola = new HolaFragment(); hola.setarguments(getintent().getextras()); FragmentManager mgr = getsupportfragmentmanager(); FragmentTransaction t = mgr.begintransaction(); t.add(r.id.main_frame, hola); t.commit(); }

Fragments MainActivity.java public void clicked(view v){ CaracolaFragment car = new CaracolaFragment(); car.setarguments(getintent().getextras()); FragmentManager mgr = getsupportfragmentmanager(); FragmentTransaction t = mgr.begintransaction(); t.replace(r.id.main_frame, car); t.addtobackstack(null); t.commit(); }

Resultado Y tras click...

Resultado

Fragmentos En realidad tenemos una actividad Mira por ej. onclick... Combinamos fragmentos a la vez o Uno tras otro

Callbacks en Fragments oncreate() Cuando realmente se crea oncreateview() Cuando se muestra

Callbacks en Fragments onattach(activity) Justo antes de crearse

Callbacks en Fragments Por lo demás como en las Activities

Sugerencia Redefine los callbacks de un Fragment Pon un write en cada uno Arranca el emulador y ejecuta Entrando y Saliendo Cambiando la orientación (Ctrl-F12)

Fragments en lata Hay unos cuantos útiles predefinidos DialogFragment: diálogo flotante ListFragment: lista de items PreferenceFragment: preferencias

Fragments en lata Creo un fragmento nuevo (Android Studio) Lo hago heredar del enlatado Miro el tutorial, por ejemplo: https://developer.android.com/reference/ android/app/dialogfragment.html

Recursos, layouts,... Recordatorio sobre res/... Definimos los por defecto en los directorios estándar Definimos otros específicos para UK, ES, landscape, portrait,...

Recursos, layouts,... Localización...-en,...-es,...-enrUK,... Pantalla...-large,...-normal,...-large,...-xlarge Orientación...-port,...-land Resolución xhdpi, hdpi, mdpi, ldpi

Recursos, layouts,... Android carga primero los no específicos Y sobre ellos los específicos que apliquen Basta redefinir justo lo que queramos Y el resto queda como esté definido en los no específicos.

Recursos, layouts,... Precedencia: 1. Localización (lenguaje) 2. Tamaño de pantalla 3. Orientación 4. Resolución

Recursos, layouts,... Ejemplo: res/drawable, res/drawable-ldpi res/layout, res/layout-land res/values, res/values-es

Tests Dos tipos, junit (con android.jar vacío, hay que hacer mocking o abstraer) Instrumentados (androidtest) ejecutan en el teléfono o emulador https://developer.android.com/training/ testing/start/index.html

Tests instrumentados Instrumentados, ojo, hay que anotar build.grade (Module: app) dependencies { androidtestcompile 'com.android.support:support-annotations:24.0.0' androidtestcompile 'com.android.support.test:runner:0.5' OJO androidtestcompile 'com.android.support.test:rules:0.5' // Optional -- Hamcrest library androidtestcompile 'org.hamcrest:hamcrest-library:1.3' // Optional -- UI testing with Espresso androidtestcompile 'com.android.support.test.espresso:espresso-core:2.2.2' // Optional -- UI testing with UI Automator androidtestcompile com.android.support.test.uiautomator:uiautomator-v18:2.1.2 }

Tests instrumentados Si la versión de la página anterior no está bien error al compilar el test (botón derecho run sobre el test): Resolved versions for app (25.1.0) and test app (24.0.0) differ

Tests instrumentados: UI Ejecutar la aplicación Tocar el UI Anotaciones (deprecated) Espresso es la manera ahora

Tests instrumentados: setup espresso Anotar que anotar build.grade (Module: app) dependencies { androidtestcompile 'com.android.support:support-annotations:24.0.0' androidtestcompile 'com.android.support.test:runner:0.5' androidtestcompile 'com.android.support.test:rules:0.5' // Optional -- Hamcrest library androidtestcompile 'org.hamcrest:hamcrest-library:1.3' // Optional -- UI testing with Espresso androidtestcompile 'com.android.support.test.espresso:espresso-core:2.2.2' // Optional -- UI testing with UI Automator androidtestcompile com.android.support.test.uiautomator:uiautomator-v18:2.1.2 }

Test instrumentados Añadir imports estáticos para espresso package org.lsub.paurea.pruebaclase; import android.content.context; import android.support.test.instrumentationregistry; import android.support.test.rule.activitytestrule; import android.support.test.runner.androidjunit4; import android.widget.button; import static android.support.test.espresso.espresso.onview; import static android.support.test.espresso.action.viewactions.click; import static android.support.test.espresso.assertion.viewassertions.matches; import static android.support.test.espresso.matcher.viewmatchers.isdisplayed; import static android.support.test.espresso.matcher.viewmatchers.withid; import org.junit.rule; import org.junit.test; import org.junit.runner.runwith; import static org.junit.assert.*;

Test instrumentados Puedo arrancar la Activity y apretar un botón @RunWith(AndroidJUnit4.class) public class ExampleInstrumentedTest { @Rule public ActivityTestRule<MainActivity> mactivityrule = new ActivityTestRule<>(MainActivity.class); @Test public void changetext_sameactivity() { // Type text and then press the button. onview(withid(r.id.button)).perform(click()); } }

Test instrumentados Meter texto, apretar un botón // Escribo texto con el teclado onview(withid(r.id.edittextuserinput)).perform(typetext(string_to_be_typed), closesoftkeyboard()); //Aprieto el bot. onview(withid(r.id.changetextbt)).perform(click()); //Compruebo que ha cambiado onview(withid(r.id.texttobechanged)).check(matches(withtext(mstringtobetyped)));

Test instrumentados Llamar a un método de la activity public ActivityTestRule<MainActivity> mactivityrule = new ActivityTestRule<MainActivity>(MainActivity.class); @Test public void useappcontext() throws Exception { MainActivity activity = mactivityrule.getactivity(); //llamo a un metodo de la activity activity.mymethod("whatever"); // do more }

Test instrumentados Más info: https://developer.android.com/topic/libraries/testing-support-library/index.html Aparte está el UI automator (para interactuar con menús del sistema y demás)