Documente Academic
Documente Profesional
Documente Cultură
sgoliver.netblog
Pensamientosvariossobreprogramacin,Android,.NETyJava
DesarrollandounaaplicacinAndroidsencilla(AndroidStudio)
bySgoliveron16/01/2015inAndroid,Programacin
ElritmodeactualizacionesdeAndroidStudioesbastantealto,porloquealgunosdetallesdeesteartculopuedennoajustarse
exactamentealaltimaversindelaaplicacin.EsteartculoseencuentraactualizadoparalaversindeAndroidStudio1.0.2
DespusdeinstalarnuestroentornodedesarrolloparaAndroidycomentarlaestructurabsicadeunproyectoylos
diferentescomponentessoftwarequepodemosutilizaryaeshoradeempezaraescribiralgodecdigo.Ycomosiemprelomejores
empezarporescribirunaaplicacinsencilla.
EnunprincipiomeplanteanalizarenestecaptuloelclsicoHolaMundoperomstardemepareciqueseibanaquedaralgunas
cosasbsicaseneltintero.AsqueheversionadoamimaneraelHolaMundotransformndoloenalgoascomounHolaUsuario,quees
igualdesencillaperoaadeunpardecosasinteresantesdecontar.Laaplicacinconstardedospantallas,porunladolapantalla
principalquesolicitarunnombrealusuarioyunasegundapantallaenlaquesemostrarunmensajepersonalizadoparaelusuario.As
desencilloeintil,peroaprenderemosmuchosconceptosbsicos,queparaempezarnoestmal.
Pordibujarloparaentendermejorloquequeremosconseguir,seraalgotansencillocomolosiguiente:
Vamosapartirdelproyectodeejemploquecreamosenunapartadoanterior,alquecasualmentellamamosHolaUsuario.
ComoyavimosAndroidStudiohabacreadopornosotroslaestructuradecarpetasdelproyectoytodoslosficherosnecesariosde
unHolaMundobsico,esdecir,unasolapantalladondesemuestranicamenteunmensajefijo.
LoprimeroquevamosahaceresdisearnuestrapantallaprincipalmodificandolaqueAndroidStudionoshacreadopordefecto.Aunque
yalohemoscomentadodepasada,recordemosdndeycmosedefinecadapantalladelaaplicacin.EnAndroid,eldiseoylalgica
deunapantallaestnseparadosendosficherosdistintos.Porunlado,enelfichero/src/main/res/layout/activity_main.xmltendremosel
diseopuramentevisualdelapantalladefinidocomoficheroXMLyporotrolado,enelfichero
/src/main/java/paquete.java/MainActivity.java,encontraremoselcdigojavaquedeterminalalgicadelapantalla.
Vamosamodificarenprimerlugarelaspectodelaventanaprincipaldelaaplicacinaadiendoloscontroles(views)quevemosenel
esquemamostradoalprincipiodelapartado.Paraello,vamosasustituirelcontenidodelficheroactivity_main.xmlporelsiguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LytContenedor"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextViewandroid:id="@+id/LblNombre"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/nombre"/>
<EditTextandroid:id="@+id/TxtNombre"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"/>
<Buttonandroid:id="@+id/BtnAceptar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/aceptar"/>
</LinearLayout>
Alpegarestecdigoenelficherodelayoutaparecernalgunoserroresmarcadosenrojo,enlosvaloresdelosatributosandroid:text.
Esnormal,loarreglaremospronto.
EnesteXMLsedefinenloselementosvisualesquecomponenlainterfazdenuestrapantallaprincipalyseespecificantodassus
propiedades.Nonosdetendremosmuchoporahoraencadadetalle,peroexpliquemosunpocoloquevemosenelfichero.
LoprimeroquenosencontramosesunelementoLinearLayout.Loslayoutsonelementosnovisiblesquedeterminancmosevana
distribuirenelespacioloscontrolesqueincluyamosensuinterior.Losprogramadoresjava,ymsconcretamentedeSwing,conocern
esteconceptoperfectamente.Enestecaso,unLinearLayoutdistribuirloscontrolessimplementeunotrasotroyenlaorientacinque
indiquesupropiedadandroid:orientation,queenestecasoservertical.
Dentrodellayouthemosincluido3controles:unaetiqueta(TextView),uncuadrodetexto(EditText),yunbotn(Button).Entodos
elloshemosestablecidolassiguientespropiedades:
android:id.IDdelcontrol,conelquepodremosidentificarlomstardeennuestrocdigo.Vemosqueelidentificadorloescribimos
precedidode@+id/.Estotendrcomoefectoquealcompilarseelproyectosegenereautomticamenteunanuevaconstanteenla
claseRparadichocontrol.As,porejemplo,comoalcuadrodetextolehemosasignadoelIDTxtNombre,podremosmstarde
accederalldesdenuestrocdigohaciendoreferenciaalaconstanteR.id.TxtNombre.
android:layout_heightyandroid:layout_width.Dimensionesdelcontrolconrespectoallayoutquelocontiene(height=alto,
width=ancho).Estapropiedadtomarnormalmentelosvaloreswrap_contentparaindicarquelasdimensionesdelcontrolse
ajustarnalcontenidodelmismo,obienmatch_parentparaindicarqueelanchooelaltodelcontrolseajustaralaltooanchodel
layoutcontenedorrespectivamente.
Ademsdeestaspropiedadescomunesacasitodosloscontrolesqueutilizaremos,enelcuadrodetextohemosestablecidotambinla
propiedadandroid:inputType,queindicaqutipodecontenidovaaalbergarelcontrol,enestecasosertextonormal(valortext),
aunquepodrahabersidounacontrasea(valortextPassword),untelfono(phone),unafecha(date),.
Porltimo,enlaetiquetayelbotnhemosestablecidolapropiedadandroid:text,queindicaeltextoqueapareceenelcontrol.Yaqu
nosvamosadetenerunpoco,yaquetenemosdosalternativasalahoradehaceresto.EnAndroid,eltextodeuncontrolsepuede
especificardirectamentecomovalordelapropiedadandroid:text,obienutilizaralgunadelascadenasdetextodefinidasenlos
recursosdelproyecto(comoyavimos,enelficherostrings.xml),encuyocasoindicaremoscomovalordela
propiedadandroid:textsuidentificadorprecedidodelprefijo@string/.Dichodeotraforma,laprimeraalternativahabrasidoindicar
directamenteeltextocomovalordelapropiedad,porejemploenlaetiquetadeestaforma:
1
2
3
4
5
<TextView
android:id="@+id/LblNombre"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Escribetunombre:"/>
Ylasegundaalternativa,lautilizadaenelejemplo,consistiraendefinirprimerounanuevacadenadetextoenelficheroderecursos
/src/main/res/values/strings.xml,porejemploconidentificadornombreyvalorEscribetunombre:.
1
2
3
4
5
<resources>
...
<stringname="nombre">Escribetunombre:</string>
...
</resources>
Yposteriormenteindicarelidentificadordelacadenacomovalordelapropiedadandroid:text,siempreprecedidodelprefijo
@string/,delasiguienteforma:
1
2
3
4
5
<TextView
android:id="@+id/LblNombre"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/nombre"/>
Estasegundaalternativanospermitetenerperfectamentelocalizadasyagrupadastodaslascadenasdetextoutilizadasenlaaplicacin,
loquenospodrafacilitarporejemplolatraduccindelaaplicacinaotroidioma.Haremosestoparalasdoscadenasdetextoutilizadas
enellayout,nombreyaceptar.Unavezincluidasambascadenasdetextoenelficherostrings.xmldeberandesaparecerlosdos
erroresmarcadosenrojoquenosaparecieronantesenlaventanaactivity_main.xml.
Conestoyatenemosdefinidalapresentacinvisualdenuestraventanaprincipaldelaaplicacin,veamosahoralalgicadelamisma.
Comoyahemoscomentado,lalgicadelaaplicacinsedefinirenficherosjavaindependientes.Paralapantallaprincipalyatenemos
creadounficheropordefectollamadoMainActivity.java.Empecemosporcomentarsucdigopordefecto:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
packagenet.sgoliver.android.holausuario;
importandroid.support.v7.app.ActionBarActivity;
importandroid.os.Bundle;
importandroid.view.Menu;
importandroid.view.MenuItem;
publicclassMainActivityextendsActionBarActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
getMenuInflater().inflate(R.menu.menu_main,menu);
returntrue;
}
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@Override
publicbooleanonOptionsItemSelected(MenuItemitem){
//Handleactionbaritemclickshere.Theactionbarwill
//automaticallyhandleclicksontheHome/Upbutton,solong
//asyouspecifyaparentactivityinAndroidManifest.xml.
intid=item.getItemId();
//noinspectionSimplifiableIfStatement
if(id==R.id.action_settings){
returntrue;
}
returnsuper.onOptionsItemSelected(item);
}
}
Comoyavimosenunapartadoanterior,lasdiferentespantallasdeunaaplicacinAndroidsedefinenmedianteobjetosdetipoActivity.
Portanto,loprimeroqueencontramosennuestroficherojavaesladefinicindeunanuevaclaseMainActivityqueextiendeeneste
casodeuntipoespecialdeActivityllamadoActionBarActivity,quesoportalautilizacindelaActionBarennuestrasaplicaciones
(laactionbareslabarradettuloymensuperiorqueseutilizaenlamayoradeaplicacionesAndroid).Elnicomtodoque
modificaremosporahoradeestaclaseserelmtodoonCreate(),llamadocuandosecreaporprimeravezlaactividad.Enestemtodo
lonicoqueencontramosenprincipio,ademsdelallamadaasuimplementacinenlaclasepadre,eslallamadaal
mtodosetContentView(R.layout.activity_main).ConestallamadaestaremosindicandoaAndroidquedebeestablecercomo
interfazgrficadeestaactividadladefinidaenelrecursoR.layout.activity_main,quenoesmsquelaquehemosespecificadoenel
fichero/src/main/res/layout/activity_main.xml.Unavezmsvemoslautilidaddelasdiferentesconstantesderecursoscreadas
automticamenteenlaclaseRalcompilarelproyecto.
AdemsdelmtodoonCreate(),vemosquetambinsesobrescribenlosmtodosonCreateOptionsMenu()y
onOptionsItemSelected(),queseutilizanparadefinirygestionarlosmensdelaaplicaciny/olasopcionesdelaactionbar.Porel
momentonotocaremosestosmtodos,msadelanteenelcursonosocuparemosdeestostemas.
Antesdemodificarelcdigodenuestraactividadprincipal,vamosacrearunanuevaactividadparalasegundapantalladelaaplicacin
anlogaastaprimera,alaquellamaremosSaludoActivity.
Paraello,pulsaremoselbotnderechosobrelacarpeta/src/main/java/tu.paquete.java/yseleccionaremoslaopcindemenNew/
Activity/BlankActivity.
Enelcuadrodedilogoqueapareceindicaremoselnombredelaactividad,ennuestrocasoSaludoActivity,elnombredesulayout
XMLasociado(AndroidStudiocrearalmismotiempotantoellayoutXMLcomolaclasejava),quellamaremosactivity_saludo,el
ttulodelaactividadqueaparecerenlaactionbar.Elrestodeopcioneslaspodemosdejarporahoraconsusvalorespordefecto.
PulsaremosFinishyAndroidStudiocrearlosnuevosficherosSaludoActivity.javayactivity_saludo.xmlensuscarpetas
correspondientes.
Deigualformaquehicimosconlaactividadprincipal,definiremosenprimerlugarlainterfazdelasegundapantalla,abriendoel
ficheroactivity_saludo.xml,yaadiendoestaveztanslounLinearLayoutcomocontenedoryunaetiqueta(TextView)paramostrarel
mensajepersonalizadoalusuario.
Paraestasegundapantallaelcdigoqueincluiramosseraelsiguiente:
1
2
3
4
5
6
7
8
9
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LytContenedorSaludo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextViewandroid:id="@+id/TxtSaludo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
10
11
12
android:text=""/>
</LinearLayout>
Porsuparte,sirevisamosahoraelcdigodelaclasejavaSaludoActivityveremosqueesanlogoalaactividadprincipal:
1
2
3
4
5
6
7
8
9
10
publicclassSaludoActivityextendsActionBarActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_saludo);
}
//...
}
Sigamos.Porahora,elcdigoincluidoenestasclaseslonicoquehaceesgenerarlainterfazdelaactividad.Apartirdeaqunosotros
tendremosqueincluirelrestodelalgicadelaaplicacin.
YvamosaempezarconlaactividadprincipalMainActivity,obteniendounareferenciaalosdiferentescontrolesdelainterfazque
necesitemosmanipular,ennuestrocasosloelcuadrodetextoyelbotn.Paraellodefiniremosambasreferenciascomoatributosdela
claseyparaobtenerlasutilizaremoselmtodofindViewById()indicandoelIDdecadacontrol,definidoscomosiempreenlaclaseR.
TodoestoloharemosdentrodelmtodoonCreate()delaclaseMainActivity,justoacontinuacindelallamada
asetContentView()queyacomentamos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
packagenet.sgoliver.android.holausuario;
//..
importandroid.widget.Button;
importandroid.widget.EditText;
publicclassMainActivityextendsActionBarActivity{
privateEditTexttxtNombre;
privateButtonbtnAceptar;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Obtenemosunareferenciaaloscontrolesdelainterfaz
txtNombre=(EditText)findViewById(R.id.TxtNombre);
btnAceptar=(Button)findViewById(R.id.BtnAceptar);
}
//...
}
Comovemos,hemosaadidotambinvariosimportadicionales(losdelasclasesButtonyEditText)parateneraccesoatodaslas
clasesutilizadas.
Unaveztenemosaccesoalosdiferentescontroles,yaslonosquedaimplementarlasaccionesatomarcuandopulsemoselbotndela
pantalla.Paraello,continuandoelcdigoanterior,ysiempredentrodelmtodoonCreate(),implementaremoseleventoonClickde
dichobotn.EstebotntendrqueocuparsedeabrirlaactividadSaludoActivitypasndoletodalainformacinnecesaria.Veamos
cmo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
packagenet.sgoliver.android.holausuario;
//...
importandroid.content.Intent;
publicclassMainActivityextendsActionBarActivity{
privateEditTexttxtNombre;
privateButtonbtnAceptar;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Obtenemosunareferenciaaloscontrolesdelainterfaz
txtNombre=(EditText)findViewById(R.id.TxtNombre);
btnAceptar=(Button)findViewById(R.id.BtnAceptar);
//Implementamoseleventoclickdelbotn
btnAceptar.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
//CreamoselIntent
Intentintent=
newIntent(MainActivity.this,SaludoActivity.class);
//Creamoslainformacinapasarentreactividades
Bundleb=newBundle();
b.putString("NOMBRE",txtNombre.getText().toString());
33
34
35
36
37
38
39
40
41
//Aadimoslainformacinalintent
intent.putExtras(b);
//Iniciamoslanuevaactividad
startActivity(intent);
}
});
}
}
Comoyaindicamosenelapartadoanterior,lacomunicacinentrelosdistintoscomponentesyaplicacionesenAndroidserealiza
medianteintents,porloqueelprimerpasosercrearunobjetodeestetipo.ExistenvariasvariantesdelconstructordelaclaseIntent,
cadaunadeellasdirigidaaunasdeterminadasacciones.Ennuestrocasoparticularvamosautilizarelintentparainiciarunaactividad
desdeotraactividaddelamismaaplicacin,paraloquepasaremosasuconstructorunareferenciaalapropia
actividadllamadora(MainActivity.this),ylaclasedelaactividadllamada(SaludoActivity.class).
SiquisiramostanslomostrarunanuevaactividadyatanslonosquedarallamarastartActivity()pasndolecomoparmetroel
intentcreado.Peroennuestroejemploqueremostambinpasarleciertainformacinalaactividadllamada,concretamenteelnombreque
introduzcaelusuarioenelcuadrodetextodelapantallaprincipal.ParahacerestovamosacrearunobjetoBundle,quepuedecontener
unalistadeparesclavevalorcontodalainformacinapasarentreactividades.Ennuestrocasosloaadiremosundatode
tipoStringmedianteelmtodoputString(clave,valor).ComoclaveparanuestrodatoyoheelegidoelliteralNOMBREaunque
podisutilizarcualquierotroliteraldescriptivo.Porsuparte,elvalordeestaclaveloobtendremosconsultandoelcontenidodelcuadrode
textodelaactividadprincipal,loquepodemosconseguirllamandoasumtodogetText()yconvirtiendoestecontenidoatextomediante
toString()(msadelanteenelcursoveremosporquesnecesariaestaconversin).
TrasestoaadiremoslainformacinalintentmedianteelmtodoputExtras().Sinecesitramospasarmsdatosentreunaactividady
otranotendramosmsquerepetirestospasosparatodoslosparmetrosnecesarios.
Conestohemosfinalizadoyaactividadprincipaldelaaplicacin,porloquepasaremosyaalasecundaria.Comenzaremosdeforma
anlogaalaanterior,ampliandoelmtodoonCreate()obteniendolasreferenciasalosobjetosquemanipularemos,estavezslola
etiquetadetexto.Trasestovienelomsinteresante,debemosrecuperarlainformacinpasadadesdelaactividadprincipalyasignarla
comotextodelaetiqueta.Paraelloaccederemosenprimerlugaralintentquehaoriginadolaactividadactualmedianteel
mtodogetIntent()yrecuperaremossuinformacinasociada(objetoBundle)medianteelmtodogetExtras().
HechoestotanslonosquedaconstruireltextodelaetiquetamediantesumtodosetText(texto)yrecuperandoelvalordenuestra
clavealmacenadaenelobjetoBundlemediantegetString(clave).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
packagenet.sgoliver.android.holausuario;
//...
importandroid.widget.TextView;
publicclassSaludoActivityextendsActionBarActivity{
privateTextViewtxtSaludo;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_saludo);
//Localizarloscontroles
txtSaludo=(TextView)findViewById(R.id.TxtSaludo);
//Recuperamoslainformacinpasadaenelintent
Bundlebundle=this.getIntent().getExtras();
//Construimoselmensajeamostrar
txtSaludo.setText("Hola"+bundle.getString("NOMBRE"));
}
//...
}
Conestohemosconcluidolalgicadelasdospantallasdenuestraaplicacinytanslonosquedaunpasoimportanteparafinalizar
nuestrodesarrollo.Comoyaindicamosenunapartadoanterior,todaaplicacinAndroidutilizaunficheroespecialenformatoXML
(AndroidManifest.xml)paradefinir,entreotrascosas,losdiferenteselementosquelacomponen.Portanto,todaslasactividadesde
nuestraaplicacindebenquedarconvenientementedefinidasenestefichero.Enestecaso,AndroidStudiosedebehaberocupadopor
nosotrosdedefinirambasactividadesenelfichero,perolorevisaremosparaasecharunvistazoalcontenido.
SiabrimoselficheroAndroidManifest.xmlveremosquecontieneunelementoprincipal<Application>quedebeincluirvarioselementos
<Activity>,unoporcadaactividadincluidaennuestraaplicacin.Enestecaso,comprobamoscomoefectivamenteAndroidStudioyase
haocupadodeestopornosotros,aunqueesteficherospodramosmodificarloamanoparahacerajustessifueranecesario.
1
2
3
4
5
6
7
8
9
10
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="net.sgoliver.android.holausuario">
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
11
12
13
14
15
16
17
18
19
20
21
22
android:label="@string/app_name">
<intentfilter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intentfilter>
</activity>
<activity
android:name=".SaludoActivity"
android:label="@string/title_activity_saludo">
</activity>
</application>
</manifest>
Podemosvercomoparacadaactividadseindicaentreotrascosaselnombredesuclasejavaasociadacomovalordel
atributoandroid:name,ysuttulomedianteelatributoandroid:label,msadelanteveremosquopcionesadicionalespodemos
especificar.Vemosunavezmscmoelttulodelasactividadesseindicacomoreferenciaacadenasdecaracteresdefinidascomo
recursos,quedebenestarincluidascomoyahemoscomentadoanteriormenteenelfichero/main/res/values/strings.xml
Elltimoelementoquerevisaremosdenuestroproyecto,aunquetampocotendremosquemodificarloporahora,serelfichero
build.gradle.Puedenexistirvariosficherosllamadosasennuestraestructuradecarpetas,adistintosniveles,peronormalmentesiempre
accederemosalqueestalnivelmsinterno,ennuestrocasoelqueestdentrodelmduloapp.Veamosqucontiene:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
applyplugin:'com.android.application'
android{
compileSdkVersion21
buildToolsVersion"21.1.2"
defaultConfig{
applicationId"net.sgoliver.android.holausuario"
minSdkVersion15
targetSdkVersion21
versionCode1
versionName"1.0"
}
buildTypes{
release{
minifyEnabledfalse
proguardFilesgetDefaultProguardFile('proguardandroid.txt'),'proguardrules.pro'
}
}
}
dependencies{
compilefileTree(dir:'libs',include:['*.jar'])
compile'com.android.support:appcompatv7:21.0.3'
}
GradleeselnuevosistemadecompilacinyconstruccinquehaadoptadoGoogleparaAndroidStudio.Peronoesunsistemaespecfico
deAndroid,sinoquepuedeutilizarseconotroslenguajes/plataformas.Portanto,loprimeroqueindicamosenesteficheroesque
utilizaremoselpluginparaAndroidmediantelasentenciaapplyplugin.Acontinuacindefiniremosvariasopcionesespecficasde
Android,comolasversionesdelaAPImnima(minSdkVersion),APIobjetivo(targetSdkVersion),yAPIdecompilacin
(compileSdkVersion)queutilizaremosenelproyecto,laversindelasbuildtools(buildToolsVersion)quequeremosutilizar(esuno
deloscomponentesquepodemosdescargar/actualizardesdeelSDKManager),laversintantointerna(versionCode)comovisible
(versionName)delaaplicacin,olaconfiguracindeProGuardsiestamoshaciendousodel(nonospreocupamosporahoradeesto).
Duranteelcursoiremosviendoconmsdetalletodosestoselementos.Elultimoelementollamadodependenciestambines
importanteynosservirentreotrascosasparadefinirlaslibrerasexternasqueutilizaremosenlaaplicacin.Pordefectovemosquese
aadelalibreradecompatibilidadappcompatquenospermiteutilizarlaActionBarenlamayoradeversionesdeAndroid,ytodoslos
fichero.jarqueincluyamosenlacarpeta/libs.
Llegadosaqu,ysitodohaidobien,deberamospoderejecutarelproyectosinerroresyprobarnuestraaplicacinenelemulador,pero
paraellotendremosquedefinirprimerouno.Vamosadescribirlospasosparahacerlo.
ParapoderprobaraplicacionesAndroidennuestroPC,sintenerquerecurriraundispositivofsico,tenemosquedefinirloquese
denominanAVD(AndroidVirtualDevice).ParacrearunAVDseleccionaremoselmenTools/Android/AVDManager.Sieslaprimera
vezqueaccedemosaestaherramientaveremoslapantallasiguiente:
PulsandoelbotncentralCreateavirtualdeviceaccederemosalasistenteparacrearunAVD.Enelprimerpasotendremosque
seleccionaralaizquierdaqutipodedispositivoqueremosquesimulenuestroAVD(telfono,tablet,reloj,)yeltamao,resolucin,y
densidaddepxelesdesupantalla.EnmicasoseleccionarporejemplolascaractersticasdeunNexus4ypasaremosalsiguientepaso
pulsandoNext.
EnlasiguientepantallaseleccionaremoslaversindeAndroidqueutilizarelAVD.Aparecerndirectamentedisponibleslasque
instalamosdesdeelSDKManageralinstalarelentorno,aunquetenemoslaposibilidaddedescargareinstalarnuevasversionesdesde
estamismapantalla.EnmicasoutilizarKitKat(API19)paraesteprimerAVD(podemoscreartantoscomoqueramosparaprobar
nuestrasaplicacionessobredistintascondiciones).
EnelsiguientepasodelasistentepodremosconfiguraralgunascaractersticasmsdelAVD,comoporejemplolacantidaddememoria
quetendrdisponible,sisimulartenercmarafrontaly/otrasera,tecladofsico,RecomiendopulsarelbotnShowAdvanced
Settingsparavertodaslasopcionesdisponibles.Siquierespuedesajustarcualquieradeestosparmetros,peroporelmomentoos
recomiendodejartodaslasopcionespordefecto.TanslonosaseguraremosdeteneractivadalaopcinUseHostGPUconlaque
normalmenteconseguiremosunmayorrendimientodelemulador.
TraspulsarelbotnFinishtendremosyaconfiguradonuestroAVD,porloquepodremoscomenzaraprobarnuestrasaplicacionessobre
l.
ParaellopulsaremossimplementeelmenRun/Runapp(olateclarpidaMays+F10).AndroidStudionospreguntarenqu
dispositivoqueremosejecutarlaaplicacinynosmostrardoslistas.Laprimeradeellasconlosdispositivosquehayaenesemomento
enfuncionamiento(porejemplosiyatenamosunemuladorfuncionando)yunalistadesplegableconelrestodeAVDsconfiguradosen
nuestroentorno.Podremosseleccionarcualquieradelosemuladoresdisponiblesencualquieradelasdoslistas.Lonormalser
mantenerunemuladorsiempreabiertoyseleccionarlodelaprimeralistacadavezqueejecutemoslaaplicacin.
ElegirparaesteejemploelAVDqueacabamosdecrearyconfigurar.Esposiblequelaprimeraejecucinsedemoreunosminutos,todo
dependerdelascaractersticasdevuestroPC,asquepaciencia.
Sitodovabien,trasunapequea(onotanpequea)esperaaparecerelemuladordeAndroidyseiniciarautomticamentenuestra
aplicacin(siseiniciaelemuladorperonoseejecutaautomticamentelaaplicacinpodemosvolveraejecutarladesdeAndroidStudio,
medianteelmenRun,sincerrarelemuladoryaabierto).
PodemosprobaraescribirunnombreypulsarelbotnAceptarparacomprobarsielfuncionamientoeselcorrecto.
Yconestoterminamosporahora.Esperoqueestaaplicacindeejemploosseadeayudaparaaprendertemasbsicoseneldesarrollo
paraAndroid,comoporejemploladefinicindelainterfazgrfica,elcdigojavanecesarioparaaccederymanipularloselementosde
dichainterfaz,ylaformadecomunicardiferentesactividadesdeAndroid.Enlosapartadossiguientesveremosalgunosdeestostemasde
formamuchomsespecfica.
Podisconsultaronlineydescargarelcdigofuentecompletodeesteartculodesdegithub.
Comparteestaentrada:
Correoelectrnico
Suscrbete
Subscribetoouremailnewslettertoreceiveupdates.
RelatedPosts:
Actionbar/Appbar/ToolbarenAndroid(I)
InterfazdeusuarioenAndroid:CardView
Controlesdeseleccin(V):RecyclerView
EstructuradeunproyectoAndroid(AndroidStudio)
EntornodedesarrolloAndroid(AndroidStudio)
AndroidStudio,aplicacin,bsicos,conceptos,cursoandroid,ejemplo,primera,sencillo
EstructuradeunproyectoAndroid(AndroidStudio)
29ResponsestoDesarrollandounaaplicacinAndroidsencilla(AndroidStudio)
Controlesdeseleccin(V):RecyclerView
Carlos20/01/2015at2:12#
Holaunaconsulta
enelmetodoSaludoActivitydelaclaseSaludoActivity.javacuandodeclarolosiguiente:
privateTextViewtxtSaludo
memuestraencolorvioletaesavariableyconelmsjFieldcanbeconvertedtoalocalvariable
yluegoenelmismometodoyenlasiguientelinea:
txtSaludo=(TextView)findViewById(R.id.TxtSaludo):
memarcalaTxtSaludoenrojoconelmsjcannotresolvethesymbolTxtSaludo
comolosolucionoyporquepasoeso?
Kazama20/01/2015at5:23#
Excelentetutorial,hastaacatodobienconmigo,soloqtuveqagregarunalibreria:
importandroid.view.View
enelMainActivity
ymecorrioexcelente,otrocomentarioesquetuveproblemasconHAXM,peroyaloresolviytambienconcorrerladesdemimovil(SamsungGTS6010)
conectadoaUSBpormododepuracion,peroalfinallogresolucionaresotambien.
seguireporacaleyendoydejandomiscomentarios,deantemano.Milgracias!!!
Francisco24/01/2015at5:07#
Holamuybuentutorialestaexplicadoexelentemente
Tengounadudanopuedoejecutarelemulador,nopuedoinstalarlonoescompatiblemedice.Tengounprocesadoramd,sepodrinstalar?
Joel24/01/2015at17:18#
Excelentetutorial,herealizadomiprimerejemploenAndroidgraciasaestemagnificotutorial,detalladomagnifcamente.
Tuveciertosinconvenientesquelosresolviconmuchaperseveranciaylectura,yquemeayudoaconocermejorellenguaje.
UnodelostemasquemastuveproblemasfueconlaconstanteRqueelsistemanolaveia.
Lorecomiendo,muybueno!
javier27/01/2015at1:50#
AmimeestpasandoquesiguiendoeltutorialnoconsigoquelaR.idmeaparezcaennegro,todoelratolaRlatengoenrojo.yponeel
siguientetextositundomeencima:
CannotresolvesymbolR.
Podraisindicarmecmosolucionarlo?Nosquestoyhaciendomal
Milgraciasdeantemano.
Saludos.
Oscar29/01/2015at22:37#
Hola,noentiendoquesiginifcaelparametrov,enpublicvoidonClick(Viewv)
Rodrigo31/01/2015at19:43#
Venasexplicandomuybienhastaquederrapastecomouncampenen:
Porsuparte,sirevisamosahoraelcdigodelaclasejavaSaludoActivityveremosqueesanlogoalaactividadprincipal.
Siendonuevohastaahentendperfectamente,deahteolvidastedeexplicarbiendondecopiarcadaunodeloscdigosquevasdictando.Alprincipiolo
explicabasmuybiendespustefuistealcarajo
admin31/01/2015at22:09#
Mealegrarecibircrticastanconstructivas.Alfinaldecadaartculoteniselenlace(GitHub)alcdigocompletodelejemplodescrito,que
deberausarsesiemprecomoreferenciacomplementariaalcontenidodelcurso.
Hector02/02/2015at0:01#
Buenasnoches,
Mepuedenayudar?meestdandoerroralejecutarquedice:
error:packageviewdoesnotexistenelmainactivity
Hector02/02/2015at0:17#
Holadenuevo,
Parasolucionarlohedepuradoypulsadoenimportarlaclase,porfavor,mepuedenexplicarporqusesolucionas?
Muchasgracias.
Lupe11/02/2015at18:02#
Buensimogracias
alejandro22/02/2015at18:01#
Excelentematerial!,estabaesperandoqueempiecesautilizarandroidstudioentustutoriales,esperoquesigassacandomasyaquemesonde
muchaayuda,graciasportutrabajo!
Alex23/02/2015at2:36#
Hola,unapequeapregunta.Tublogloestoyusandosolocomoreferenciayrefuerzodeuntutoqueconsegu,peroenelotrotutosecreael
eventoonClickenelxmldelapantalladentrodeButtonAlgoasi:
<Button.
.
.
android:onClick="
Ydespueseneljavasecreaunpublicvoidquecontienetodaslasaccionesarealizarporelevento.Cualformaeslamejor?
Jesus23/02/2015at12:24#
Excelente.Muchasgracias.
Ulises04/03/2015at19:03#
Carlosdecasualidadyamodificasteelarchivoactivity_saludo.xml,yaqueposiblementeseaporeso.
Jimmy14/03/2015at6:22#
Genial!!PorfinalgodirentealHolaMundo.Saludos.
OmarEspinel18/03/2015at23:32#
Faltaadicionar
importandroid.view.View
CarlosLpez 19/03/2015at4:10#
emulator:ERROR:x86emulationcurrentlyrequireshardwareacceleration!
PleaseensureIntelHAXMisproperlyinstalledandusable.
CPUaccelerationstatus:HAXkernelmoduleisnotinstalled!
julio19/03/2015at19:25#
enningunmomentodijistedequeformasesolucionabaelproblemadelandroid:text=@string/nombre/>asicomotambienel
android:text=@string/aceptar/>
simepuedesayudarporfavor
julio19/03/2015at19:25#
porciertonolodijeperomuybuenaporte!!!
CarlosLpez 25/03/2015at20:59#
Tengounpequeoproblemaalejecutarelapkeneldispositivo,yaquemegeneraelsiguienteerrordeanlisis:Sehaproducidounproblema
alanalizarelpaquete.YatratedemodificaralgunosparmetrosyverifiquequeestuvieseinstaladoelAndroid2.2(API8)peromesiguegenerandoel
mismoerror.Puedenporfavorayudarmeconesto,selosagradezcodeantemano.
Saludos
Ulises30/03/2015at8:01#
Hola,enmiproyectonoexistelaclaseR,porloquetodaslasreferenciasaellamelasmarcaenerror(colorrojo)segutodobien,queocurre?
Miguel30/03/2015at14:06#
Paralosquetienenelsiguienteerror
emulator:ERROR:x86emulationcurrentlyrequireshardwareacceleration!
PleaseensureIntelHAXMisproperlyinstalledandusable.
CPUaccelerationstatus:HAXkernelmoduleisnotinstalled!
tuveelmismoproblema.Yleyendoenotrossitios,porfinencontrunasolucin.
DescargareinstalarGenymotion,compatibleconAndoridStudio.Cuandoteloinstalas,tedicequesiquierestambinVirtualBoxdeOracle,elcual
tambintenisqueaceptar,queeselqseencargadeemulareldispositivo.
Unavezinstalado,osvaisaAndoridStudio/File/Setting/Plugins/BrowseRepositories/Genymotion.YseoscrearuniconoalladodeldeSDK
Manager.
ConGenymotiontenisquecrearosunacuenta(esgratuita).Esteprogramaseencargadedescargareldispositivoquequeremosemular.YelVirtualBox,
elencargadodeemularlo.
EnelpropiopropioGeny,daisaadd,yseleccioniseldispositivoylodescargis.
Unavezhechoeso,enAndroidStudio,daisaliconodeGenyyseleccioniseldispositivoyStart.
Yyaest,Runappyfuncionaperfectamente.
Ahuitzol14/04/2015at23:15#
Excelentetutorial,sencillodeseguiryentender.Muchasgracias!!!
JC18/04/2015at0:56#
HolaJulio,parasolucionarlode@string/nombrey@string/aceptarsoloagregaen/src/main/res/values/strings.xml:
Escribetunombre:
Aceptar:
Saludos
LUISEDUARDORAMIREZ18/04/2015at5:35#
Lesfelicito,deverdadgraciasportomarseeltiempoydedicaciondecreartutorialescomoesteycompartirelconocimientoqueparamuchosde
loslectoresesdeimportantisimarelevancia,pd:meconcentromascuandoleoquealvervideos.
Dante05/05/2015at22:15#
Excelentetutorialalprincipiocrequenolograrahacerloperocreoquetodoestamuybienexplicadoylologregraciasportusconocimientos
continuarehastaconseguirappsmascomplejasytiles.
Trackbacks/Pingbacks
DesarrollandounaaplicacinAndroidsencilla(Eclipse)|sgoliver.netblog16/01/2015
[]AndroidStudiocomonuevaherramientaoficialdedesarrolloparaAndroid.Teaconsejoqueleaselnuevocaptulodedicadoalacreacindeunaaplicacin
sencillaenAndroid[]
InterfazdeusuarioenAndroid:Layouts|sgoliver.netblog17/01/2015
[]elartculoanteriordelcurso,dondedesarrollamosunasencillaaplicacinAndroiddesdecero,yahicimosalgunos[]
Dejauncomentario
Name(required)
Email(willnotbepublished)(required)
Website
SUBMITCOMMENT
Publicidad
Publicidad
Archivo
Archivo Elegirmes
Categoras
Categoras Elegircategora
Etiquetas
.NETactualizacinajedrezantlrbasededatosblogC#C++compiladorescontrolescursocursoandroiddescargas
documentacinDOMebookEclipseFKScriptgooglegratisherramientaIAIDEinstalacinjavaJRtfTreelibreralibromanuales
NRtfTreenuevaopensourcepdfpluginprogramacinRTF
mapasMonomquinasvirtualesNChess novedades
tutorialesweb
Enlaces .NET
elGuilleLaWebdeVisualBasic,C#,.NETyms
Enlaces Android
SAXSQlite
AndDev.org[Ingls]
Androcode