Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Desarrollo de un
reproductor
mp3
Desarrollo de
aplicaciones
Android
Contenidos
● Ciclo de vida ● Desarrollo de la
● Fragmentos aplicación Mp3Player
● Menús paso a paso
● Eventos de la UI
● Cuadros de diálogo
● MediaPlayer
● Intents
● ListViews y Layouts
Mp3Player: Paso 1
● Creación de una aplicación vacía, basada en el
hola mundo
Ciclo de vida
● Una aplicación está compuesta por Activities
● El Manifest indica cuál será la Activity inicial
● Debe indicar como acción MAIN
● Debe indicar como categoría LAUNCHER
<application
<application
android:allowBackup="true"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" En caso contrario no
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:theme="@style/AppTheme" >> aparecerá el icono en la
<activity
<activity lista de Apps
android:name="com.cep.mp3player.MainActivity"
android:name="com.cep.mp3player.MainActivity"
android:label="@string/app_name"
android:label="@string/app_name" >>
<intent-filter>
<intent-filter>
<action
<action android:name="android.intent.action.MAIN"
android:name="android.intent.action.MAIN" />
/>
<category
<category android:name="android.intent.category.LAUNCHER" />
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</intent-filter>
</activity>
</activity>
</application>
</application>
Ciclo de vida
● Ciclo de vida de la actividad:
● Comienza ejecutando el método onCreate()
● Termina ejecutando onDestroy()
@Override
@Override
protected
protected void
void onCreate(Bundle
onCreate(Bundle savedInstanceState)
savedInstanceState) {{ @Override
super.onCreate(savedInstanceState); @Override
super.onCreate(savedInstanceState); public
public void
void onDestroyView()
onDestroyView() {{
setContentView(R.layout.activity_main);
setContentView(R.layout.activity_main); super.onDestroyView();
}} super.onDestroyView();
}}
Fragmentos
● A partir de Android 3.0 (API level 11)
● Divide la interfaz de usuario de la actividad en bloques
independientes
● Facilita la adecuación del UI al dispositivo
● Tiene su propio layout
Fragmentos
● Ciclo de vida
Inicialización de componentes
Que deben mantenerse cuando
El fragmento está parado pausado
@Override
@Override
public View onCreateView((LayoutInflater inflater, ViewGroup container,
public View onCreateView((LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main,
View rootView = inflater.inflate(R.layout.fragment_main,
container, false);
container, false);
return rootView;
return rootView;
}
}
Fragmentos
● Creación estática: declarándolo dentro del layout de la
actividad
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent">
<fragment android:name="com.example.news.ArticleListFragment"
<fragment android:name="com.example.news.ArticleListFragment"
android:id="@+id/list"
android:id="@+id/list"
android:layout_weight="1"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_width="0dp"
android:layout_height="match_parent" />
android:layout_height="match_parent" />
</LinearLayout>
</LinearLayout>
Mp3Player: Paso 2
● Adición de una opción de menú para
abandonar la aplicación
● Crear un recurso string action_exit con texto Salir
● Añadir un nuevo item al menú, con id. action_exit, y
referenciando la cadena del mismo nombre
● Añadir la nueva opción al código que trata las
opciones de menú
– Debe ejecutar finish() para abandonar la aplicación
Menús
● Desde Android 3.0 se está migrando del botón
dedicado a menús hacia la barra de acciones.
● Tres tipos de menús:
●
Menú de opciones: aparece cuando el usuario presiona
el botón MENU.
● Menú de contexto: opciones que aparecen cuando el
usuario toca y mantiene el elemento que tiene asociado
dicho menú.
●
Submenú: aparece cuando el usuario selecciona una
entrada del menú.
@Override
@Override
public
public boolean
boolean onCreateOptionsMenu(Menu
onCreateOptionsMenu(Menu menu)
menu) {{
MenuInflater inflater = getMenuInflater();
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main,
En este caso se crea un
inflater.inflate(R.menu.main, menu);
menu); menú de opciones
return true;
return true;
}}
La actividad invoca
onCreateOptionsMenu como
parte de su proceso de creación
@Override
@Override
public
public boolean
boolean onOptionsItemSelected(MenuItem
onOptionsItemSelected(MenuItem item)
item) {{
switch
switch (item.getItemId())
(item.getItemId()) {{
case
case R.id.action_settings:
R.id.action_settings:
return
return true;
true;
}}
return
return super.onOptionsItemSelected(item);
super.onOptionsItemSelected(item);
}}
Mp3Player: Paso 3
● Adición de una opción de menú para mostrar
un cuadro de diálogo con los créditos de la App
● Añadir un nuevo item al menú, con id.
action_about, que muestre el texto Acerca de ...
● Crear un cuado de diálogo de alerta al seleccionar
la opción
– Debe mostrar el texto “Mp3Player v0.1”
– Debe incluir un botón positivo con el mensaje Aceptar.
Eventos de la IU
● La interacción con la IU genera eventos que
pueden capturarse para su tratamiento
● Listeners: Interfaz de la clase View con
callbacks para la captura de los eventos
private
private OnClickListener
OnClickListener MyListener
MyListener == new
new OnClickListener()
OnClickListener() {{
public
public void
void onClick(View
onClick(View v)
v) {{
//
// acciones
acciones aa realizar
realizar al
al pulsar
pulsar el
el botón
botón
}}
};
};
protected
protected void
void onCreate(Bundle
onCreate(Bundle savedValues)
savedValues) {{
...
...
//
// referencia
referencia al
al botón
botón desde
desde el
el layout
layout
Button button = (Button)findViewById(R.id.my_button);
Button button = (Button)findViewById(R.id.my_button);
//
// Registro
Registro del
del listener
listener para
para el
el evento
evento onClick
onClick
button.setOnClickListener(MyListener);
button.setOnClickListener(MyListener);
...
...
}}
Eventos de la IU
Evento Listener Se produce ..
Cuadros de diálogo
● Utilizados para solicitar información extra al
usuario o realizar notificaciones
Título: opcional
Tipos
● Alerts
● Popups
● Toasts
AlertDialog
//
// La
La clase
clase AlertDialog.Builder
AlertDialog.Builder proporciona
proporciona una
una API
API para
para crear
crear cuadro
cuadro de
de diálogo
diálogo
de alerta
de alerta
AlertDialog.Builder
AlertDialog.Builder builder
builder == new
new AlertDialog.Builder(this);
AlertDialog.Builder(this);
//
// Los
Los métodos
métodos que
que fijan
fijan las
las características
características se
se pueden
pueden encadenar
encadenar
builder.setMessage("Are you sure you want to exit?")
builder.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setCancelable(false)
.setPositiveButton("Yes",
.setPositiveButton("Yes", new new DialogInterface.OnClickListener()
DialogInterface.OnClickListener() {{
public
public void
void onClick(DialogInterface
onClick(DialogInterface dialog,
dialog, int
int id)
id) {{
MyActivity.this.finish();
MyActivity.this.finish();
}}
})
})
.setNegativeButton("No",
.setNegativeButton("No", new new DialogInterface.OnClickListener()
DialogInterface.OnClickListener() {{
public
public void
void onClick(DialogInterface
onClick(DialogInterface dialog,
dialog, int
int id)
id) {{
dialog.cancel();
dialog.cancel();
}}
});
});
//
// Por
Por último
último se
se realiza
realiza la
la instancia
instancia
AlertDialog alert = builder.create();
AlertDialog alert = builder.create();
//
// Para
Para mostrarlo
mostrarlo debe
debe invocarase
invocarase al
al método
método show()
show()
alert.show();
alert.show();
ProgressDialog
ProgressDialog dialog
dialog == ProgressDialog.show(MyActivity.this,
ProgressDialog.show(MyActivity.this, "",
"",
"Loading. Please wait...", true);
"Loading. Please wait...", true);
ProgressDialog
ProgressDialog progressDialog;
progressDialog;
progressDialog
progressDialog = new
= new ProgressDialog(mContext);
ProgressDialog(mContext);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Loading...");
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(false);
progressDialog.setCancelable(false);
Fragmentos de diálogos
● Permiten crear diálogos a la medida
public
public class
class FireMissilesDialogFragment
FireMissilesDialogFragment extends
extends DialogFragment
DialogFragment {{
@Override
@Override
public
public Dialog
Dialog onCreateDialog(Bundle
onCreateDialog(Bundle savedInstanceState)
savedInstanceState) {{
AlertDialog.Builder
AlertDialog.Builder builder
builder == new
new AlertDialog.Builder(getActivity());
AlertDialog.Builder(getActivity());
builder.setMessage(R.string.dialog_fire_missiles)
builder.setMessage(R.string.dialog_fire_missiles)
.setPositiveButton(R.string.fire,
.setPositiveButton(R.string.fire, new new DialogInterface.OnClickListener()
DialogInterface.OnClickListener() {{
public
public void
void onClick(DialogInterface
onClick(DialogInterface dialog,
dialog, int
int id)
id) {{
//
// FIRE
FIRE ZE
ZE MISSILES!
MISSILES!
}})
}})
.setNegativeButton(R.string.cancel,
.setNegativeButton(R.string.cancel, new new DialogInterface.OnClickListener()
DialogInterface.OnClickListener() {{
public
public void
void onClick(DialogInterface
onClick(DialogInterface dialog,
dialog, int
int id)
id) {{
//
// User
User cancelled
cancelled the
the dialog
dialog
}});
}});
return
return builder.create();
builder.create();
}}
}}
Mp3Player: Paso 4
● Creación de una instancia del MediaPlayer
que inicie la reproducción de una canción fija al
pulsar un botón:
● Añadir un botón al layout del fragmento
● Crear una instancia estática del MediaPlayer
● Iniciar la reproducción del MediaPlayer al pulsar el
botón
● Detener la reproducción al abandonar la aplicación
(desde el menú)
MediaPlayer: permisos
● Hay ciertas características que requieren
permisos extras en el Manifest:
● Internet Permission: para reproducción en stream
<uses-permission
<uses-permission android:name="android.permission.INTERNET"
android:name="android.permission.INTERNET" />
/>
MediaPlayer
● Gestión basada en un
diagrama de estados
● Secuencia simple:
● reset(): paso a estado inicial
● setDataSource(): elección dela
fuente de reproducción
● prepare(): carga de la fuente
● start(): inicio de la reproducción
● pause()/stop(): pausa/parada de
la reproducción
● release(): liberación de recursos
del MediaPlayer
Mp3Player: Paso 5
● Adición de una nueva actividad que
proporcionará la canción a reproducir
● File=>New=>Activity=>Blank Activity
– Name: PlaylistActivity
– Resto por defecto
– Comprueba como se ha añadido la nueva actividad al
manifiesto de Android
Mp3Player: Paso 6
● Selección de la canción a partir de una lista fija
mostrada en la nueva actividad:
● Añadir al layout de la actividad una ListView (categoría
Composite de la paleta de la vista gráfica) con el id list
● Cambiar la herencia de la actividad PlayList de Activity a
ListActivity
● En el método onCreate() de la actividad añadir y conectar
a la ListView
– Un array de strings inicializada con 3 nombres de canciones
– Un adaptador de lista simple
Mp3Player: Paso 6
● ...:
● Añadir el método onListItemClick() a la actividad
para tratar la selección de la lista:
– Retornar un intent con el número de canción elegida
– Llamar a finish() para cerrar la actividad
● Cambiar la llamada startActivity() por
startActivityForResult()
● Implementar el método onActivityResult() para
recoger el valor el Intent y reproducir la canción
Intent explícitos
● Permiten iniciar nuevas actividades
Intent
Intent ii == new
new Intent(this,
Intent(this, About.class);
About.class);
Retorno de valores
● Desde la actividad “llamada”
● Crear un intent de retorno
● Puede incluir nuevos extras
● Establecer el resultado actividad: SetResult()
– Código: e.j. RESULT_CANCELED, RESULT_OK.
Intent
Intent resultIntent
resultIntent == new
new Intent();
Intent();
resultIntent.putExtra("com.cep.mp3player.song",
resultIntent.putExtra("com.cep.mp3player.song", position);
position);
setResult(Activity.RESULT_OK,resultIntent);
setResult(Activity.RESULT_OK,resultIntent);
this.finish();
this.finish();
Datos Control
Adaptador
[Contenedor] [Presentación]
Vista
[Visualización
a medida]
2. El adaptador
ArrayAdapter<String> adapter;
● Enlazar contenedor-vista-lista-adaptador (onCreate)
Adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, songsList);
setListAdapter(adapter);
● Añadir datos (onActivityResult)
songsList.add(String);
adapter.notifyDataSetChanged();
Mp3Player: Paso 7
● Creación de la lista de canciones a partir del contenido de un
directorio:
● Obtener la lista de ficheros de un directorio del dispositivo de
almacenamiento externo (mediante la clase MediaManager que se
proporciona)
● Enviar la lista de los nombres de canciones a la actividad que la
muestra, a través de los argumentos del Intent
intent.putExtra("playlist", media_manager.songTitles());
● Recoger el índice de la canción seleccionada, obtener el fichero
fuente, y reproducir
Integer song = data.getIntExtra("com.cep.player.song", 0);
playSong(media_manager.getSong(song).path());
MediaManager
● Gestiona el listado de canciones
Constructor que rellena el
Array song_files a partir
Del contenido de un directoru
class
class MediaManager
MediaManager {{
String
String music_path
music_path == Environment.getExternalStoragePublicDirectory(
Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_MUSIC).getPath()
Environment.DIRECTORY_MUSIC).getPath() ++ '/';
'/';
File[] song_files;
File[] song_files;
Array con los títulos de
public
public MediaManager();
MediaManager(); Las canciones
public
public String[]
String[] songTitles();
songTitles();
public
public int
int size();
size();
Clase que gestiona los
public metadatos
public SongData
SongData getSong(int
getSong(int index);
index);
}}
SongData
● Gestión de los metadatos de la canción
class
class SongData
SongData {{
MediaMetadataRetriever
MediaMetadataRetriever metadata;
metadata;
File file;
File file;
Constructor a partir de
public
public SongData(String
SongData(String path);
path); ruta
public
public SongData(File
SongData(File f);
f);
public
public String
String title();
title(); Constructor a partir de
public
fichero
public String
String album();
album();
public
public String
String path();
path();
public
public Bitmap
Bitmap picture();
picture();
private
private String
String pathToTitle(String
pathToTitle(String filename);
filename);
}}
Mp3Player: Paso 8
● Mejora de la interfaz de control del player mediante el uso
de 2 LinearLayout para la disposición de los componentes:
● El primero debe incluir
– el botón para la selección de la canción
– Un textview que anotará el nombre de la canción
● El segundo debe incluir otros 3 botones:
– Canción anterior (sin funcionalidad)
– Pausa/reproducción (tipo ToggleButton)
– Canción posterior (sin funcionalidad)
● Si la canción elegida en la lista es la que se haya en curso,
no reiniciar su reproducción
Layouts
● Arquitectura de la IU en una Activity
● Estructura de la visualización
● Contenedor de los elementos visuales
Tipo Descripción
LinearLayout
<?xml
<?xml version="1.0"
version="1.0" encoding="utf-8"?>
encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:layout_height="fill_parent">
<Button
<Button android:text="Button01"
android:text="Button01" android:id="@+id/Button01"
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="wrap_content" />/>
<Button
<Button android:text="Button02"
android:text="Button02" android:id="@+id/Button02"
android:id="@+id/Button02"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="wrap_content" />/>
</LinearLayout>
</LinearLayout>
<?xml
<?xml version="1.0"
version="1.0" encoding="utf-8"?>
encoding="utf-8"?>
<LinearLayout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:orientation="horizontal" android:layout_width="fill_parent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:layout_height="fill_parent">
<Button
<Button android:text="Button01"
android:text="Button01" android:id="@+id/Button01"
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="wrap_content" />/>
<Button
<Button android:text="Button02"
android:text="Button02" android:id="@+id/Button02"
android:id="@+id/Button02"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="wrap_content" />/>
</LinearLayout>
</LinearLayout>
Fuente: http://www.programacion.com/articulo/introducion_a_los_layouts_para_android_400
TableLayout
<?xml
<?xml version="1.0"
version="1.0" encoding="utf-8"?>
encoding="utf-8"?>
<TableLayout android:id="@+id/TableLayout01"
<TableLayout android:id="@+id/TableLayout01"
android:layout_width="fill_parent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:android="http://schemas.android.com/apk/res/android">
<TableRow
<TableRow android:id="@+id/TableRow01">
android:id="@+id/TableRow01">
<TextView
<TextView android:id="@+id/TextView01"
android:id="@+id/TextView01" android:text="First
android:text="First
Name:"
Name:"
android:width="100px"
android:width="100px" />
/>
<EditText
<EditText android:id="@+id/EditText01" android:width="220px"
android:id="@+id/EditText01" android:width="220px" />
/>
</TableRow>
</TableRow>
<TableRow
<TableRow android:id="@+id/TableRow02">
android:id="@+id/TableRow02">
<TextView
<TextView android:id="@+id/TextView02"
android:id="@+id/TextView02" android:text="Second
android:text="Second
Name:" />
Name:" />
<EditText
<EditText android:id="@+id/EditText02"
android:id="@+id/EditText02" />
/>
</TableRow>
</TableRow>
<TableRow
<TableRow android:id="@+id/TableRow03">
android:id="@+id/TableRow03">
<Button
<Button android:id="@+id/Button01"
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="wrap_content"
android:text="Submit"
android:text="Submit" />
/>
<Button
<Button android:id="@+id/Button02"
android:id="@+id/Button02"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="wrap_content" android:text="Reset"
android:text="Reset"
android:width="100px" />
android:width="100px" />
</TableRow>
</TableRow>
</TableLayout>
</TableLayout>
Fuente: http://www.programacion.com/articulo/introducion_a_los_layouts_para_android_400
RelativeLayout
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/RelativeLayout01"
<RelativeLayout android:id="@+id/RelativeLayout01"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:layout_width="fill_parent" android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView android:id="@+id/TextView01"
<TextView android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="First Name:"
android:layout_height="wrap_content" android:text="First Name:"
android:width="100px" />
android:width="100px" />
<EditText android:id="@+id/EditText01" android:layout_width="220px"
<EditText android:id="@+id/EditText01" android:layout_width="220px"
android:layout_height="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/TextView01"
android:layout_toRightOf="@+id/TextView01"
android:layout_below="@+id/RelativeLayout01" />
android:layout_below="@+id/RelativeLayout01" />
<EditText android:id="@+id/EditText02" android:layout_width="220px"
<EditText android:id="@+id/EditText02" android:layout_width="220px"
android:layout_height="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/EditText01"
android:layout_below="@+id/EditText01"
android:layout_alignLeft="@+id/EditText01" />
android:layout_alignLeft="@+id/EditText01" />
<TextView android:id="@+id/TextView02"
<TextView android:id="@+id/TextView02"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Second Name:"
android:layout_height="wrap_content" android:text="Second Name:"
android:width="100px" android:layout_below="@+id/EditText01"
android:width="100px" android:layout_below="@+id/EditText01"
android:layout_toLeftOf="@+id/EditText02" />
android:layout_toLeftOf="@+id/EditText02" />
<Button android:text="Submit" android:id="@+id/Button01"
<Button android:text="Submit" android:id="@+id/Button01"
android:layout_width="100px" android:layout_height="wrap_content"
android:layout_width="100px" android:layout_height="wrap_content"
android:layout_below="@id/EditText02"
android:layout_below="@id/EditText02"
android:layout_alignLeft="@id/EditText02" />
android:layout_alignLeft="@id/EditText02" />
<Button android:text="Reset" android:id="@+id/Button02"
<Button android:text="Reset" android:id="@+id/Button02"
android:layout_width="100px" android:layout_height="wrap_content"
android:layout_width="100px" android:layout_height="wrap_content"
android:layout_below="@id/EditText02"
android:layout_below="@id/EditText02"
android:layout_alignRight="@id/EditText02" />
android:layout_alignRight="@id/EditText02" />
</RelativeLayout>
</RelativeLayout>
Fuente: http://www.programacion.com/articulo/introducion_a_los_layouts_para_android_400
Mp3Player © Grupo Arco 44
Desarrollo de
aplicaciones
Android
AbsoluteLayout
<?xml
<?xml version="1.0"
version="1.0" encoding="utf-8"?>
encoding="utf-8"?>
<AbsoluteLayout android:id="@+id/AbsoluteLayout01"
<AbsoluteLayout android:id="@+id/AbsoluteLayout01"
android:layout_width="fill_parent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:android="http://schemas.android.com/apk/res/android">
<EditText
<EditText android:id="@+id/EditText01"
android:id="@+id/EditText01" android:layout_width="200px"
android:layout_width="200px"
android:layout_height="wrap_content"
android:layout_height="wrap_content" android:layout_x="12px"
android:layout_x="12px"
android:layout_y="12px" />
android:layout_y="12px" />
<Button
<Button android:text="Search"
android:text="Search" android:id="@+id/Button01"
android:id="@+id/Button01"
android:layout_width="100px"
android:layout_width="100px"
android:layout_height="wrap_content"
android:layout_height="wrap_content"
android:layout_x="220px"
android:layout_x="220px" android:layout_y="12px"
android:layout_y="12px" />
/>
</AbsoluteLayout>
</AbsoluteLayout>
Fuente: http://www.programacion.com/articulo/introducion_a_los_layouts_para_android_400
Mp3Player © Grupo Arco 45
Desarrollo de
aplicaciones
Android
FrameLayout
<?xml
<?xml version="1.0"
version="1.0" encoding="utf-8"?>
encoding="utf-8"?>
<FrameLayout
<FrameLayout android:id="@+id/FrameLayout01"
android:id="@+id/FrameLayout01"
android:layout_width="fill_parent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
<ImageView android:id="@+id/ImageView01"
android:id="@+id/ImageView01"
android:src="@drawable/android"
android:src="@drawable/android"
android:layout_width="fill_parent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_height="fill_parent"
android:scaleType="center"
android:scaleType="center" />
/>
<TextView
<TextView android:text="Android
android:text="Android Partaker"
Partaker"
android:id="@+id/TextView01"
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dip"
android:layout_marginBottom="20dip"
android:layout_gravity="center_horizontal|bottom"
android:layout_gravity="center_horizontal|bottom"
android:padding="10dip"
android:padding="10dip"
android:textColor="#AA0000"
android:textColor="#AA0000" android:textStyle="bold"
android:textStyle="bold"
android:textSize="20px"
android:textSize="20px" android:background="#00000000" />
android:background="#00000000" />
</FrameLayout>
</FrameLayout>
Fuente: http://www.programacion.com/articulo/introducion_a_los_layouts_para_android_400
Mp3Player © Grupo Arco 46
Desarrollo de
aplicaciones
Android
Mp3Player: Paso 9
● Adición de funcionalidad a los botones prev. y
next
● Uso de una propiedad índice para almacenar la
canción actual
● Los botones provocan el cambio del índice con el
que obtener la nueva canción
Mp3Player: Paso 10
● Visualización de los metadatos:
● Modificación del TextView para visualizar el nombre
del album y de la canción:
– Los datos pueden obtenerse a partir de los métodos
album() y title() de la clase SongData().
● Adición de un ImageView que contendrá la imagen
de la portada del álbum:
– Puede obtenerse del método picture()
– Para mostrar la imagen: setImageBitmap() en el
ImageView