Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Para crear una nueva clase, lo primero que tienes que hacer es crear un
fichero que ha de llamarse exactamente igual que la clase y con extensin
.java. Recuerda, siempre un fichero por clase.
Encapsulamiento y visibilidad
Herencia
Uno de los grandes atractivos de la programacin orientada a objetos es la
facilidad que nos ofrece para la reutilizacin de cdigo. La programacin
puede llegar a ser muy repetitiva. La reutilizacin de cdigo consiste en no
volver a escribir una y otra vez los mismos algoritmos para resolver
situaciones similares. La clave para conseguir esto en Java va a ser la
herencia. Si alguna vez ha tratado de reutilizar un cdigo ya escrito para
tratar de modificar su comportamiento, habrs comprobado lo complejo que
resulta y cmo es muy frecuente cometer errores.
Veamos un ejemplo: Imagina que dispones de un sistema de informacin
geogrfica donde cada punto geogrfico es representado por la clase
GeoPunto. Los atributos de esta clase son longitud y latitud. Nos vemos
Polimorfismo
El polimorfismo consiste en declarar un objeto de una clase, pero
instanciarlo como un descendiente de dicha clase (lo contrario no es
posible). Es decir, utilizaremos la siguiente expresin:
<Clase_padre> <objeto> = new <Clase_hija>(<parmetros>);
A primera vista no parece demasiado til, pero en la prctica va a tener una
gran potencia. Para explicarlo utilizaremos un ejemplo real. Cuando estemos
desarrollando una aplicacin Android y queremos introducir un botn en el
interfaz de usuario, vamos a poder indicar un grfico de fondo. Para indicar
este fondo tendremos que indicar un objeto de la clase Drawable. La clase
Drawable representa algo que se puede dibujar, tiene muchos
descendientes: BitmapDrawable (un fichero PNG o JPG), ShapeDrawable (un
grfico a partir de primitivas vectoriales), GradienDrawable (degradado de
color), AnimationDrawable (animaciones frame a frame), La clase
Drawable no permite declarar un objeto directamente de esta clase. Un
Drawable es algo que se puede dibujar pero que no sabemos cmo. Un
objeto real ha de declararse de algunos de sus descendientes, que si saben
cmo dibujarse. Esto da mucha potencia a la hora de escoger el tipo de
fondo para nuestro botn, podemos usar un fichero PNG, un degradado, una
animacin,... Y ms todava, podramos crear nuestra propia clase,
AnimacionLucesNavidad, que descenda de AnimationDrawable. Un objeto
de esta clase tambin lo sera de Drawable y por lo tanto vamos a poder
utilizarlo como fondo de nuestro botn.
Si reflexionamos sobre lo que hemos conseguido gracias al polimorfismo
veremos que no es poca cosa. Los diseadores de la clase botn (realmente
se llama Button) pudieron tomar una decisin de diseo, concretamente
cmo podramos dibujar el fondo del botn, sin la necesidad de especificar
exactamente cmo hacerlo. Ms adelante hemos podido disear nuevas
clases para dibujar este fondo simplemente creando descendientes de la
clase Drawable.
Conversin de tipos
Imaginemos que hemos declarado un objeto de una clase pero lo hemos
construido utilizando un constructor de una clase descendiente, tal y como
se muestra a continuacin:
Complejo c = new ComplejoAmpliado(12.4);
Vamos a poder utilizar cualquier mtodo de c definido en la clase Complejo
o cualquiera de sus descendientes:
c.toString();
c.getClass();
Pero la siguiente mtodo no podr ser utilizado:
c.esReal()..
Esto es debido a que est mtodo no est definido para la clase Complejo.
No obstante, estamos seguros de que c es de la clase ComplejoAmpliado y
por lo tanto este mtodo s que puede ser llamado. Para solucionar este
problema, podemos utilizar lo que en Java se conoce como tipecast (cambio
de tipo).
(<Clase>) <objeto>
A partir de este momento <objeto> ser considerado de la clase <Clase>.
Aunque no haya sido declarada de esta clase. Por lo tanto podremos
escribir:
((ComplejoAmpliado)c).esReal()
Uso de instanceof
Podemos averiguar si un objeto es de una determinada clase usando la
siguiente expresin:
<objeto> instanceof <Clase>
A continuacin se muestran algunos ejemplos:
Complejo c = new ComplejoAmpliado(12.4);
if
if
if
if
Conjuntos
Los conjuntos son estructuras de datos donde los elementos no tienen un
orden y no se permiten duplicados. Para definirlos se utiliza la interfaz
Set<E>, que no aade nuevos mtodos a la interfaz Collection<E>. Por lo
tanto, con los mtodos anteriores podrs manipular tus conjuntos.
Podemos utilizar diferentes implementaciones. La ms eficiente es
HashSet<E> (implementacin con tabla hash). Pero si queremos que los
elementos queden ordenados podemos usar TreeSet<E> (implementacin
con rbol).
El siguiente ejemplo muestra cmo crear un conjunto de Strings y luego
recorrerlo para mostrarlo en consola:
Set conjunto = new HashSet(); conjunto.add("manzana");
conjunto.add("pera");
conjunto.add("fresa");
conjunto.add("naranja");
conjunto.remove("pera");
for(String s : conjunto) {
System.out.println(s);
}
Listas
Una lista es una estructura secuencial, donde cada elemento tiene un ndice
o posicin. Tambin recibe el nombre de array o vector unidimensional. El
ndice de una lista es siempre un entero y el primer elemento ocupa la
posicin 0. Para trabajar con ellas se utiliza el interfaz List<E>. Las
implementaciones ms recomendables son: ArrayList<E>si queremos
acceder a una posicin de forma muy rpida o LinkedList<E> si queremos
inserciones y borrado muy rpidos.
<LinearLayout xmlns:android="http://...
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation ="vertical">
<AnalogClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Un checkBox"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Un botn"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Un texto cualquiera"/>
</LinearLayout>
TableLayout distribuye los elementos de forma tabular. Se utiliza la
etiqueta <TableRow> cada vez que queremos insertar una nueva lnea.
<TableLayout xmlns:android=http://...
android:layout_height="match_parent"
android:layout_width="match_parent">
<TableRow>
<AnalogClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Un checkBox"/>
</TableRow>
<TableRow>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Un botn"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Un texto cualquiera"/>
</TableRow>
</TableLayout>
RelativeLayout permite comenzar a situar los elementos en cualquiera de
los cuatro lados del contenedor e ir aadiendo nuevos elementos pegados a
estos.
<RelativeLayout xmlns:android="http://schemas...
android:layout_height="match_parent"
android:layout_width="match_parent">
<AnalogClock
android:id="@+id/AnalogClock01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"/>
<CheckBox
android:id="@+id/CheckBox01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/AnalogClock01"
android:text="Un checkBox"/>
<Button
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Un botn"
android:layout_below="@+id/CheckBox01"/>
<TextView
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="Un texto cualquiera"/>
</RelativeLayout>
AbsoluteLayout permite indicar las coordenadas (x,y) donde queremos
que se visualice cada elemento. No es recomendable utilizar este tipo de
Layout. La aplicacin que estamos diseando tiene que visualizarse
correctamente en dispositivos con cualquier tamao de pantalla. Para
conseguir esto, no es una buena idea trabajar con coordenadas absolutas.
De hecho, este tipo de Layout ha sido marcado como obsoleto.
<AbsoluteLayout xmlns:android="http://schemas.
android:layout_height="match_parent"
android:layout_width="match_parent">
<AnalogClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="50px"
android:layout_y="50px"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Un checkBox"
android:layout_x="150px"
android:layout_y="50px"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Un botn"
android:layout_x="50px"
android:layout_y="250px"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Un texto cualquiera"
android:layout_x="150px"
android:layout_y="200px"/>
</AbsoluteLayout>
FrameLayout posiciona las vistas usando todo el contenedor, sin
distribuirlas espacialmente. Este Layout suele utilizarse cuando queremos
que varias vistas ocupen un mismo lugar. Podemos hacer que solo una sea
visible, o superponerlas.Para modificar la visibilidad de un elemento
utilizaremos la propiedad visibility.
<FrameLayout xmlns:android="http://schemas...
android:layout_height="mach_parent"
android:layout_width="match_parent">
<AnalogClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Un checkBox"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Un botn"
android:visibility="invisible"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Un texto cualquiera"
android:visibility="invisible"/>
</FrameLayout>
Recursos alternativos
Una aplicacin Android va a poder ser ejecutada en una gran variedad de
dispositivos. El tamao de pantalla, la resolucin o el tipo de entradas puede
variar mucho de un dispositivo a otro. Por otra parte, nuestra aplicacin ha
de estar preparada para diferentes modos de funcionamiento, como el
modo automvil o el modo noche, y para poder ejecutarse en diferentes
idiomas.
A la hora de crear la interfaz de usuario, hemos de tener en cuenta todas
estas circunstancias. Afortunadamente, la plataforma Android nos
proporciona una herramienta de gran potencia para resolver este problema:
el uso de los recursos alternativos.
Tipos de recursos
La definicin de los recursos en Android es un aspecto muy importante en el
diseo de una aplicacin. Una de sus principales ventajas es que facilita a
los diseadores grficos e introductores de contenido trabajar en paralelo
con los programadores.
Aadir un recurso a nuestra aplicacin es muy sencillo, no tenemos ms que
aadir un fichero dentro de una carpeta determinada de nuestro proyecto.
Para cada uno de los recursos que aadamos el sistema crea, de forma
automtica, un id de recurso dentro de la clase R.
Tipos de recursos
Segn la carpeta que utilicemos el recurso creado ser de un tipo especfico.
Pasamos a enumerar las carpetas y tipos posibles:
carpeta
Descripcin
identificador
Ficheros en bitmap (.png, .jpg o .gif). Ficheros PNG en
res/drawable/
formato Nine-patch (.9.png). Ficheros XML con descriptores
R.drawable
grficos (ver clase Drawable)
res/layout/
R.layout
res/menu/
R.menu
res/anim/
R.anim
res/animator
R.animator
res/xml/
R.xml
res/raw/
R.raw
res/values/
Descripcin
identificador
strings.xml
R.string
colors.xml
R.color
dimensions.x
ml
R.dimen
styles.xml
R.style
R.int
R.bool
R.id
R.array
<
<item>lunes</item>
<item>martes</item>
</string-array>
<integer-array name="primos">
<item>2</item><item>3</item><item>5</item>
</integer-array>
<array name="asteroides">
<item>@drawable/asteroide1</item>
<item>@drawable/asteroide2</item>
</array>
Para acceder a los recursos del sistema desde cdigo usaremos la clase
android.R. Se utiliza la misma estructura de jerrquica de clases. Por
ejemplo android.R.drawable.ic_menu_edit. Para acceder desde XML utiliza la
sintaxis habitual pero comenzando con @android:. Por ejemplo
@android:drawable/ic_menu_edit.
Estilos y temas
Si tienes experiencia con el diseo de pginas web, habrs advertido
grandes similitudes entre HTML y el diseo de layouts. En los dos casos se
utiliza un lenguaje de marcado y se trata de crear diseos independientes
del tamao de la pantalla donde se visualizarn. En el diseo web resultan
clave las hojas de estilo en cascada (CSS), que permiten crear un patrn de
diseo y aplicarlo a varias pginas. Cuando disees los layouts de tu
aplicacin, vas a poder utilizar unas herramientas similares conocidas como
estilos y temas. Te permitirn crear patrones de estilo que podrn ser
utilizados en cualquier parte de la aplicacin. Estas herramientas te
ahorrarn mucho trabajo y te permitirn conseguir un diseo homogneo en
toda tu aplicacin.
Los estilos
Un estilo es una coleccin de propiedades que definen el formato y
apariencia que tendr una vista. Podemos especificar cosas como tamao,
mrgenes, color, fuentes, etc. Un estilo se define en ficheros XML, diferente
al fichero XML Layout que lo utiliza.
Veamos un ejemplo. El siguiente cdigo:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#00FF00"
android:typeface="monospace"
android:text="Un texto" />
Es equivalente a escribir:
<TextView
style="@style/MiEstilo"
android:text="Un texto" />
Habiendo creado en el fichero res/values/styles.xml con el siguiente cdigo:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MiEstilo"
parent="@android:style/TextAppearance.Medium">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">#00FF00</item>
<item name="android:typeface">monospace</item>
</style>
</resources>
Observa como un estilo puede heredar todas las propiedades de un padre
(parmetro parent) y a partir de estas propiedades realizar modificaciones.
Heredar de un estilo propio
Si vas a heredar de un estilo definido por ti no es necesario utilizar el
atributo parent. Por el contrario, puedes utilizar el mismo nombre de un
estilo ya creado y completar el nombre con un punto ms un sufijo.Por
ejemplo:
<style name="MiEstilo.grande">
<item name="android:textSize">18pt</item>
</style>
Creara un nuevo estilo que sera igual a MiEstilo ms la nueva propiedad
indicada. A su vez puedes definir otro estilo a partir de este:
<style name="MiEstilo.grande.negrita">
<item name="android:textStyle">bold</item>
</style>
Los temas
Un tema es un estilo aplicado a toda una actividad o aplicacin, en lugar de
a una vista individual. Cada elemento del estilo solo se aplicar a aquellos
elementos donde sea posible. Por ejemplo, CodeFont solo afectar al texto.
Para aplicar un tema a toda una aplicacin edita el
fichero AndroidManifest.xml y aade el parmetro android:theme en la
etiqueta <application>:
<application android:theme="@style/MiTema">
Tambin puedes aplicar un tema a una actividad en concreto:
<activity android:theme="@style/MiTema">
Adems de crear tus propios temas vas a poder utilizar algunos disponibles
en el sistema. Puedes encontrar una lista de todos los estilos y temas
disponibles en Android
en:http://developer.android.com/reference/android/R.style.html