Está en la página 1de 13

Navigation

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:

Facebook

Twitter

Google

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

Licencia del Blog


SalvadorGmezOliver.Todoslosderechosreservados.
Quedaprohibidalareproduccintotaloparcialdeloscontenidosdeesteblog,ascomosuusoydifusin,sinelconsentimientopreviodesuautor.
Porfavor,respetalosderechosdeautor.Siquieresemplearalgunodelostextosoimgenesdeesteblogpuedessolicitarloporcorreoelectrnicoaladireccin
indicadaenlaseccindecontacto.

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

2015 sgoliver.net blog. All Rights Reserved.


Powered by WordPress. Designed by

También podría gustarte