Download Transparencias de estructura de un programa en Android
Document related concepts
no text concepts found
Transcript
Estructura de Programas en Android LSUB, GSYC, URJC Introducción • Las aplicaciones son sólo una colección de “Activities”. • Una de las actividades es el punto de entrada... • ...lo que veremos en el “launcher” • La aplicación tendrá varias “Activities” Actividades • El dispositivo las crea y destruye • y las para y las reanuda • muchas más veces de lo que esperas (ej. al rotar la pantalla) Actividades • Sólo deberían utilizar recursos mientras sirven al usuario • Y deben dejarse ir cuando se les pide • ej. si te llaman o • se pasa a otra actividad Actividades • Pueden querer “recordar” el estado antes de irse • O hablar con otras actividades • O iniciar otras actividades ... ya veremos todo esto Actividades Arrancada Ejecutando Parada Visible Terminada Actividades onResume() onCreate() onStart() Arrancada Ejecutando Visible onPause() onRestart() onStop() Parada Terminada onDestroy() Sugerencia • Redefine los callbacks de la transparencia anterior en un Hola Mundo • Pon un write en cada uno • Arranca el emulador y ejecuta • Entrando y Saliendo • Cambiando la orientación (Ctrl-F12) Actividades package org.lsub.app2; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { Punto de entrada @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } Estado salvado @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } } Código generado con recursos (generado desde XML, ...) Actividades setContentView(R.layout.activity_main); res/layout/activity_main.xml <RelativeLayout 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" tools:context=".MainActivity" > Views <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/hello_world" /> </RelativeLayout> Actividades res/layout/activity_main.xml <RelativeLayout 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" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/hello_world" /> </RelativeLayout> Strings en res/values/strings.xml Actividades res/values/strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">App1</string> <string name="hello_world">Hello world!</string> <string name="menu_settings">Settings</string> </resources> android:text="@string/hello_world" Un botón res/layout/activity_main.xml <RelativeLayout 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" tools:context=".MainActivity" > <Button android:text="@string/but_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="butClick" /> ... </RelativeLayout> Un botón res/layout/activity_main.xml • RelativeLayout, Button, ... • Son clases de Java • layout_width, layout_height, ... • Son atributos de esas clases • Todo documentado en Javadoc Un botón res/values/strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string <string <string <string </resources> name="app_name">App1</string> name="hello_world">Hello world!</string> name="menu_settings">Settings</string> name="but_name">Pulsa esto</string> Un botón src/org.lsub.app2/MainActivity.java public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } ... public void butClick(View button) { int time = Toast.LENGTH_SHORT; Toast msg = Toast.makeText(this, "Pulsado!", time); msg.show(); } } Valor para onClick en el XML Un botón Un botón Podríamos haber usado String str = getString(R.string.saludo); y definir el texto en XML (mejor para “localizar” la aplic.) Otra forma... res/layout/activity_main.xml <RelativeLayout 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" tools:context=".MainActivity" > <Button android:id="@+id/mi_boton" android:text="@string/but_name" android:layout_width="wrap_content" android:layout_height="wrap_content" /> ... </RelativeLayout> Otra forma... • En el XML • Le damos un “id” al botón • No mencionamos “onClick” • Desde Java • Buscamos el botón • e instalamos un handler Otra forma... android:id="@+id/mi_boton" • “@”: Referencia a un “id” • “+”: Para declarar el “id” • Sólo la primera vez que se usa ese id Otra forma... public class MainActivity extends Activity { private class MsgBoton implements View.OnClickListener { public void onClick(View boton){ int time = Toast.LENGTH_SHORT; Toast msg = Toast.makeText(MainActivity.this, "Pulsado!", time); msg.show(); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button but = (Button) findViewById(R.id.mi_boton); but.setOnClickListener(new MsgBoton()); } Otra forma... • De esta forma podemos pasar args extra a los manejadores • Y seguir usando las ayudas de Android Studio • UI Builder, ... Y otra más... • Podíamos haber creado todo desde Java • Aunque es más incómodo, pero es programable (arrays de botones, etc.) Y otra más... public class MainActivity extends Activity implements OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout lay = new LinearLayout(this); Button but = new Button(this); but.setText("Mi boton"); but.setOnClickListener(this); lay.addView(but); setContentView(lay); } ... @Override public void onClick(View arg0) { int time = Toast.LENGTH_SHORT; Toast msg = Toast.makeText(MainActivity.this, "Pulsado!", time); msg.show(); } } Ojo • Si voy a tener una parte en xml y otra en java (estructura en java, añado elementos en xml) • Llamar primero a setContentView para que me rellene el árbol Ojo public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TableRow row (TableRow)findViewById(R.id.rowtxt); TextView txt = new TextView(this); txt.setText(“hola”); row.addView(txt); }