Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Android Studio
-
~-r;;-~=-=-
=-·
---·-
-----
===--=-
--·-·
- e...;:.:z;.:;..
��
��... _
=;:::=..
=
==~::-
=
-1-
ÍNDICE
-2-
30 - Dibujar: graficar un píxel
31 - Dibujar: pintar fondo y dibujar líneas
32 - Dibujar: rectángulos
33 - Dibujar: círculos
34 - Dibujar: óvalos
35 - Dibujar: texto
36 - Dibujar: texto con fuentes externas
37 - Dibujar: texto sobre un camino
38 - Dibujar: una imagen
39 - Evento touch: dibujar un círculo
40 - Evento touch: juego del buscaminas
41 - Archivo strings.xml
42 - Internacionalización y archivo strings.xml
43 - Localización y archivo strings.xml
44 - Componente ActionBar (Básica)
45 - Componente ActionBar (Botones de acción)
46 - Componente ActionBar (Ocultarlo y mostrarlo)
-3-
1 - Instalación de las herramientas necesarias
para programar para Android Studio
2 - El segundo paso es la descarga del Android Studio (que contiene todo lo necesario
para comenzar el desarrollo de aplicaciones en Android), lo hacemos del sitio :
Android SDK.
:Setup
', 4_ I
Dejamos por defecto para que instale el Android Studio, el Android SDK, Android Virtual
Device etc.:
-4-
OIOOSe Components
Choose which feab.Jres of Android Studio you want to install.
Check the components you 1/l•ant to install and unchec:k the components yolJ don't want ro
install. Olick Next to rnntinue,
Description
Selec:t components to install: [ 1 MffitfflF.Fif!Mff Positlun your mouse
~ Android SDK over a mrnponent to
~ Android Virtual Device see it5 descrlpt1on.
~ Performance (Intel® HA.X
Dejamos con los valores por defecto en las siguientes pantallas de instalación.
3 - El tercer paso es ejecutar el Android Studio para poder empezar a desarrollar para
Android:
Andrnid Studio
Andro¡d Studio
La primera vez que lo ejecutamos puede salir un diálogo para actualizar el Android SDK
para luego aparecer una interfaz similar a esta:
-5-
=
ves
+ Check o-ut pFi.j·ect from Vers:ion Control
~ Import Nott'L-Android:Studiopmj.ect
Confi'gtme
a¡:_9
IE( Doc:s ·alíld IHow -To~
-
n dr ~tumo 1.0.l Bultd B5.I64Ua.6. o-1! for updtaste. llOW-
Retornar
-6-
2 - Pasos para crear el primer proyecto Android Studio
Una vez que iniciamos el entorno del Android Studio aparece el diálogo principal:
ves
+ Chec.k out project from Version Control
Configure <>
1g Docs and How-Tos <>
Ahora aparecerán una serie de ventanas para configurar el proyecto, el primer diálogo debemos especificar el Nombre
de la aplicación, la url de nuestra empresa (que será el nombre del paquete que asigna java para los archivos fuentes)
y la ubicación en el disco de nuestro proyecto:
-7-
_ Create New Project
O
~
New Project
Android Studio
Project location:
lllooiiiiCiiii:\iiiiUiiiisiii
eriiis\iiidiiiieiiigiiioiiimiiioiiiiiii
ssiiieiii
t\Aiiiiiiniii
diii
roiiiidiii5iiitiii
udiiiiiii
oiii
Priiioiii
jeiiiciii
tsiii\iii
Priiic,iyiii
iiect
iiiiiii
oOiiiiO
iiiiliiiiii~- - - - -~ º
En el segundo diálogo procedemos a especificar la versión de Android mínima donde se ejecutará la aplicación que
desarrollemos (dejaremos la versión 4.0.3):
_ Create N ew Project
O
~
New Project
Android Studio
Lower API levels target mc,re devices, but have fewer features avairable. By
targeting API15 and later, your appwill run on approximately 87,9% ofth e
devices that are active on the Google Play Store. Help me choose.
OTV
Minimum 5DK
Owear
M,n.imumSDK
Minimum5DK
-8-
El tercer diálogo especificamos el esqueleto básico de nuestra aplicación, seleccionaremos "Blank Activity" (es decir se
generará el código básico para que nuestra aplicación tenga una ventana):
Ad d ND Activity
Blank Acttvity
ICIIIIIIII
,-----
1 1
1 1
1 1
.____
1
1
1
1
..,,,.,1
Finalmente el último diálogo tenemos que indicar el nombre de la ventana principal de la aplicación (Activity Name) y
otros datos más que veremos a lo largo del curso (dejaremos con los nombres por defecto que propone Android
Studio):
-9-
~ Create N ew Proj ect
<·- :
Activity Name: 1 MainActivity
Layout Name:
:============~
1activity_main
Title:
·1:::=========================:
MainActivity
Blank Actrvity
Tenemos finalmente creado nuestro primer proyecto en Android Studio y podemos ahora ver el entorno del Android
Studio para codificar la aplicación:
7 !) T
- T.l!ggl'eEiutton
fm.!gC!luttl!II Llyout :he+gh1
lm4g eView :,t,ol~
Ptogtt..Sál11r (L11rge) J<Ces.$l1lilityl.wReg1on
Progm:.El,u (N11rn,11!)
,tpi..
Prog,e.ss811r (5m111/•
Progies~or (HCflwnt111)
~ , kg,ooN
li;ickgroorrdTmt
lb1ing8111r b¡jtkgrO'Urnll intMo.le
,d.. Spi!,n~
illJ YlebV"iew
, i;.hblc o
c<1n.1el:!(0esuiption
CJ TeKt Jiekk
l[J PJainTcrt &1al t<1n
~ Pc~r,thrr..e foo,mble O
[ l P.am11ccd louJMbldnlcuchMode O
:[ P~swotd {Numeñc) ~ 'IJ~Yltj
c-. E:·rn.11il
[}_ Phon,c-
.,
igOOf'~fd'víl)'
~ Pa~.il J.ddrcss
mnport:;in.tF1KA.cccslóibil~
+
iil l~rmm!il t Mt.1~1!1~ .¡. t ·M(WO!d f"'. nll~ ~ G,l'cttCon>olt .. M~mo~MOilltCJr
Q G1'1dlt buUd1tnkhtd 1#\,s st<: (•'Y'llnutt ago) ll i, . ....
- 10 -
El Android Studio nos genera todos los directorios y archivos básicos para iniciar nuestro proyecto, los podemos ver en
el lado izquierdo del entorno de desarrollo:
T c:J ma nifests
Android Manifest.xml
~
T c:J java
:,
tj T 1:J com.example.diegomois set.proyectoO
:,
~ e 'o MainActivity
r:::1 1:J com.example.diegomoísset. proyectoO
V ~ 1 'o ApplicationTest
T Oi res
1:J drawable
T 1:J ic_launcher.png (4)
[iJ ic_launcher.png (hdpi)
lil ic_launcher.png (mdpi)
[iJ ic_launcher.png (xhdp~
lil ic_lau11cher.png (xxhdpi)
1:J layout
activity_main.xml
1:J menu
menu_main.xml
1:J values:
.. ~ dimens.xml (2J
strin gs.xm 1
styles.xml
T (.., Gradle Smpts
(!} build.gradle (Project: ProyectoOOl)
® build.gradle (Module: app)
l.iJ gradle.properties tProJect Properties)
0 settings.gradle (Project Settings)
l.iJ local. properties t'SDK Location)
No haremos en este momento un análisis del significado y objetivo de cada uno de estas secciones y archivos
generados, sino a medida que avancemos con este curso iremos viendo en forma puntual y profunda.
La interfaz visual de nuestro programa para Android se almacena en un archivo XML en la carpeta res, subcarpeta
layout y el archivo se llama activity_main.xml. En esta carpeta tenemos creada nuestra primer pantalla.
Al seleccionar este archivo el Android Studio nos permite visualizar el contenido en "Design" o "Text" (es decir en vista
de diseño o en vista de código):
Vista de diseño:
- 11 -
e MaiaActivityJava x _ activity_main.xml X~=--------------=====~
Palette ,O,•!<- Q.. !i Nexus4• O• Q) AppTheme ""' MainActivity• " · 'W'21•
1:J l.ayouts
[g) Fra m elayout º·
O] Linearlayout (HorizontaQ
§ Linearlayout (Vertical)
[gj Tablelayout
~ TableRow
1m Gridlayout
IHJ Relativelayout
l:J Wid9ets
!@ Plain T extView
!@ Large T ext
l@ Medium Text
l@ SmaJJText
Switch
ToggleButton
1 ImageButton
ImageView
ProgressBar (Large)
- ProgressBar (Normal)
- ProgressBar (Small)
ProgressBar (Horizontal)
•O• SeekBar
RatingBar
§ Spinner
~ WebView
l:J T ext Fields
Desi n Text
Vista de código:
- 12 -
e Ma;nActivityJava x .2 activity_main.xml x
e $ Rela tive[.ayout xmlns : and r o id="http : / / schemas .androi d .com/ap
xmlns: t -ool s= 1~http : / / schemas. andro id. com/ t ools 11 a.ndroi d : 1
androi d : layout_height="match_ p arent" androi d : padding6eft
android :paddingRight="l 6dp"
android :padding'l'op=" l 6dp"
androi d: paddingBottom="16dp" tool s: context=" .MainActivit
l Design IT ext
El Android Studio ya insertó un control de tipo Relativelayout que permite ingresar controles visuales alineados a los
bordes y a otros controles que haya en la ventana (más adelante analizaremos este layout)
Ya veremos que podemos modificar todo este archivo para que se adapte a la aplicación que queremos desarrollar.
A lo largo de este curso iremos viendo los objetivos de cada una de las secciones que cuenta el Android Studio para
implementar la interfaz, codificar en java las funcionalidades de la aplicación etc.
Antes de probar la aplicación en el emulador de un dispositivo Android procederemos a hacer un pequeño cambio a la
interfaz que aparece en el celular: borraremos la label que dice "Helio World" (simplemente seleccionando con el
mouse dicho elemento y presionando la tecla delete) y de la "Palette" arrastraremos un "Button" al centro del celular y
en la ventana "Properties" estando seleccionado el "Button" cambiaremos la propiedad "text" por la cadena "Hola
Mundo":
- 13 -
,l,t¡ClfOIII
C:. .a:pp p.,Jéltc
"" Ll mt1nííests
tJ lil)'(Xlts
• O jw,0
:J n dmel "}'11<.1l
l:ii ,~
{IIl t..\cilrl.4yout llfom,0nul)
lio lt) diwwebl,
• El layo':'1-
O l..iriei:ul -,yout l\ti:~ic:oO
ibll t1bkl~ut
-----
'-1:l• Mwldu
!' 11ctivi!}',JT111Írú:,nl
Ej TabldlcrN
lio l:J mellll.l
[ill Gridl ll)·t:iut
., Iil valu~
~ N.l!!fa!ML.,yC'l.ll
.. ~ GrMle Scril)'3
o w..,...
PJoptttiH ? !) T
- To99leDutt011 pil!:ldingSt,n
!mz,;eButton :.fll!ldow(oklr
!ma.ge'/j-
Prcgrc::;~B.:!; (Lu,c)
~ ~ im! o
Pri:gt~'!:B.u (Norm!J)
Pragrc::;'!:B'.u~
Pri:grc::;~9:Jr (Hcuüonbt)
t!!.\'tAppe:ar.m r;;e
R.-itin98,u 1.cld:CohK
....! ~ ir.11,er
tll"AC1;tlorf..ll9hllght
di \\leb'Jie'l'.I
tat<alorHint
CI Tc:.:t Add,
[j Pl.,inTM lott otorl1r'lk
[ ] PieHCll'I N iitm,e
tcltl:S't)li: JI
f[I P~~<or-rl (t41imcr1cj
thm..t'
II] E~m11il
tt.,niitionhlM'N'
[] Phane;
[] Po<lalMo""
[] Multilinit TfJj(i _,.,~
lr4nslob;;nZ
Ofii9nd l
.. TODO !,,11:nt l og 00 .Gr, dlc {On~olc
Para ejecutar la aplicación presionamos el triángulo verde o seleccionamos del menú de opciones "Run -> Run app" y
en este diálogo procedemos a dejar seleccionado el emulador por defecto que aparece (Nexus 5) y presionamos el
botón "OK":
_ ProyectoOOl - [C:\Users\ diegomoisset\AndroidStudio Projects\ ProyectoOOlJ - [app] - .•\app\src\ma in\res\ layout\activity_mai n.xml - Android Studio 1.0.1
file f:dit lli= f:!avigate .(;ode Analy¡:e Befactor j!uild Ryn I c>Dls VC.S :Window ]:iel p
' ...
"' '"' ?
C. ProyectoOOl ti¡ app Ll src L] main ti res
;l •w• Androfd
'[
c..
... O app
;.:¡, Ll manifests Ü ~hoose a running device
,. Ll java
., üi res
:'i
t::,
,. ~ draw able
~ !J layo ut
"'r·..:1 o activity_main.xml
V ..,. !J m enu
~ values
.. € Gradle Scripts
O
_Laun ch emulator
lmageVíew
- Progress Bar (Large)
ProqressBa r (Normal)
Luego de un rato aparecerá el emulador de Android en pantalla (el arranque del emulador puede llevar más de un
- 14 -
minuto), es IMPORTANTE tener en cuenta que una vez que el emulador se ha arrancado no lo debemos cerrar cada
vez que hacemos cambios en nuestra aplicación o codificamos otras aplicaciones, sino que volvemos a ejecutar la
aplicación con los cambios y al estar el emulador corriendo el tiempo que tarda hasta que aparece nuestro programa
en el emulador es muy reducido.
Procedemos a desbloquear la pantalla de inicio y podremos observar la ejecución de nuestra primer aplicación en
Android:
- 15 -
Este proyecto lo puede descargar en un zip desde este enlace: proyecto001.zip
Retornar
- 16 -
3 - Capturar el clic de un botón
Problema:
Confeccionar un programa que permita la carga de dos números en controles de tipo EditText. Mostrar mensajes que
soliciten la carga de los valores. Disponer un Button para sumar los dos valores ingresados. Mostrar el resultado en un
tercer TextView.
e MainActivityjava ,. : , activity_main.xml x
________________
._
[@ Large Text
[@ Medium Text
[@ Small Text
o Button
~• Small Button
@ RadioButton
[2J CheckBox
Switch Ingrese el primer valor
- ToggleButton
ImageButton Ingrese el segundo valor
JmageView
- ProgressBa r (Large)
ProgressBa r (Normal) 1NEW8UTTQlll 1
- ProgressBa r (Small) Resultado
- ProgressBar (Horizontal)
•O• SeekBar
RatingBar
1~ Spinner
" 1WebView
l:J T ext Fields
[ ] Plain Text
[ ] Person Name
[ ] Pa,ssword
[ ] Passw ord (Numeric)
[ ] E-mail
[ ] Phone
[ ] Postal Address
[ ] Multiline T ext
[ ] Time
[ ] Date
[ ] Number
[ ] Number (Signed)
[ ] Number (Decimal)
Veamos paso a paso como creamos la interfaz visual de nuestro programa. Primero borramos el TextView que aparece
por defecto cuando se crea un proyecto con el Android Studio. Ahora desde la ventana "Palette" seleccionamos de la
pestaña "Widgets" el control "Medium Text" (es de la clase TextView) y lo arrastramos a la ventana de diseño de
nuestra interfaz a la parte superior izquierda:
- 17 -
e MainActivity.java x activity_main.xml x
o• Small Button
@ RadioButton
0 CheckBox
Switch
- Tog g IeButton
lmageButton
ImageView
- ProgressBar (Large)
- ProgressBar (Normal)
ProgressBar (Small)
- ProgressBar (Horizontal)
•O• SeekBar
~ RatingBar
:cd· Spinner
l~ J WebView
CJ Text Fields
[] Plain Text
ro Person Name
[] Pa.ssw ord
ro Password (Numeric)
Ahora lo seleccionamos y en la ventana de propiedades (Properties) especificamos la propiedad text (como habíamos
visto anteriormente) disponemos el texto "Ingrese el primer valor:":
- 18 -
e MainActivityJava X : activity_main.xml !C m
""""'::------------==~=-------===----:1
Palette O- · !.,_ [l• WiJ Nexu, 4 • == MainActivity...- Componen! Tree· ;: * i o ~~ft f
Ll Layouts ,;¡,21. liJ Device Screen ~
[g] Framelayout EJ [IJ (g] . llid Relativt:Layout ~-
~
[ID Linearlayout (Horizontal 1§) textView - "Ingrese El pr ~
§ Linearlay out (Vertical]
lfilJ Tablelayout
~ TableRow
lnJ Gridlayout
Q:Q Relativelayout
Ll Widgets r,
o
3
[¡ill Plain T extView
~
::,
[¡ill Large Text
[¡ill Medium Text
~
[¡ill small Text
OK Button
01 Small Button
@ RadioButton
Properties ? !) T
~ CheckBox outlineProvider
Sw itch
~ padding []
- ToggleButton
lmageButton paddingEnd
ImageView paddingStart
- P rog ressBa r (La rg e]
ProgressBar (Normal)
passw ord o
phoneNumber O
- PmgressBar (Small)
,hadow Color
ProgressBar (Horizontal]
•O• SeekBar singlel ine o
RatingBar
~ Spinner
f6 WebView
Ll iíext Fields
llJ Plain Text
llJ Person Name teKtColor
- 19 -
e MainActivity.java
Palette
x
O· !<- [l.
activity_ma in.xml x
Hemos entonces asignado como nombre a este objeto: tv1 (recordemos que se trata de un objeto de la clase TextView)
Ahora de la paleta de componentes seleccionamos la pestaña "Text Fields" y arrastramos el "Number" (pertenece a la
clase EditText)
- 20 -
L2 activity_main.xml m
e MainActivityJava
Palette
X
ImageButton [] ectitText
ImageView
- Pro-gressBar (Large)
-
ProgressBar (Normal)
ProgressBar (Small) ..
9
r,
o
ProgressBar (Horizontal) 3
•O• SeekBar ~
:,
RatingBar ~
id. Spinner
[e WebView
J:J ifext Fields
[ ] Plain T ext Properties ? t:J T
iI) Person Name ellipsize
[ ] Password
ems 10
iI) Password (Numeri.c)
[ ] E-mail
enabled O
[ ] Phone focusable O
[ ] Posta I Ad d ress focu.sablelnTouchMode l
[ ] Multiline T ext fontFamily
[ ] Time
fontFeature.Sétt
ITT Date
.. gravity [)
-
height
hint
J:J Containers
WRadioGrou p importantForA,
~ ListView
inputMethod
lffl GridView
~ Expanda blelistView .. inputType [num ber]
rl1 ScrollView labelFor
En la ventana de properties estando seleccionado el EditText configuramos la propiedad "id" con el nombre et1 (este
nombre haremos referencia posteriormente desde Java)
Efectuamos los mismos pasos para crear el segundo "Medium Text" y "Number" (inicializamos las propiedades
respectivas) Definimos los id con los nombres tv2 y et2, el resultado visual debe ser algo semejante a esto:
- 21 -
e MainActivity.java X _ activity_main.xm l X
'============================!
Palette
,- - -
O · !,.... [l.. 1ml Nexus 4 •
S-w-it-ch- ----------<1 ,;, 21 •
6• (J) AppTheme =MainActivity- Compone-nt Tree
labelFor
r:J Containers
[!] RadioGroup letterSpacing
~ ListView lines
fil! GridView linksClickable o
1§ ExpandablelistView
[]] Se ro IIView
long(lickable o
maxHeight
~ Horizonta1Scro11View
Cj;p;:irrhViPw maxlength
- 22 -
e MainActivityJava >c ~ activity_main.xml >c
-~=----------------------i
Palette O • !,- j Q.. O• (i) AppTh eme
lii!i Nexus 4 • Component Tree
[QJ Framelayout ,¡, 21 • Y liJ Device 5creen
[D Linearlayout (Horizontal [g Relativel ayout
lEI @J ¡m.
T
§ Linearlayout [Vertical) 1§1 tvl (T extView) - "Ingrese
'ª1 Tablelayout l[j etl (Ed itText)
~ TableRow
1§1 tv2 (T extView) - "Ingrese
lnl Gridlayout
[ ) et2 (Ed itText)
[g Relativelayout
Ll Widgets fo.;i button - "I J.,.. Butt.an''
~ Pla,n TextView
~ LargeText Ingrese el primer valor
~ Medium T ext
~ SmallText lng~ese el segundo valor
ma u on
--
@ RadioButton
[21 CheckBox Properties ? !) T
Sw itch
ToggleButton importantForA,
lmageButton
labelFor
lmageView
1etterSp a ci n g
ProgressBar (Large)
ProgressBar (Normal) lines
Inicializamos la propiedad text con el texto "Sumar" y la propiedad id la dejamos con el valor ya creado llamado
"button".
Para terminar con nuestra interfaz visual arrastramos un tercer objeto de tipo "Medium Text" (es de la clase TextView) y
definimos la propiedad id con el valor "tv3" y la propiedad text con el texto "Resultado", recordemos que la interfaz final
debe ser semejante a esta:
- 23 -
e MainActivityjava ,. ~ activity_main.xml X
Palette O· !- CI,,-
'==============--!
!mi Nexus 4• O• w
Q)AppTheme = MainA.ctivitr - 1 121
- .[@
- b~ P-1-ai_n _Text
- V-ie_w_ _ __
[@ Large Text
[@ Medium Text
[@ Small Text
º' Button
o, Small Button
@ RadioButton
~ CheckBox
Switch Ingrese el primer valor
- ToggleButton
ImageButton Ingrese el segundo valor
ImageView
- Progre.ssBa r (Large)
- ProgressBa r (Normal) 1 NEWBIJTTON 1
- Progr<cssBar (Small) Resultado
ProgressBa r (Horizontal)
•O• SeekBar
RatingBar
1~ Spinner
" We.bView
l:J T ext Fields
[ ] Plain Text
[ ] Person Na m e
[ ] Password
[ ] Password (Numeric)
[ ] E-mail
[ ] Phone
[ ] Postal Address
[ ] Multiline T ext
[ ] Time
[ ] Date
[ ] Number
ro Number (Signed)
ro Number (Decimal)
Si en este momento ejecutamos la aplicación aparece la interfaz visual correctamente pero cuando presionemos el
botón no mostrará la suma.
Hasta ahora hemos trabajado solo con el archivo xml (activity_main.xml) donde se definen los controles visuales de la
ventana que estamos creando.
- 24 -
file !;_dit Yiew t:!avigate Qode Anal~e Befactor Jl:uild Ryn Iools V~ ~indow !::!elp
1L-' Proyecto002 il app CJ src c::i main c::i java l!:J-ar > 1:J com ) 1::J tutorialesya 1:J proyecto002 e MainActivity >
/1.n<lroid O * O· !+- e MainActivity.java X 2 activity_main.xml X
@Override
public boolean onCreateOptionsMenu (Me nu menu)
/ / .Inflat:e ti:e .m~nu; c.h.rs adds .: cems co che act:.an ba.? :. f .:..t is p.resent
getMenuinflater () .infla te (R. menu.menu_main, menu);
return true ;
é
@Override
public boolean onOptionsitemSelected (Menuitem itemJ
/1 HaDd.!.e action bar ~tem =li=ks tere. T.he act1on bar v .:..11
/ / a at:o.mat:.1cally .tandJe c.l.icks on ::he ffome/Up buc:;t:on, so ..!on_g
/1 as you specify a pa.rent: act1vi.ty in And.ro2di'fa1n.fesc:.xml ..
int id= item.getitemid l) ;
La clase MainActivity hereda de la clase ActionBarActivity. La clase ActionBarActivity representa una ventana de
Android y tiene todos los métodos necesarios para crear y mostrar los objetos que hemos dispuesto en el archivo xml.
package ar.com.tutorialesya.proyecto002;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.Menuitem;
@Override
protected void onCreate(Bundle savedinstanceState)
super.onCreate(savedinstanceState);
setContentView(R.layout.activity_main)
@Override
public boolean onCreateOptionsMenu(Menu menu)
// Inflate the menu; this adds items to the action bar if it i s pre ~ent.
getMenuinflater() .inflate(R.menu.menu_main, menu);
return true;
- 25 -
- 26 -
- 27 -
- 28 -
r
m
e MainActivityJava x
Palette
_ a.ctivity_main .xm l ><
Finalmente implementaremos la lógica para sumar los dos valores ingresados en los controles EditText:
Extraemos el texto de los dos controles de tipo EditText y los almacenamos en dos variables locales de tipo String.
Convertimos los String a tipo entero, los sumamos y el resultado lo enviamos al TextView donde se muestra la suma
(previo a convertir la suma a String)
package ar.com.tutorialesya.proyecto002;
- 29 -
- 30 -
- 31 -
- 32 -
- 33 -
- 34 -
- 35 -
- 36 -
- 37 -
- 38 -
- 39 -
- 40 -
- 41 -
- 42 -
e MainActivity.java X : activity_main.xml X
.....
����������������������� m
Palette -1:t- !- [l- lii!J Nexus 4- B- (J)AppTheme Component Tree ]: � -O· _.! � 1
• •en• ______"'-I �
�T-!!ll"D• ev-ic•e S• cre
[IIJ Linearlayout (Horizontal) """MainActivity-
[g Relativelayout
a
�-
§ Linearlayout (Vertical]
� T ablelayout � tvl (TextView) - "Ingrese pn
!§j TableRow í[J editlext
In] Gridlayout [iill tv2 (TextView) - "Ingrese se
.
:¡;'
Q!j Relativelayout
..
[) et2 (EditText) �
1::J Wi<l9ets .
� Plain TextView
=spmner
�
º\ button - 'operar"
�Large Text lngréS� prime \ral(l-1 �
[iill tv3 (TextView) - "resultado" 3
� Mediurn Text
ln�rese segundo valor
�Small Text
e� Button
11em1
o, Small Button �l>llffl'II
@ RadioButton
0 CheckBox
1 OPE�R i
r�ul1.1do
Switch
- ToggleButton
ImageButton
Properties ? !> T
ImageView
ProgressBar (Large) layout:height match_parent
- ProgressBar (Normal) style
- ProgressBar (Small)
accessibilityliveR
- ProgressBar (Horizontal)
1 0 1 SeekBar
alpha
:�1Spinner backgroundTint
�JWebView backgroundTint�
l::J T ext Fields
[] Plain Text
clickable o
contentDescri p tic
[] Person Name
[] Password elevation
[] Password (Nurneric) focusable o
[] E-mail focusablelnToud O
No olvidemos inicializar la propiedad onClick del objeto button con el valor "operar" (dicho nombre es el método que
debemos implementar)
Código fuente:
package ar.com.tutorialesya.proyecto005;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.Menultem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
@Override
protected void onCreate(Bundle savedinstanceState)
super.onCreate(savedinstanceState);
setContentView(R.layout.activity_main);
etl=(EditText)findViewByid(R.id.etl);
et2=(EditText)findViewByid(R.id.et2);
tv3=(TextView)findViewByid(R.id.tv3);
- 43 -
- 44 -
- 45 -
- 46 -
public class MainActivity extends ActionBarActivity {
tvl=(TextView)findViewByid(R.id.tvl);
lvl= (ListView)findViewByid(R.id.listView);
ArrayAdapter<String> adapter= new ArrayAdapter<String>(this, android.lR.layout
.simple_list_item_1, paises);
lvl.setAdapter(adapter); !
lvl.setOnitemClickListener(new AdapterView.OnitemClickListener() 1
@Override i
public void onitemClick(AdapterView parent, View view, int posit�on, long id) {
tvl.setText("Población de "+ lvl.getitemAtPosition(position) !+ " es "+
habitantes[position]);
)) ;
@Override
public boolean onCreateOptionsMenu(Menu menu)
// Inflate the menu; this adds items to the action bar if it is presJ,nt.
getMenuinflater().inflate(R.menu.menu_main, menu);
return true;
@Override
public boolean onOptionsitemSelected(Menuitem item)
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getltemld();
//noinspection SimplifiableifStatement
if (id== R.id.action settings) {
return true;
return super.onOptionsitemSelected(item);
. . . . . . . . . . .____ . . . . . . . . . . . . . . . . . . . . . ___ . . . . . . . . . . . . . .!
Primero definimos dos vectores paralelos donde almacenamos en uno los nombres de países y en el otro almacenamos
la cantidad de habitantes de dichos países:
Definimos un objeto de tipo TextView y otro de tipo ListView donde almacenaremos las referencias a los objetos que
definimos en el archivo XML:
tvl=(TextView)findViewByid(R.id.tvl);
lvl =(ListView)findViewByid(R.id.listView);
- 47 -
- 48 -
- 49 -
- 50 -
- 51 -
- 52 -
- 53 -
- 54 -
- 55 -
- 56 -
- 57 -
- 58 -
- 59 -
- 60 -
- 61 -
- 62 -
- 63 -
- 64 -
- 65 -
- 66 -
- 67 -
- 68 -
- 69 -
- 70 -
- 71 -
- 72 -
- 73 -
- 74 -
- 75 -
- 76 -
- 77 -
- 78 -
- 79 -
- 80 -
- 81 -
- 82 -
- 83 -
- 84 -
- 85 -
- 86 -
public boolean onCreateOptionsMenu(Menu menu) ¡
// Inflate the menu; this adds items to the action bar if it is pres�nt.
getMenuinflater().inflate(R.menu.menu_main, menu);
return true;
@Override
public boolean onOptionsitemSelected(Menuitem item)
!/ Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getitemid();
//noinspection SimplifiableifStatement
if (id == R.id.action_settings) {
return true;
return super.onOptionsitemSelected(item);
else {
et2.setText(d);
! )
Definimos dos objetos de la clase EditText donde se ingresan el nombre de la persona y los datos de dicha persona:
Extraemos los dos datos de los EditText, creamos un objeto de la clas SharedPReferences con el nombre de "agenda".
Creamos un objeto de la clase Editor y procedemos a grabar en el archivo de preferencias mediante putString:
editor.putString(nombre, datos);
Significa que en el archivo de preferencias se almacena una entrada con el nombre de la persona y los datos de dicha
persona.
Por otro lado tenemos la lógica para recuperar los datos de una persona de la agenda:
- 87 -
- 88 -
- 89 -
- 90 -
- 91 -
- 92 -
- 93 -
- 94 -
- 95 -
- 96 -
- 97 -
- 98 -
- 99 -
- 100 -
- 101 -
- 102 -
- 103 -
- 104 -
- 105 -
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1=(EditText)findViewById(R.id.editText);
et2=(EditText)findViewById(R.id.editText2);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
- 106 -
File tarjeta = Environment.getExternalStorageDirectory();
Toast.makeText(this,tarjeta.getAbsolutePath(),Toast.LENGTH_LONG).show();
File file = new File(tarjeta.getAbsolutePath(), nomarchivo);
OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream(file));
osw.write(contenido);
osw.flush();
osw.close();
Toast.makeText(this, "Los datos fueron grabados correctamente",
Toast.LENGTH_SHORT).show();
et1.setText("");
et2.setText("");
} catch (IOException ioe) {
Toast.makeText(this, "No se pudo grabar",
Toast.LENGTH_SHORT).show();
}
}
} catch (IOException e) {
Toast.makeText(this, "No se pudo leer",
Toast.LENGTH_SHORT).show();
}
}
El método para grabar los datos en un archivo de texto localizado en una tarjeta SD comienza obteniendo
el directorio raiz de la tarjeta a través del método getExternalStorageDirectory(), el mismo retorna un
objeto de la clase File.
public void grabar(View v) {
String nomarchivo = et1.getText().toString();
String contenido=et2.getText().toString();
try
{
File tarjeta = Environment.getExternalStorageDirectory();
- 107 -
Creamos un nuevo objeto de la clase File indicando el camino de la unidad SD y el nombre del archivo a
crear:
File file = new File(tarjeta.getAbsolutePath(), nomarchivo);
Por último similar al acceso de un archivo interno creamos un objeto de la clase OutputStreamWriter:
OutputStreamWriter osw =new OutputStreamWriter(new FileOutputStream(file));
Grabamos el contenido del EditText:
osw.write(contenido);
Cerramos el archivo:
osw.flush();
osw.close();
Toast.makeText(this,"Los datos fueron grabados
correctamente",Toast.LENGTH_SHORT).show();
et1.setText("");
et2.setText("");
}
catch (IOException ioe)
{
Toast.makeText(this, "No se pudo grabar",
Toast.LENGTH_SHORT).show();
}
}
Para la lectura del archivo nuevamente obtenemos la referencia de la tarjeta SD para obtener el path de la
unidad de almacenamiento, el resto del algoritmo es similar al visto con un archivo interno:
public void recuperar(View v) {
String nomarchivo = et1.getText().toString();
File tarjeta = Environment.getExternalStorageDirectory();
File file = new File(tarjeta.getAbsolutePath(), nomarchivo);
try {
FileInputStream fIn = new FileInputStream(file);
InputStreamReader archivo=new InputStreamReader(fIn);
BufferedReader br=new BufferedReader(archivo);
String linea=br.readLine();
String todo="";
while (linea!=null)
{
todo=todo+linea+"\n";
linea=br.readLine();
}
br.close();
archivo.close();
et2.setText(todo);
} catch (IOException e)
{
Toast.makeText(this, "No se pudo leer",
Toast.LENGTH_SHORT).show();
}
}
Este proyecto lo puede descargar en un zip desde este enlace: proyecto018.zip
- 108 -
Importante.
Si lo probamos con el emulador del Nexus 5 en el Android Studio cuando tratemos de grabar nos mostrará la
notificación "No se pudo grabar", esto debido a que dicho celular no permite extender la memoria mediante
tarjetas sd.
La solución para probar es crear otro dispositivo virtual. Los pasos para crear otro dispositivo virtual en
Android Studio son los siguientes:
1 - Desde el menú de opciones del Android Studio accedemos a Tools->Android->AVD Manager.
2 - Aparece un diálogo con todas las máquinas virtuales creadas hasta el momento (en las primeras versiones
de Android Studio crea una máquina virtual para el Nexus 5)
- 109 -
- 110 -
- 111 -
- 112 -
- 113 -
- 114 -
- 115 -
- 116 -
- 117 -
- 118 -
- 119 -
- 120 -
- 121 -
- 122 -
- 123 -
- 124 -
- 125 -
- 126 -
- 127 -
- 128 -
- 129 -
- 130 -
- 131 -
- 132 -
- 133 -
- 134 -
- 135 -
- 136 -
- 137 -
- 138 -
- 139 -
- 140 -
- 141 -
- 142 -
- 143 -
- 144 -
- 145 -
- 146 -
- 147 -
- 148 -
- 149 -
- 150 -
- 151 -
- 152 -
- 153 -
- 154 -
- 155 -
- 156 -
- 157 -
- 158 -
- 159 -
- 160 -
- 161 -
- 162 -
- 163 -
- 164 -
- 165 -
- 166 -
- 167 -
- 168 -
- 169 -
- 170 -
- 171 -
- 172 -
- 173 -
- 174 -
- 175 -
- 176 -
- 177 -
- 178 -
- 179 -
- 180 -
- 181 -
- 182 -
- 183 -
- 184 -
- 185 -
- 186 -
- 187 -
- 188 -
- 189 -
- 190 -
- 191 -
- 192 -
- 193 -
- 194 -
- 195 -
- 196 -
- 197 -
- 198 -
- 199 -
- 200 -
- 201 -
- 202 -
- 203 -
- 204 -
- 205 -
- 206 -
- 207 -
- 208 -
- 209 -
- 210 -
- 211 -
- 212 -
- 213 -
- 214 -
- 215 -
- 216 -
- 217 -
- 218 -
- 219 -
- 220 -
- 221 -
- 222 -
- 223 -
- 224 -
- 225 -
- 226 -
- 227 -
- 228 -
- 229 -
- 230 -
- 231 -
- 232 -
- 233 -
- 234 -
- 235 -
- 236 -
- 237 -
- 238 -
- 239 -
- 240 -
- 241 -
- 242 -
- 243 -
- 244 -
- 245 -
- 246 -
- 247 -
- 248 -
- 249 -
- 250 -
- 251 -
- 252 -
- 253 -
- 254 -
- 255 -
- 256 -
- 257 -
- 258 -