Académique Documents
Professionnel Documents
Culture Documents
Sistema de archivos de intelliJ IDEA que contiene los archivos de configuracin del
proyecto que se est desarrollando.
app
En este archivo se pueden aadir lneas de comando para modificar las opciones de
construccin de gradle.
gradlew
En esta carpeta se ubican los archivos de las construcciones que se generan del
mdulo. SU gestin es automtica por lo que no debemos preocuparnos por
modificar o crear dependencias aqu.
libs
Aqu se encuentran todos los archivos fuente Java de tu proyecto y los recursos
necesarios para integrar el funcionamiento de la aplicacin.
src/androidTest
Esta carpeta contiene el cdigo fuente java que construye la lgica y operatividad a
la aplicacin.
src/main/assets
No encontrars creado este directorio, pero puedes generarlo para guardar recursos
que tengan formato especial o sean tengan fines especficos, como archivos
binarios, texturas o texto plano.
src/res
Archivo de configuracin que optimiza el cdigo del mdulo para generar apks ms
livianas.
Por ahora ignoraremos los archivos del Sistema de Construccin Gradle, las Pruebas
Unitarias, el Control de Versiones en Git y las Reglas ProGuard. La explicacin de cada uno
de estos temas es especializada, por lo que sern temas de otros ebooks o artculos. Quiero
que te concentres en los archivos fuente y los recursos, ya que son la base de las
aplicaciones.
Paso 3. Instala el entorno de desarrollo para Android. Por el momento este se compone del
SDK de Android, el JDK de Java y el IDE Android Studio. Es todo puedes ver como
configurarlos en conjunto aqu:
Click aqu para ver cmo preparar el entorno de desarrollo Android
Paso 4. Si ya ests listo, entonces comienza a devorarte el resto de este ebook.
Te mostrar como crear una pequea app de ejemplo que te mostrar a grandes rasgos la
actividad de un Android Developer.
Inicia la lectura y da tu primer paso para convertirte en beginner.
Tipos de Recursos
La siguiente tabla ilustra los tipos de recursos ms usados en un proyecto Android:
Nombre del
Contenido
Directorio
animator/
anim/
color/
drawable/
layout/
menu/
raw/
values/
arrays.xml
para arreglos
colors.xml
para colores
dimens.xml
para medidas
strings.xml
styles.xml
para cadenas
xml/
Calificadores
Un calificador es una notacin gramatical que condiciona el uso de los recursos en una
aplicacin. Los calificadores estn directamente relacionados con las caractersticas del
dispositivo donde se ejecuta la aplicacin Android.
Como has visto cuando creas un nuevo proyecto en Android Studio, vienen una serie de
carpetas drawable con diferentes nombres. Cada especificacin aadida ms un guion es
un calificador que condiciona los recursos por el tipo de densidad de pantalla establecida.
Por ejemplo drawable-hdpi contendr los recursos drawables que la aplicacin usar si es
ejecutada en un dispositivo con alta densidad (ms de 240dpi para ser exactos).
En ese caso, el framework de Android ayudar a la aplicacin a elegir los drawables en el
directorio correspondiente.
La sintaxis para crear un calificador en un tipo de recurso es la siguiente:
<nombre_del_recurso>-<calificador>
Sintaxis del
Calificador
Configuracin
en
fr
Idioma y Regin
en-rUS
fr-rFR
fr-rCA
ldrtl
Direccin de la escritura
ldltr
Definicin
sw<N>dp
Ejemplos:
Densidad mnima
sw320dp
sw600dp
sw720dp
w<N>dp
w720dp
w1024dp
respectivo.
Ejemplos:
etc.
h<N>dp
h720dp
h1024dp
Ejemplos:
etc.
small
Permite
configurar
los
recursos
dependiendo del tamao de la pantalla.
Por tamao entindase las siguientes
resoluciones aproximadas:
normal
Tamao de la pantalla
large
xlarge
small: 320x426 dp
normal: 320x470 dp
large: 480x640 dp
xlarge: 720x960 dp
Se usa la proporcin o ratio de la pantalla
del dispositivo para incluir los recursos.
long
Proporcin de la pantalla
notlong
port
Orientacin de la pantalla
land
se
despliega
Extra-high-density,
mximo
Ejemplos:
v3
etc.
Este archivo de recursos debe contener como nodo principal la etiqueta <resources> para
hacer nfasis en la creacin de recursos. Cada cadena de texto debe ser declarada dentro
de elementos <string> , donde su clave se establece con el atributo name y el contenido va
en lnea.
public
public
public
public
public
public
public
public
public
public
static
static
static
static
static
static
static
static
static
static
final
final
final
final
final
final
final
final
final
final
int
int
int
int
int
int
int
int
int
int
abc_fade_in=0x7f040000;
abc_fade_out=0x7f040001;
abc_grow_fade_in_from_bottom=0x7f040002;
abc_popup_enter=0x7f040003;
abc_popup_exit=0x7f040004;
abc_shrink_fade_out_from_bottom=0x7f040005;
abc_slide_in_bottom=0x7f040006;
abc_slide_in_top=0x7f040007;
abc_slide_out_bottom=0x7f040008;
abc_slide_out_top=0x7f040009;
}
public static final class attr {
Eso significa que para llamar un recurso mediante a la clase R , sigues la sintaxis:
[<paquete>].R.<tipo_de_recurso>.<nombre_del_recurso>
Donde,
<paquete> : Es
ejemplo si
<nombre_del_recurso> : Si buscas
En este caso se usa el smbolo @ para navegar en el DOM de cada recurso XML definido
con anterioridad. Si el recurso se encuentra en el paquete de tu aplicacin no debes usar el
nombre. Pero si est por ejemplo en el paquete de Android, entonces usa android .
Ejemplo:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/titulo"
android:id="@+id/textoTitulo"/>
Y cada una de las secciones de pantalla completa por donde vayas navegando es una
actividad. En ellas se despliega todo el poder del diseo artstico y programtico para
obtener el mejor rendimiento y experiencia de usuario.
Cada transicin entre estados es representada por mtodos callback en la API de Android.
Recuerda que un mtodo callback es un mtodo que se llama automticamente por el
sistema en el momento que este lo requiera. El programador no tiene control sobre esta
ejecucin, pero si puede sobrescribir los mtodos para que se lleven a cabo tareas
personalizadas.
A continuacin se explica cada estado de la actividad y sus respectivas transiciones:
La clase Activity
Las actividades en el API de Android se representan por la clase Activity . Si ves tu
proyecto de Android Studio, veras que ha creado una nueva clase que hereda
de AppCompatActivity .
Esta es una subclase que soporta varios elementos nuevos en versiones anteriores de
Android.
Normalmente su contenido es la sobrescritura del mtodo onCreate() .
Veamos un ejemplo:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
El mtodo onCreate() del cdigo anterior tiene dos instrucciones necesarias en cualquier
actividad, la llamada a la referencia super obligatoria de la superclase y la creacin del
contenido a travs de un recurso layout con setContentView() .
Si puedes notar, se accede a un recurso layout con R.layout.activity_main como
parmetro de setContentView() . Esto se debe a que internamente se lleva a cabo el
proceso de "inflado" de la interfaz.
Cuando leas o escuches este trmino debes saber qu hace referencia al proceso de
convertir definiciones de elementos XML en objetos Java, es decir, un proceso de parsing.
El archivo AndroidManifest.xml
Este archivo es como el pegamento entre los componentes de las aplicaciones para que
funcionen como un todo dentro de Android. Cada aplicacin debe contenerlo
obligatoriamente debido a que la compilacin y parsing se orienta en su contenido.
El archivo AndroidManifest.xml acta como un indicador de las caractersticas de tu
aplicacin, estableciendo todos los componentes que tiene, sus limitaciones, los permisos
que necesita, las versiones de Android donde correr tu aplicacin, etc.
Lee tambin Tutorial bsico del lenguaje XML
Su definicin XML se inicia con el elemento raz <manifest> , el cual debe contener un
nodo <application> que represente la existencia de una aplicacin.
Veamos un ejemplo tpico para un proyecto en blanco de Android Studio:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hermosaprogramacion.megakalc" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.hermosaprogramacion.megakalc.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>
En el apartado la seccin 3 se declar que las aplicaciones Android siempre tendrn una
actividad principal.
Precisamente los elementos <intent-filter> y <action> configuran esta caracterstica.
La propiedad android.intent.action.MAIN especifica que la actividad en cuestin es la
principal. Adems ser la primera
( android.intent.category.LAUNCHER ).
que
se
iniciar
ante
el
usuario
Qu hago? La compilacin genera 2 Apks: esto sucede porque declaraste dos actividades
con la propiedad LAUNCHER . Elige solo la que cumpla el rol de principal.
Este layout bloquea secciones de la pantalla para mostrar un elemento por cada seccin.
LinearLayout
GridLayout
Este tipo de Layout tiene la capacidad de ubicar a sus hijos en forma de una grilla
rectangular. Se basa en el recorrido de los ndices que sectorizan sus celdas para aadir
cada view.
RelativeLayout
Este es uno de los views ms utilizados, debido a que acomoda sus hijos con posiciones
relativas. Cuando digo relativas, me refiero a que dependiendo de la ubicacin de un view
se determinar la posicin de otro, lo que permite un ajuste instantneo por si en algn
momento las pociones cambian.
WebView
Muestra contenido web parseando cdigo HTML.
Entendiendo el RelativeLayout
El RelativeLayout es uno de los layouts ms populares y usados para crear diseos
flexibles y suavizados.
En l se puedes crear infinidad de distribuciones de views a travs de referencias
nominativas.
A diferencia de otros layouts que requieren contener a otros layouts para estructurar el
diseo, situacin que reduce el rendimiento de la aplicacin.
Muchos desarrolladores se confunden a la hora de emplearlo, ya que las referencias pueden
llegar a ser confusas si el conocimiento de ingls no es intuitivo.
Cuando digo referencias me refiero a que no expresaremos la ubicacin de los
componentes de esta forma:
"El botn OK estar ubicado en el punto (200, 120) del layout y sus dimensiones son
200x30 dp"
A esa definicin de atributos se le llama definicin absoluta, y describe con pelos y seales
cuales son las medidas numricas para el View.
A diferencia de esa declaracin, dentro de un RelativeLayout usaremos expresiones como
la siguiente:
"El botn OK estar ubicado a la izquierda del extremo derecho del TextView 2 y sus
dimensiones sern ajustadas al padre"
Notas la diferencia?
No importa de qu tamao sea la pantalla o que densidad maneje, el botn se ajustar
relativamente a las condiciones que se le han impuesto.
Lo que significa: mejor experiencia para distintos usuarios sin importar las caractersticas
de su dispositivo.
Ahora, para llevar estas descripciones a un view en su declaracin XML se han de usar
atributos especializados. Atributos que permiten acomodar el view en relacin a su padre u
otro view. Veamos algunos:
android:layout_above
Ubica el borde inferior del view en cuestin sobre el view que se declar en su valor.
android:layout_below
El borde superior del view es ubicado por debajo del view asignado.
android:layout_toRightOf
android:layout_toLeftOf
El borde superior del view es alineado con el borde superior del relative layout.
Existen muchos ms atributos que se refieren a los lados restantes que podemos utilizar.
Todos son intuitivos si conoces el significado en espaol de los adverbios empleados.
Puedes conocer todos los atributos disponibles en la clase RelativeLayout.LayoutParams.
Por ejemplo
La siguiente ilustracin muestra dos views alineados en un RelativeLayout.
El RadioButton se encuentra alineado a la izquierda del botn y adems su borde superior
coincide tambin:
Android Studio visualiza las posibles referencias entre views en su seccin de diseo. No
obstante se vuelve complejo a medida que se aaden ms views, ya que las relaciones no
se entienden o no son las ms acordes. En este caso es necesario asignar las relaciones
manualmente en el Panel de Propiedades.
Veamos otro ejemplo donde un CheckBox se alinea a los bordes superior y derecho del
RelativeLayout :
Dentro de este mtodo debes ubicar todas las acciones que desees que ocurran al
presionarse el botn. Recibe un parmetro de tipo View , el cual hace alusin a la instancia
del botn seleccionado.
Manejo annimo
Otra forma de usar esta interfaz es creando una clase annima en lnea:
boton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
Atributo android:onclick
Usa la propiedad llamada android:onclick . En ella puedes asignar un mtodo que tenga la
forma de onClick() . Lgicamente el mtodo debe estar previamente definido, retornar en
void
Por ejemplo
Voy a declarar un mtodo llamado sumar() , el cual actuar como onClick.
public void sumar (View v){
suma = a+b;
}
Ahora supn que este mtodo debe ejecutarse cuando se presione el botn. As que voy al
panel de propiedades de Android Studio y se lo asigno directamente:
case R.id.enesimoView:
// acciones
break;
}
}
El ejemplo anterior ilustra que dependiendo del id obtenido y la confrontacin con los ids
registrados en la clase R se implementarn las acciones necesarias.
Con ello ya tenemos claro de qu forma acomodar los views que necesarios dentro del
archivo activity_main.xml . Este archivo trae contenido prefabricado. Elimnalo y djalo
as:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
</RelativeLayout>
El primer mensaje que se muestra es un TextView con una cadena informativa que
guardaremos en strings.xml . Para agregarlo al layout iremos a la paleta de views, te
ubicars en la seccin Widgets y arrastrars un Large Text:
Se desplegar un administrador de los strings que tienes en el proyecto y aquellos que son
propios del sistema (puedes explorar en ambas pestaas, Project y System).
Si eres buen observador, vers que se ha seleccionado el tem app_name y su valor actual
se muestra en un previsualizador de la parte inferior. En este administrador puedes decidir
si usar un valor de la lista de strings que se encuentra actualmente (Si es que ya has definido
previamente tu string manualmente) o crear un string nuevo desde interfaz.
Debido a que no se tiene un string que contenga la cadena de textoInformacion , entonces
crearemos uno nuevo a travs del botn desplegable New Resource. En cuanto es
presionado aparece una opcin llamada New String Value
Por el momento solo se diligencia el nombre del string que en este caso por comodidad se
usa el mismo id del textView. Y el contenido del string ser el texto que vimos en el boceto
anterior.
En la parte inferior se encuentran los directorios donde se aadir el nuevo string. Por el
momento se encuentra el directorio values por defecto y otro values con
calificador w820dp. De acuerdo a tus necesidades selecciona el directorio en que actuar
el string.
Presiona Ok y la cadena se crear y asignar.
Tarea 2.2: Aadir un RadioGroup
El siguiente elemento que aadiremos ser un RadioGroup para generar exclusin entre
varios RadioButtons .
Dirgete a la paleta de views en la seccin Containers y selecciona el elemento RadioGroup.
Luego sitalo en el lmite inferior del textview. Vers que aparecer un tooltip con el mensaje
"center Horizontal + below=textoInformacion" . Ya sabes el significado de la primera
sentencia, en cuanto a la segunda parte, se refiere a que el lmite superior del radiogroup
(below)
del
textview
(o
la
asignacin
del
"Resta" , "Multiplicacin"
Este view personalizado ajusta su ancho a la dimensin del padre, tiene una altura de 1dp
para simule el grosor de una lnea recta y adems se cambi su background a un color
oscuro que resalte en el layout.
alignParentLeft significa que el borde izquierdo del campo de texto estar alineado al borde
izquierda del RelativeLayout . Adicionalmente el borde superior estar por debajo (below)
de la lnea de divisin y se aadirn 40dps de margen superior entre ambos. Es necesario
disminuir su ancho a 80dp en su atributo android:layout_width si queremos conservar
una visibilidad afable.
Ahora aade un texto informativo para el usuario con el atributo android:hint ubicado en
el panel de propiedades. Recuerda que el boceto tena la cadena "x" en este campo (Si
quieres centra el texto con android:gravity= "center_horizontal" ):
Se indica que el borde izquierdo del texto estar junto al lado derecho del campo de texto y
que estarn alineados al mismo nivel en su borde superior. Tambin necesitamos que
ambos limites inferiores estn alineados para que sean del mismo tamao, as que asigna
a la propiedad layout:alignComponent en su campo bottom:bottom al EditText .
Teniendo claras las referencias de lmites en los views prueba ubicar todos los views en la
operacin como se muestra en el diseo. Modifica los atributos como ms te parezca y
aade tu toque personal.
Cntralo horizontalmente
<RadioButton
android:id="@+id/radioSuma"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="false"
android:text="@string/sumaRadio" />
<RadioButton
android:id="@+id/radioResta"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/restaRadio" />
<RadioButton
android:id="@+id/radioMultiplicacion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/multiplicacionRadio" />
<RadioButton
android:id="@+id/radioDivision"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/divisionRadio" />
</RadioGroup>
<View
android:id="@+id/linea"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_centerInParent="true"
android:background="#aa5f5f5f" />
<EditText
android:id="@+id/editNumeroX"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/linea"
android:layout_marginLeft="40dp"
android:layout_marginTop="40dp"
android:ems="10"
android:gravity="center_horizontal"
android:hint="x"
android:inputType="number" />
<TextView
android:id="@+id/textoOperador"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/editNumeroX"
android:layout_alignTop="@+id/editNumeroX"
android:layout_toEndOf="@+id/editNumeroX"
android:layout_toRightOf="@+id/editNumeroX"
android:gravity="center_vertical"
android:text="+"
android:textAppearance="?android:attr/textAppearanceLarge" />
<EditText
android:id="@+id/editNumeroY"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/textoOperador"
android:layout_marginTop="40dp"
android:layout_toRightOf="@+id/textoOperador"
android:ems="10"
android:gravity="center_horizontal"
android:hint="y"
android:inputType="number" />
<TextView
android:id="@+id/textoIgual"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/editNumeroY"
android:layout_alignTop="@+id/editNumeroY"
android:layout_toEndOf="@+id/editNumeroY"
android:layout_toRightOf="@+id/editNumeroY"
android:gravity="center_vertical"
android:text="="
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/textoResultado"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/textoIgual"
android:layout_alignTop="@+id/textoIgual"
android:layout_marginLeft="30dp"
android:layout_toEndOf="@+id/textoIgual"
android:layout_toRightOf="@+id/textoIgual"
android:gravity="center_vertical"
android:text="\?"
android:textAppearance="?android:attr/textAppearanceMedium" />
<Button
android:id="@+id/botonOperar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:onClick="onClickOperar"
android:text="@string/botonOperar" />
</RelativeLayout>
Al presionarlo se despliegan varias opciones, pero la que har el trabajo se denomina Create
Landscape Variation. Si la ejecutas se crear automticamente el directorio para layouts
Landscape y se conservarn los mismo views que tienes actualmente.
Con este procedimiento se nota que el diseo Portrait que se haba creado no es efectivo
en orientacin horizontal. As que dividiremos los contenidos de la aplicacin MegaKalc en
dos secciones verticales. Del lado izquierdo irn los radios y en el lado derecho los campos
de texto y el botn.
Tarea 3.1: Centrar la lnea divisoria
Comienza por intercambiar las medidas de la lnea divisoria, para que quede distribuida
verticalmente. Luego limita el borde derecho del texto informativo para que no sobre pase
la mitad del layout. Debes reacomodar el RadioGroup para que limite horizontalmente con
la lnea divisoria.
En el segmento siguiente debes poner en la parte superior del padre el primer campo de
texto, con ello toda la formula se orientar automticamente. Adicionalmente debes
limitarlo en su borde izquierdo con la lnea divisoria y limitar el borde inferior del edit text
con el borde superior del botn.
Ese es el primer diseo que se me ocurri, no ests obligado a realizar lo mismo. Sera
excelente que practicaras las orientaciones de distintas formas, esto te ayudar a
comprender la ubicacin de los bordes y lmites del RelativeLayout .
El cdigo de este layout sera el siguiente:
res/layout-land/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<TextView
android:id="@+id/textoInformacion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_toLeftOf="@+id/linea"
android:text="@string/textoInformacion"
android:textAppearance="?android:attr/textAppearanceLarge" />
<RadioGroup
android:id="@+id/radiosOperaciones"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/textoInformacion"
android:layout_marginTop="20dp"
android:layout_toLeftOf="@+id/linea"
android:baselineAligned="false">
<RadioButton
android:id="@+id/radioSuma"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="false"
android:text="@string/sumaRadio" />
<RadioButton
android:id="@+id/radioResta"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/restaRadio" />
<RadioButton
android:id="@+id/radioMultiplicacion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/multiplicacionRadio" />
<RadioButton
android:id="@+id/radioDivision"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/divisionRadio" />
</RadioGroup>
<View
android:id="@+id/linea"
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:layout_margin="10dp"
android:background="#aa5f5f5f" />
<EditText
android:id="@+id/editNumeroX"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="40dp"
android:layout_toRightOf="@+id/linea"
android:ems="10"
android:gravity="center_horizontal"
android:hint="x"
android:inputType="number" />
<TextView
android:id="@+id/textoOperador"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/editNumeroX"
android:layout_alignTop="@+id/editNumeroX"
android:layout_toEndOf="@+id/editNumeroX"
android:layout_toRightOf="@+id/editNumeroX"
android:gravity="center_vertical"
android:text="+"
android:textAppearance="?android:attr/textAppearanceLarge" />
<EditText
android:id="@+id/editNumeroY"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/textoOperador"
android:layout_marginTop="40dp"
android:layout_toRightOf="@+id/textoOperador"
android:ems="10"
android:gravity="center_horizontal"
android:hint="y"
android:inputType="number" />
<TextView
android:id="@+id/textoIgual"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/editNumeroY"
android:layout_alignTop="@+id/editNumeroY"
android:layout_toEndOf="@+id/editNumeroY"
android:layout_toRightOf="@+id/editNumeroY"
android:gravity="center_vertical"
android:text="="
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/textoResultado"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/textoIgual"
android:layout_alignTop="@+id/textoIgual"
android:layout_marginLeft="30dp"
android:layout_toEndOf="@+id/textoIgual"
android:layout_toRightOf="@+id/textoIgual"
android:gravity="center_vertical"
android:text="\?"
android:textAppearance="?android:attr/textAppearanceMedium" />
<Button
android:id="@+id/botonOperar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textoOperador"
android:layout_alignWithParentIfMissing="false"
android:layout_below="@+id/editNumeroX"
android:layout_marginTop="30dp"
android:onClick="onClickOperar"
android:text="@string/botonOperar" />
</RelativeLayout>
Al presionar esta opcin aparecer una ventana emergente con la lista de los idiomas que
puedes elegir para la traduccin. Se elige English:
Sencillo cierto?
Para representarlo crea el mtodo onClickOperar() . Luego declara los campos de texto,
las variables de operacin y obtn las referencias.
public void onClickOperar(View v) {
/*
Variables locales
*/
EditText numeroA, numeroB;
int a, b, resultado = 0;
/*
Obtener los campos de edicin
*/
numeroA = (EditText) findViewById(R.id.editNumeroX);
numeroB = (EditText) findViewById(R.id.editNumeroY);
}
EditText
con el
mtodo getText() . Su retorno es de tipo Editable, as que usa el mtodo toString() con
el fin de obtener una cadena:
/*
Convertir el texto a enteros
*/
a = Integer.parseInt(numeroA.getText().toString());
b = Integer.parseInt(numeroB.getText().toString());
obtn
el
Finalmente operamos los dos nmeros dentro de cada case segn sea la opcin elegida
por el usuario. El resultado final lo asignamos al TextView llamado textoResultado a
travs de su mtodo setText() .
// Asignar el resultado
((TextView) findViewById(R.id.textoResultado))
.setText(String.valueOf(resultado));
Completando el cdigo
Finalizando el ejercicio deberas tener MainActivity.java con el siguiente contenido:
public class MainActivity extends AppCompatActivity {
// Variables globales
RadioGroup contenedorRadios;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contenedorRadios = (RadioGroup) findViewById(R.id.radiosOperaciones);
contenedorRadios.check(R.id.radioSuma);
contenedorRadios.setOnCheckedChangeListener(new
RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
TextView operador = (TextView) findViewById(R.id.textoOperador);
switch (contenedorRadios.getCheckedRadioButtonId()) {
case R.id.radioSuma:
operador.setText("+");
break;
case R.id.radioResta:
operador.setText("-");
break;
case R.id.radioMultiplicacion:
operador.setText("*");
break;
case R.id.radioDivision:
operador.setText("/");
break;
}
}
});
}
public void onClickOperar(View v) {
// Variables locales
EditText numeroA, numeroB;
int a, b, resultado = 0;
// Obtener los campos de edicin
numeroA = (EditText) findViewById(R.id.editNumeroX);
numeroB = (EditText) findViewById(R.id.editNumeroY);
// Convertir el texto a enteros
a = Integer.parseInt(numeroA.getText().toString());
b = Integer.parseInt(numeroB.getText().toString());
// Calcular resultado
switch (contenedorRadios.getCheckedRadioButtonId()) {
case R.id.radioSuma:
resultado = a + b;
break;
case R.id.radioResta:
resultado = a - b;
break;
case R.id.radioMultiplicacion:
resultado = a * b;
break;
case R.id.radioDivision:
resultado = a / b;
break;
}
// Asignar el resultado
((TextView) findViewById(R.id.textoResultado))
.setText(String.valueOf(resultado));
}
Qu tal te fue?
Se te hizo ms fcil de comprender la programacin Android?
Cuando alguien interesado en iniciar al desarrollo Android requiere mi ayuda, me enfoco en
proporcionarle estas tres experiencias:
Invitarle a jugar unos pocos minutos con la vista y manejo de eventos de Android
para que vea lo sencillo que es crear interacciones.
Prctica, prctica y prctica. Malcolm Gladwell dice que para dominar un campo
con experticia se requieren 10.000 horas, t ya llevas un par, as que ve por el resto.
Lee uno a uno los tutoriales que hay en la pgina de contenidos de desarrollo
Android. All encontrars todo lo que he publicado y seguir publicando.