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);
}