Está en la página 1de 258

Manual Básico

Android Studio

-
~-r;;-~=-=-
=-·
---·-
-----
===--=-
--·-·
- e...;:.:z;.:;..
��
��... _
=;:::=..
=

==~::-
=

-1-
ÍNDICE

1 -Instalación de las herramientas necesarias para


programar para Android Studio
2 -Pasos para crear el primer proyecto Android Studio
3 -Capturar el clic de un botón
4 -Controles RadioGroup y RadioButton
5 -Control CheckBox
6 -Control Spinner
7 -Control ListView (con una lista de String)
8 -Control ImageButton
9 -Notificaciones sencillas mediante la clase Toast
10 -Control EditText
11 -Lanzar un segundo "Activity"
12 -Lanzar un segundo "Activity" y pasar parámetros
13 -Almacenamiento de datos mediante la clase SharedPreferences
14 -Almacenamiento de datos en un archivo de texto en la memoria interna
15 -Almacenamiento de datos en un archivo de texto
localizado en una tarjeta SD
16 -Almacenamiento en una base de datos SQLite
17 -Instalación del programa Android en un dispositivo real
18 -Layout (LinearLayout)
19 -Layout (TableLayout)
20 -Layout (FrameLayout)
21 -Layout (ScrollView y LinearLayout)
22 -Icono de la aplicación
23 -Reproducción de audio (archivo contenido en la aplicación)
24 -Reproducción, pausa, continuación y detención de un archivo de audio.
25 -Reproducción de audio (archivo contenido en una tarjeta SD)
26 -Reproducción de audio (archivo localizado en internet)
27 -Reproducción de audio utilizando el reproductor
propio de Android (vía Intent)
28 -Grabación de audio mediante el grabador
provisto por Android (via Intent)
29 - Captura de audio mediante la clase MediaRecorder

-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

Descarga de herramientas necesarios para


programar para Android con el Android Studio
1 - Primero debemos instalar el compilador de Java y la máquina virtual. Estas
herramientas las podemos descargar de:
Java SE Development Kit (JDK).

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.

Ahora procedemos a su instalación en el equipo ejecutando el archivo que acabamos de


descargar:

Android Studío Setup l =I


,Welcome
.. ,,.,, -u;; to
l.1 the Android Studio
•• 1

:Setup
', 4_ I

Setup will guide you through the installation of Android


Studio.

It is recommended that you dose ali other applications.


before starting Setup. This 'NiTI make it possible to update
relevant sys.tem files '11.'ithout having to reboot your
computer.

Click Next to co.ntinue.

< Ba~ ][ Next> 'Cancel

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

Space required: 3.8GB


.~ m

< Back JI Next > J [ C_anceJ

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-
=

W'elcome to Andro'id Studi,o

·Recent Prt¡jeds Quid: Start

Sfürtt a 11ew ,Android Studlio prn1ect

G6 Open an e:xistLn:g And:rnid Studfo pwject

t lo ProJcCT Open Yet EiJ. Import .ai, Androidi mide sam¡;>l'e

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-

Desde esta interfaz siempre procedemos para crear un nuevo proyecto.

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:

_ Android Studio Setup

Welcome to Android Studio

Recent Projects Quick Start

~ Start a new Android Studio project

GE\ Open an e ásting And wid Studio project

r lo ProJea Open Vet


00 Importan Android cede sample

ves
+ Chec.k out project from Version Control

ti! Import Non-Android Studio project

Configure <>
1g Docs and How-Tos <>

And,<>td Studlo 1.0.i Suild B5.1641BK Check for upd~tes now"

Elegimos la opción "Start a New Android Studio project"

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

Configure your new project

Application name:[ 1 ProyectoOOl ]

c,m""" º'"'"""~ '"''"'''~·-~·")


Package name: ar. com.tutor, al e5Yª· proyedo001 Edit

Project location:
lllooiiiiCiiii:\iiiiUiiiisiii
eriiis\iiidiiiieiiigiiioiiimiiioiiiiiii
ssiiieiii
t\Aiiiiiiniii
diii
roiiiidiii5iiitiii
udiiiiiii
oiii
Priiioiii
jeiiiciii
tsiii\iii
Priiic,iyiii
iiect
iiiiiii
oOiiiiO
iiiiliiiiii~- - - - -~ º

Prei11ous Cancel j [ Fín1sh

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

Select the form factors your app will run on

DiffEtent platforms reqrnre separare 50Ks.

~ Phone and Tablet

MinimumSDK API 15: Android 4.0.3 (lceCreamS:andwich)

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

O ..,lass r lat ln<lillledJ

Minimum5DK

Ereviom H!@F Cancel j[ Fínish

-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):

_ Create New Proj ect

Add an activity to Mobile

Ad d ND Activity

Blank Acttvity

ICIIIIIIII
,-----
1 1
1 1
1 1

.____
1
1
1
1
..,,,.,1

E.reviC>os J @!@- Cancel J [ Finish

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

Choose options for y our new file

( reates a new blank activity w ith an action bar.

<·- :
Activity Name: 1 MainActivity

Layout Name:
:============~
1activity_main

Title:
·1:::=========================:
MainActivity

Menu Resource Na me:


:::=========================:
l~m _ _ _ _ _ _ _ _~
_ e_n_u___m_a_in

Blank Actrvity

):revioas J [ Ne.xi. J [ Cancel

Tenemos finalmente creado nuestro primer proyecto en Android Studio y podemos ahora ver el entorno del Android
Studio para codificar la aplicación:

Q ProyedoOOl .i-.,p tJ s«: t::I mÁir1 ~ res ~ lil)'OOl ) i 11ctM!fy~.:mil

.Al'llfrc,id -0 *" ~· 1- mJ.l'ln,llctiVJlyJ.wi!l lt !i «dvrly_mar,.Jffll K--'-=================================-cl


~-(· o.

Compor.iMt f r t~
... CJ m:.nifem-
C:, l.oJo"" [ijj • Q, . -i ~.S<r...
.. CJ j.:iv11
Y Ci tes
~ Fr.miM¡ollt'
G]Linw:LD)'Out (Hi;ri.:ont11D
@-...,--
• Totlf~ · ,:-:1rm9,r1'1t·lkl~i,,,otld
• EJ dt-O'A'llble
O ur:i~d11y1art (llertK.!'[)
., liJ L!yout
G;!Tahlo:üyout
~ J.allldtaw
• IC me:nu
[ ]<irid1:iyout
,- ri::l v.1rues
lfflRt.l!~j,,,eUrf,cut
"' ~ Gradle S<rip':.s
l::I W'odg,t,
Pl~Texn'itw
l,u-gc.Text
Mediumlot
Sm11lllcrl
t Button

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:

ProyectoOOl - [F:\tutorialesya\ ProyectoOOl] - [app] -


Eile J;;dit Yiew )1/avigate rode Analy~e Befactor

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

<TextView and.r oid : text=" Hell-o worl d r" android : layout_wi d


androi d: l ayout_ height="wrap_content " / >

IÉJ</ Relati veLayout~

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

[ ] P,u ,'i'""-ord <J o o •


t~,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

~ndroid virtual device: ~[_N_ex


_ u_,,_ S_ A

Use same devi·c e for fut ure launches


_ PI_2_1_x8
_ 6_ _ _ _ _ _ _ _ _ ~ª-º
+·i+ Cancel

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.

Cuando terminó de cargarse el emulador debe aparecer la interfaz del mismo:

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.

La interfaz visual debe quedar algo semejante a esto:

e MainActivityjava ,. : , activity_main.xml x
________________
._

Palette O:· !- [l- 1ml Nexus 4• O· Q)AppTheme = MainA.ctivitr - w


1 121
-b -P-la-in_T_ext
-1 @ _V_ i-ew
_ _ __

[@ 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

Palette O· !- [l. l!!! Nexus4 •


~===------~==~~
o• ¡,. 'W' 2
(!)AppTheme = MainActívity-
CJ Layouts
[Q] Fra m elayout
[IlJ Linearlayout (Horizontal);
§ Linearlayout (Vertical)
ltlJ TableLayout
ª TableRow
fil! Gridlayout
[g Relativelayout
CJ Widgets
[@ Plain TextView

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

llJ Pa,sword textColorHighli


~ -

También vamos a especificar la propiedad "id", y le asignaremos el valor tv1

- 19 -
e MainActivity.java

Palette
x
O· !<- [l.
activity_ma in.xml x

l!!i Nexus 4 • ----------~==~-----~~


o•
(i) Applheme :I
""" MainActivity• ¡et. Component Tree ~ 1 O · -+ft
Ll Layouts w
1 1 21. ~ iceScreen
[QJ Fromelayout q_[. T Q:Q Relativelayo ut
[I] Linea rl ay out (H o rizonta 1 @ tvl (TextView) - "Ingrese
§ Linearlayout (Vertical)
~ Tablelayout
t§ Ta bl eRow
@l GridLayout
Q:Q Relativelayout
Ll Widgets
[@ Plain TextView
[@ Large T ext
l@ Medium Text
[@ Small Text
o~ Button
°' Small Button
@ RadioButton
Pr:operties ? ~ T
ellipsize
[;a checkBox
Switch enabled o
- ToggleButton focusable o
ImageButton focusableln Toe O
lmageView
fontFam ily
- ProgressBa r (Large)
fontFeatu reSett
- ProgressBa r [Norma ~
- ProgressBa r (Small) ~ gravity [J
- Progres.sBa r [Horizontal) height
•O• SeekBar
RatingBar
-~ Spinner
~ .i WebView
Ll Text Fields inputMethod
!I] Plain Text ~ inputType [J
!I] Person Name labelFor
[J Password
letterSpacinq

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

•· 1- Q.. fiii¡ Nexus 4 •


x
'"===-------==~--------¡
B·c:;) AppTheme :r ~ -Q-- ->! ~
""" Mai nActi~itr ·componen! Tree 1
1\:'o·u,vuu CLuff - - - - - - - - 1 ;¡
~ CheckBox
1.;,21- ice Screen "
'3t
.,. Relativel ayout ~-
Sw itch .,._ e
ToggleButton A tvl (TextView) - "Ingrese

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

l!J Device Screen


- T og g IeButton Q:Q Relativelayout
1 ImageButton
ImageView
º· 1§1 tvl (T extView) - "Ingresé
[l etl (EditText)
- ProgressBar (Large)
@i1 tv2 (T extView) - "Ingrese
- Progr<cssBar (Normal)
Progr<cssBar (Small)
[)et2 (Edi!Text]
- ProgressBar (Horizontal)
•O• SeekBar
RatingBar
.~ Spinner
~ WebView
r:J T ext Fields
II] Plain T ext
[] Person Name
II] Password Properties ? !> T
[] Password (Nu meric) fontFeatu reSett
II] E-mail • gravity ll
[] Phone
height
II] Postal AddreSs
[] Multiline T ext
[] Time
[ ] Date importantForA,
II] Number inputMethod
[] Number (Signecl)
II] Number (Decimal]
.. inputType lnumber]

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

De la pestaña "Widgets" arrastramos un control de tipo "Button":

- 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

ProgressBar (Small) longClickable O


ProgressBar (Horizontal) maxHeig ht
,O, SeekBar
maxlength
RatingBar
maxlines
d 1Spinner
~ WebView maxWidth

Ll Text Fiekls minHeight


!iJ Plain Text minlines.
!iJ Person Name minWidth
!iJ Password nested.Scrolli ng O
[] Passw ord (Numeric)

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.

Abrimos seguidamente el archivo MainActivity.java que lo podemos ubicar en la carpeta


app~ava\ar\com\tutorialesya\proyecto002\MainActivity:

- 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

: package ar . com. tutoriale sya . proyecto002;


c::i manifests
'Y CJjava 1$Jimport andro id . s upport . v7 . app. ActionBarActivi ty;
: import androi d . os . Bundle;
'Y 1::J ar.com.tutorialesya.proyecto002
e n Ma inActivÍty
! import a.ndroid ..view. Menu;
é import android. view . Menuitem;
l::J ar..com.tutorialesya.proyecto002 (and
'Y Oi res
V ... l::J drawable : public class MainActivity extends ActionBarActiv ity
1:J layout il
@OVerride
_ activ ity_main.xml
protecte-d voi d onCreate (Bundle ·s avedinstanceState )
1::J menu super. onCreate (savedinstanceSt.ate );
1::J values setContentView(R . layout . activity_main);
., ® Gradle Scripts é

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

//uo2nspe cti on S2mPli f1.a.bl eifSta t eme nt


if (id== R.id.actian_settings)
return true;

return super. onOptions itemSelected {item);

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.

El código fuente de la clase MainActivity.java es:

package ar.com.tutorialesya.proyecto002;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.Menuitem;

public class MainActivity extends ActionBarActivity {

@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 ><

O - !t- [l. !mi Nexus 4•


----------==:==------===-==!
O• =
0 Ap plheme 'i= -!
MainActivitr Component Tree ]: 1- ~ Í;
,-[gj...,-
Fr_a_m_e_La_y_o u-t- - - - - 1 ¡ ~ . ,¡, 2h l Device Screen
;ii
~
[II] Linearlayout (Horizontal A IHJ Relativelayout ~.
§ 111'. a-
'ª Linearlayout (VerticaQ
Tablelayout
§j TableRow
-------------------.
• ifilil tvl (TextView) - '1ngrese
[) etl (EditText)
@il tv2 (TextView) - '1ngrese ~
!ni Gridlayout
IHJ Relativelayout iil et2 (Ed itText) ~
~ W1d9ets fmJ' button - Sumar"
9
l@ Plain TextView ~ tv3 (TextView) - "Re,aulta ~
o
3
I@ Large T ext
~
:,
[@ Medium Text
l@ Small Text ~
o, Button
v~ Small Button
@ RadioButton
~ CheckBox
Pro perties ? !:> T
Sw itch maxlines
- ToggleButton
maxWidth
ImageButton
minHeight
ImageView
ProgressBar (Large) minlines

- ProgressB-ar (Normal) minWidth


- ProgressBar (SmalQ
ProgressB-ar (Horizontal)
•O• SeekBar
RatingBar
,~ Spinner • padding []
l6ilWebView paddingE.nd
~ Text Field,a paddingStart
[] Plain T ext
shadowColor
[] Person Name
[] Password
singlel ine o
[) Password (Numeric) statelistAnima1
fi"1 r

Finalmente implementaremos la lógica para sumar los dos valores ingresados en los controles EditText:

public void sumar(View view) {


String valorl=etl.getText().toString();
String valor2=et2.getText().toString();
int nrol=Integer.parseint(valorl);
int nro2=Integer.parseint(valor2);
int suma=nrol+nro2;
String resu=String.valueOf(suma);
tv3.setText(resu);
}

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)

La clase completa queda entonces como:

package ar.com.tutorialesya.proyecto002;

import android.support.v7.app.Acti o nBarAc tivit y ;


import a ndro id. os .Bundle;
import android.view.Menu;
import android.view.Men uitem;
import android.view.View;
import a ndroid.widge t. EditText;
import android .widget . TextView;

public class MainActivity extends ActionBarActivity {

- 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

RatingBar <J o n background

:�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;

public class MainActivity extends ActionBarActivity {

private Spinner spinnerl;


private EditText etl,et2;
private TextView tv3;

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

spinnerl = (Spinner) findViewByid(R.id.spinner);


String []opciones={"sumar","restar","multiplicar","dividir"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android .layout
.simple_spinner_item, opciones);

- 43 -
- 44 -
- 45 -
- 46 -
public class MainActivity extends ActionBarActivity {

private String[] paises = { "Argentina", "Chile", "Paraguay", "Bolivia",


"Peru", "Ecuador", "Brasil", "Colombia", "Venezuela", "Uruguay"
private String[] habitantes= { "40000000", "17000000", "6500000",
"10000000", "30000000", "14000000", "183000000", "44000000",
"29000000", "3500000" };
private TextView tvl;
private ListView lvl;
@Override
protected void onCreate(Bundle savedinstanceState)
super.onCreate(savedinstanceState);
setContentView(R.layout.activity_main);

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:

private String[] paises={"Argentina","Chile","Paraguay","Bolivia","Peru",


"Ecuador","Brasil","Colombia","Venezuela","Uruguay"};
private String[] habitantes={"40000000","17000000","6500000","10000000","30000000",
"14000000","183000000","44000000","29000000","3500000"};

Definimos un objeto de tipo TextView y otro de tipo ListView donde almacenaremos las referencias a los objetos que
definimos en el archivo XML:

private TextView tvl;


private ListView lvl;

En el método onCreate obtenemos la referencia a los dos objetos:

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

public void grabar(View v)


String nombre=etl.getText().toString();
String datos=et2.getText().toString();
SharedPreferences preferencias=getSharedPreferences("agenda", ContexJ.MODE Pf
SharedPreferences.Editor editor=preferencias.edit();
editor.putString(nombre, datos);
editor.commit();
Toast.makeText(this,"Datos grabados",Toast.LENGTH_LONG).show();

public void recuperar{View v)


String nombre=etl.getText().toString();
SharedPreferences prefe=getSharedPreferences("agenda", Context.MODE JRIVATE);
String d=prefe.getString(nombre, "");
if (d.length()== O) { !
Toast.makeText(this,"No existe dicho nombre en la agenda",Toast. LENGTH_ LC

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:

prívate EditText etl,et2;

Cuando se presiona el botón grabar:

public void grabar(View v) {


String nombre=etl.getText().toString();
String datos=et2.getText().toString();
SharedPreferences preferencias=getSharedPreferences("agenda", Context.MODE_PRIVATE);
SharedPreferences.Editor editor=preferencias.edit();
editor.putString(nombre, datos);
editor.commit();
Toast.makeText(this,"Datos grabados",Toast.LENGTH_LONG).show();
}

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:

public void recuperar(View v) {


String nombre=etl.getText().toString();

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

public class MainActivity extends ActionBarActivity {

private EditText et1,et2;

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

public void grabar(View v) {


String nomarchivo = et1.getText().toString();
String contenido = et2.getText().toString();
try {

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

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 + " ";
linea = br.readLine();
}
br.close();
archivo.close();
et2.setText(todo);

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

Presionamos el botón "Create Virtual Device".

- 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 -

También podría gustarte