android_programación

Upload: marce-perez

Post on 03-Jun-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/12/2019 Android_Programacin

    1/188

  • 8/12/2019 Android_Programacin

    2/188

    Paso 5. Descargar los targets necesarios.

    Ade#,s del 2D de Android "o#entado en el paso B+ ta#!i$n de!e#os des"ar%ar loslla#ados 2D Tar%ets de Android+ /e no son #,s /e las li!rer&as ne"esarias paradesarrollar en "ada na de las versiones "on"retas de Android( As&+ si /ere#os desarrollar

    por e7e#plo para Android (8 tendre#os /e des"ar%ar s tar%et "orrespondiente( Para ello+

    desde E"lipse de!e#os a""eder al #en3 ;indo> = Android 2D and A1D Mana%er;+ y enla se""i.n Availa!le Pa"a%es sele""ionar e instalar todos los pa/etes deseados(

    Paso . Configurar un A!D.

    A la hora de pro!ar y deprar apli"a"iones Android no tendre#os /e ha"erlone"esaria#ente so!re n dispositivo '&si"o+ sino /e podre#os "on'i%rar n e#lador odispositivo virtal 6Android 1irtal Devi"e+ o A1D9 donde poder reali*ar ',"il#ente estas

    tareas( Para ello+ volvere#os a a""eder al A1D Mana%er+ y en la se""i.n 1irtal Devi"espodre#os aFadir tantos A1D "o#o se ne"esiten 6por e7e#plo+ "on'i%rados para distintasversiones de Android9( Para "on'i%rar el A1D tan s.lo tendre#os /e indi"ar n no#!redes"riptivo+ el tar%et de Android /e tili*ar,+ y las "ara"ter&sti"as de hard>are deldispositivo virtal+ "o#o por e7e#plo s resol"i.n de pantalla+ el ta#aFo de la tar7eta 2D+ ola disponi!ilidad de GP2(

    http://www.sgoliver.net/blog/wp-content/uploads/2010/08/instalar-targets.gif
  • 8/12/2019 Android_Programacin

    3/188

  • 8/12/2019 Android_Programacin

    4/188

    Esta a""i.n "rear, toda la estr"tra de "arpetas ne"esaria para "o#pilar n proye"to paraAndroid(

  • 8/12/2019 Android_Programacin

    5/188

    Contiene todo el ".di%o 'ente de la apli"a"i.n+ ".di%o de la inter'a* %r,'i"a+ "lasesa-iliares+ et"( Ini"ial#ente+ E"lipse "rear, por nosotros el ".di%o !,si"o de la pantalla6A"tivity9 prin"ipal de la apli"a"i.n+ sie#pre !a7o la estr"tra del pa/ete 7ava de'inido(

    Carpeta 'res'

    Contiente todos los 'i"heros de re"rsos ne"esarios para el proye"to: i#,%enes+ v&deos+"adenas de te-to+ et"( Los di'erentes tipos de re"rsos de de!er,n distri!ir entre lassi%ientes "arpetas:

    /res/drawable/( Contienen las i#,%enes de la apli"a"i.n( 2e pede dividir en/drawable-ldpi+ /drawable-mdpiy =drawable-hdpipara tili*ardi'erentes re"rsos dependiendo de la resol"i.n del dispositivo(

    /res/layout/( Contienen los 'i"heros de de'ini"i.n de las di'erentes pantallas de lainter'a* %r,'i"a( 2e pede dividir en /layouty /layout-landpara de'inirdistintos layots dependiendo de la orienta"i.n del dispositivo(

    /res/anim/( Contiene la de'ini"i.n de las ani#a"iones tili*adas por la apli"a"i.n(/res/menu/( Contiene la de'ini"i.n de los #en3s de la apli"a"i.n(/res/values/( Contiene otros re"rsos de la apli"a"i.n "o#o por e7e#plo "adenas

    de te-to 6strings.xml9+ estilos 6styles.xml9+ "olores 6colors.xml9+ et"(/res/xml/( Contiene los 'i"heros HML tili*ados por la apli"a"i.n(/res/raw/( Contiene re"rsos adi"ionales+ nor#al#ente en 'or#ato distinto a HML+

    /e no se in"lyan en el resto de "arpetas de re"rsos(Co#o e7e#plo+ para n proye"to nevo Android+ se "rean los si%ientes re"rsos para laapli"a"i.n:

    Carpeta 'gen'

    Contiene na serie de ele#entos de ".di%o %enerados ato#,ti"a#ente al "o#pilar elproye"to( Cada ve* /e %enera#os nestro proye"to+ la #a/inaria de "o#pila"i.n de

    Android %enera por nosotros na serie de 'i"heros 'ente en 7ava diri%idos al "ontrol de losre"rsos de la apli"a"i.n(

    http://www.sgoliver.net/blog/wp-content/uploads/2010/08/estruct-proyecto-res.pnghttp://www.sgoliver.net/blog/wp-content/uploads/2010/08/estruct-proyecto-src.png
  • 8/12/2019 Android_Programacin

    6/188

    El #,s i#portante es el /e se pede o!servar en la i#a%en+ el 'i"hero R.java+ y la "laseR(

    Esta "lase R"ontendr, en todo #o#ento na serie de "onstantes "on los ID de todos losre"rsos de la apli"a"i.n in"lidos en la "arpeta /res/+ de 'or#a /e poda#os a""eder'a"il#ente a estos re"rsos desde nestro ".di%o a traves de este dato( As&+ por e7e#plo+ la"onstante R.drawable.icon"ontendr, el ID de la i#a%en icon.png"ontenida enla "arpeta /res/drawable/( 1ea#os "o#o e7e#plo la "lase R "reada por de'e"to paran proye"to nevo:

    123!"#$%1&11121311!1"

    pa"a%enet.sgoliver(

    p!li"

    'inal

    "lassR ) p!li"stati"'inal"lassattr )

    *

    p!li"stati"'inal"lassdrawable ) p!li"stati"'inalinticon+&x#,&2&&&&( *

    p!li"stati"'inal"lasslayout ) p!li"stati"'inalintmain+&x#,&3&&&&( *

    p!li"stati"'inal"lassstring )

    p!li"stati"'inalintappname+&x#,&&&&1( p!li"stati"'inalinthello+&x#,&&&&&( **

    Carpeta 'assets'

    Contiene todos los de#,s 'i"heros a-iliares ne"esarios para la apli"a"i.n 6y /e sein"lir,n en s propio pa/ete9+ "o#o por e7e#plo 'i"heros de "on'i%ra"i.n+ de datos+ et"(

    La di'eren"ia entre los re"rsos in"lidos en la "arpeta /res/raw/y los in"lidos en la"arpeta /assets/es /e para los pri#eros se %enerar, n ID en la "lase Ry se de!er,

    a""eder a ellos "on los di'erentes #$todos de a""eso a re"rsos( Para los se%ndos sine#!ar%o no se %enerar,n ID y se podr, a""eder a ellos por s rta "o#o a "al/ier otro'i"hero del siste#a( Usare#os no otro se%3n las ne"esidades de nestra apli"a"i.n(

    http://www.sgoliver.net/blog/wp-content/uploads/2010/08/estruct-proyecto-gen.png
  • 8/12/2019 Android_Programacin

    7/188

    (ic)ero Android%anifest.*+l

    Contiene la de'ini"i.n en HML de los aspe"tos prin"ipales de la apli"a"i.n+ "o#o pore7e#plo s identi'i"a"i.n 6no#!re+ versi.n+ i"ono+ ?9+ ss "o#ponentes 6pantallas+#ensa7es+ ?9+ o los per#isos ne"esarios para s e7e""i.n( 1ere#os #,s adelante #,sdetalles de este 'i"hero(

    En el si%iente postvere#os los "o#ponentes so't>are prin"ipales "on los /e pode#os"onstrir na apli"a"i.n Android(

    Co#ponentes de na apli"a"ion Android:

    En el post anterior vi#os la estr"tra de n proye"to Androidy aprendi#os d.nde "olo"ar"ada no de los ele#entos /e "o#ponen na apli"a"i.n+ tanto ele#entos de so't>are "o#ore"rsos %r,'i"os o de datos( En $ste nevo post va#os a "entrarnos espe"&'i"a#ente en los

    pri#eros+ es de"ir+ vere#os los distintos tipos de "o#ponentes de so't>are "on los /epodre#os "onstrir na apli"a"i.n Android(

    En 0ava o (NET esta#os a"ost#!rados a #ane7ar "on"eptos "o#o ventana+ "ontrol+eventos o servi"ios "o#o los ele#entos !,si"os en la "onstr""i.n de na apli"a"i.n(

    Pes !ien+ en Android va#os a disponer de esos #is#os ele#entos !,si"os an/e "on npe/eFo "a#!io en la ter#inolo%&a y el en'o/e( Repase#os los "o#ponentes prin"ipales/e peden 'or#ar parte de na apli"a"i.n Android Por "laridad+ y para evitar "on'sionesal "onsltar do"#enta"i.n en in%l$s+ intentar$ trad"ir lo #enos posi!le los no#!resori%inales de los "o#ponentesJ(

    Acti,it-

    Las a"tividades 6a"tivities9 representan el "o#ponente prin"ipal de la inter'a* %r,'i"a de naapli"a"i.n Android( 2e pede pensar en na a"tividad "o#o el ele#ento an,lo%o a naventana en "al/ier otro len%a7e visal(

    !ie

    Los o!7etos vie> son los "o#ponentes !,si"os "on los /e se "onstrye la inter'a* %r,'i"ade la apli"a"i.n+ an,lo%o por e7e#plo a los "ontroles de 0ava o (NET( De ini"io+ Android

    pone a nestra disposi"i.n na %ran "antidad de "ontroles !,si"os+ "o#o "adros de te-to+!otones+ listas desple%a!les o i#,%enes+ an/e ta#!i$n e-iste la posi!ilidad de e-tender la'n"ionalidad de estos "ontroles !,si"os o "rear nestros propios "ontroles personali*ados(

    Ser,iceLos servi"ios son "o#ponentes sin inter'a* %r,'i"a /e se e7e"tan en se%ndo plano( En"on"epto+ son e-a"ta#ente i%ales a los servi"ios presentes en "al/ier otro siste#aoperativo( Los servi"ios peden reali*ar "al/ier tipo de a""iones+ por e7e#plo a"tali*ardatos+ lan*ar noti'i"a"iones+ o in"lso #ostrar ele#entos visales 6a"tivities9 si se ne"esitaen al%3n #o#ento la intera""i.n "on del sario(

    Content Pro,ider

    Un "ontent provider es el #e"anis#o /e se ha de'inido en Android para "o#partir datosentre apli"a"iones( Mediante estos "o#ponentes es posi!le "o#partir deter#inados datos de

    nestra apli"a"i.n sin #ostrar detalles so!re s al#a"ena#iento interno+ s estr"tra+ o si#ple#enta"i.n( De la #is#a 'or#a+ nestra apli"a"i.n podr, a""eder a los datos de otra atrav$s de los "ontent provider /e se hayan de'inido(

    http://www.sgoliver.net/blog/?p=1295http://www.sgoliver.net/blog/?p=1278http://www.sgoliver.net/blog/?p=1295http://www.sgoliver.net/blog/?p=1278
  • 8/12/2019 Android_Programacin

    8/188

    /roadcast 0ecei,er

    Un !road"ast re"eiver es n "o#ponente destinado a dete"tar y rea""ionar antedeter#inados #ensa7es o eventos %lo!ales %enerados por el siste#a 6por e7e#plo: ;Kater&a

    !a7a@+ ;2M2 re"i!ido@+ ;Tar7eta 2D insertada@+ ?9 o por otras apli"a"iones 6"al/ierapli"a"i.n pede %enerar #ensa7es 6intents+ en ter#inolo%&a Android9 !road"ast+ es de"ir+ no

    diri%idos a na apli"a"i.n "on"reta sino a "al/iera /e /iera es""harlo9(idget

    Los >id%ets son ele#entos visales+ nor#al#ente intera"tivos+ /e peden #ostrarse en lapantalla prin"ipal 6ho#e s"reen9 del dispositivo Android y re"i!ir a"tali*a"ionesperi.di"as( Per#iten #ostrar in'or#a"i.n de la apli"a"i.n al sario dire"ta#ente so!re lapantalla prin"ipal(

    ntent

    Un intent es el ele#ento !,si"o de "o#ni"a"i.n entre los distintos "o#ponentes Android/e he#os des"rito anterior#ente( 2e peden entender "o#o los #ensa7es o peti"iones /e

    son enviados entre los distintos "o#ponentes de na apli"a"i.n o entre distintasapli"a"iones( Mediante n intent se pede #ostrar na a"tividad desde "al/ier otra+ ini"iarn servi"io+ enviar n #ensa7e !road"ast+ ini"iar otra apli"a"i.n+ et"(

    En el si%iente post e#pe*are#os ya a ver al%o de ".di%o+ anali*ando al detalle naapli"a"i.n sen"illa(

    Desarrollando na apli"a"ion de android sen"illa:

    Desp$s de instalar nestro entorno de desarrollo para Androidy "o#entar la estr"tra!,si"a de n proye"toy los di'erentes "o#ponentes so't>are/e pode#os tili*ar ya eshora de e#pe*ar a es"ri!ir al%o de ".di%o( ) "o#o sie#pre lo #e7or es e#pe*ar por es"ri!irna apli"a"i.n sen"illa(

    En n prin"ipio #e plante$ anali*ar en este post el "l,si"o

  • 8/12/2019 Android_Programacin

    9/188

    En pri#er l%ar va#os a "rear n nevo proye"to Android tal "o#o vi#os al 'inal delpri#er post de la serie(Lla#are#os al proye"to ;

  • 8/12/2019 Android_Programacin

    10/188

    Co#o ya vi#os esto nos "rea la estr"tra de "arpetas del proye"to y todos los 'i"herosne"esarios de n

  • 8/12/2019 Android_Programacin

    11/188

    123!"

    #$%1&11121311!1"

    1#1$1%2&21

    -#lversion+1.&encoding+ut,-$4LinearLayot xmlns5android+http5//schemas.android.com/ap6/res/android android5orientation+vertical android5layoutwidth+,illparent android5layoutheight+,illparent4

    Te-t1ie>android5text+7string/nombre android5layoutwidth+,illparent android5layoutheight+wrapcontent/4

    EditTe-tandroid5id+78id/9xt:ombre android5layoutheight+wrapcontent android5layoutwidth+,illparent/4

    Kttonandroid5id+78id/;tnola android5layoutwidth+wrapcontent android5layoutheight+wrapcontent android5text+7string/hola/4

    /LinearLayot4En este HML se de'inen los ele#entos visales /e "o#ponen la inter'a* de nestra pantalla

    prin"ipal y se espe"i'i"an todas ss propiedades( No nos detendre#os #"ho en "ada detallepor/e $se ser, te#a de otro art&"lo+ pero e-pli/e#os n po"o lo /e ve#os en el 'i"hero(

    Lo pri#ero /e nos en"ontra#os es n ele#ento

  • 8/12/2019 Android_Programacin

    12/188

    a7star,n al "ontenido del #is#o+ o !ien ;,illparent@ para indi"ar /e el an"hoo el alto del "ontrol se a7star, al an"ho o alto del layot "ontenedor respe"tiva#ente(

    Con esto ya tene#os de'inida la presenta"i.n visal de nestra ventana prin"ipal de laapli"a"i.n( De i%al 'or#a de'inire#os la inter'a* de la se%nda pantalla+ "reando n nevo'i"hero lla#ado 'r##ensa7e(-#l+ y aFadiendo esta ve* tan solo na eti/eta 69ext=iew9

    para #ostrar el #ensa7e personali*ado al sario( 1ea#os ".#o /edar&a nestra se%ndapantalla:

    123!"#$

    %1&1112

    -#lversion+1.&encoding+ut,-$4LinearLayot xmlns5android+http5//schemas.android.com/ap6/res/android android5layoutwidth+wrapcontent android5layoutheight+wrapcontent4

    Te-t1ie>android5id+78id/9xt?ensaje

    android5layoutheight+wrapcontent android5layoutwidth+,illparent

    android5text+@mensaje4/Te-t1ie>4

    /LinearLayot4Una ve* de'inida la inter'a* de las pantallas de la apli"a"i.n de!ere#os i#ple#entar lal.%i"a de la #is#a( Co#o ya he#os "o#entado+ la l.%i"a de la apli"a"i.n se de'inir, en'i"heros 7ava independientes( Para la pantalla prin"ipal ya tene#os "reado n 'i"hero porde'e"to lla#ado

  • 8/12/2019 Android_Programacin

    13/188

    de Activityy /e i#ple#ente el #$todo onCreateindi"ando /e tili"e la inter'a*de'inida en R.layout.,rmmensaje(

    123

    !"#

    p!li""lassIrm?ensaje e-tendsActivity ) 7Dverride

    p!li"voidonCreateE;undle savedFnstanceGtateH )

    sper.onCreateEsavedFnstanceGtateH( setContent=iewER.layout.,rmmensajeH( **

    Co#o ve#os+ el ".di%o in"lido por de'e"to en estas "lases lo 3ni"o /e ha"e es %enerar lainter'a* de la a"tividad( A partir de a/& nosotros tendre#os /e in"lir el resto de la l.%i"ade la apli"a"i.n( ) va#os a e#pe*ar "on la a"tividad prin"ipal ola0suario+ o!teniendona re'eren"ia a los di'erentes "ontroles de la inter'a* /e ne"esite#os #aniplar+ ennestro "aso s.lo el "adro de te-to y el !ot.n( Para ello tili*are#os el #$todo,ind=iew;yFdEH indi"ando el ID de "ada "ontrol+ de'inidos "o#o sie#pre en la "lase

    R:12

    'inal>dit9ext txt:ombre +E>dit9extH,ind=iew;yFdER.id.9xt:ombreH(

    'inal;utton btnola + E;uttonH,ind=iew;yFdER.id.;tnolaH(Una ve* tene#os a""eso a los di'erentes "ontroles+ ya s.lo nos /eda i#ple#entar lasa""iones a to#ar "ando plse#os el !ot.n de la pantalla( Para ello i#ple#entare#os elevento onCli" de di"ho !ot.n+ vea#os ".#o:

    12

    3!"#$%1&1112

    btnola.setDnClic6DnClic6;undleEH( bundle.putGtringE:D?;R>Jtxt:ombre.get9extEH.toGtringEHH( intent.put>xtrasEbundleH(

    startActivityEintentH( **H(

    Co#o ya indi"a#os en el art&"lo anterior+ la "o#ni"a"i.n entre los distintos "o#ponentesy apli"a"iones en Android se reali*a #ediante intents+ por lo /e el pri#er paso ser, "rearn o!7eto de este tipo( E-isten varias variantes del "onstr"tor de la "lase Fntent+ "ada nade ellas diri%ida a nas deter#inadas a""iones+ pero en nestro "aso parti"lar va#os atili*ar el intent para lla#ar a na a"tividad desde otra de la #is#a apli"a"i.n+ para lo /e

    pasare#os al "onstr"tor na re'eren"ia a la propia a"tividad lla#adora6ola0suario.this9+ y la "lase de la a"tividad lla#ada 6Irm?ensaje.class9(

    2i /isi$ra#os tan s.lo #ostrar na neva a"tividad ya tan s.lo nos /edar&a lla#ar astartActivityEHpas,ndole "o#o par,#etro el intent "reado( Pero en nestro e7e#plo/ere#os ta#!i$n pasarle "ierta in'or#a"i.n a la a"tividad+ "on"reta#ente el no#!re /e

    http://www.sgoliver.net/blog/?p=1295http://www.sgoliver.net/blog/?p=1295
  • 8/12/2019 Android_Programacin

    14/188

    introd*"a el sario en el "adro de te-to( Para ha"er esto va#os a "rear n o!7eto;undle+ /e pede "ontener na lista de pares "lavevalor "on toda la in'or#a"i.n a pasarentre las a"tividades( En nestro "aso s.lo aFadire#os n dato de tipo Gtring#ediante el#$todo putGtringE"laveJ valorH( Tras esto aFadire#os la in'or#a"i.n al intent#ediante el #$todo put>xtrasE!ndleH(

    Qinali*ada la a"tividad prin"ipal de la apli"a"i.n pasa#os ya a la se"ndaria(Co#en*are#os de 'or#a an,lo%a a la anterior+ a#pliando el #$todo onCreateo!teniendo las re'eren"ias a los o!7etos /e #aniplare#os+ esta ve* s.lo la eti/eta dete-to( Tras esto viene lo #,s interesante+ de!e#os re"perar la in'or#a"i.n pasada desde laa"tividad prin"ipal y asi%narla "o#o te-to de la eti/eta( Para ello a""edere#os en pri#erl%ar al intent /e ha ori%inado la a"tividad a"tal #ediante el #$todo getFntentEHyre"perare#os s in'or#a"i.n aso"iada 6o!7eto ;undle9 #ediante el #$todoget>xtrasEH(

    xtrasEH(

    txt?ensaje.set9extEola 8bundle.getGtringE:D?;R>HH( **

    Con esto he#os "on"lido la l.%i"a de las dos pantallas de nestra apli"a"i.n y tan s.lo nos/eda n paso i#portante para 'inali*ar nestro desarrollo( Co#o indi"a#os en no de losart&"los anteriores+ "al/ier apli"a"i.n Android tili*a n 'i"hero espe"ial en 'or#atoHML 6AndroidMani'est(-#l9 para de'inir+ entre otras "osas+ los di'erentes ele#entos /e la"o#ponen( Por tanto+ todas las a"tividades de nestra apli"a"i.n de!en /edar"onveniente#ente re"o%idas en este 'i"hero( La a"tividad prin"ipal ya de!e apare"er pesto/e se "re. de 'or#a ato#,ti"a al "rear el nevo proye"to Android+ por lo /e de!e#osaFadir tan s.lo la se%nda( Para este e7e#plo nos li#itare#os a in"lir la a"tividad en elHML+ #,s adelante vere#os /e op"iones adi"ionales pode#os espe"i'i"ar(

    http://www.sgoliver.net/blog/?p=1278http://www.sgoliver.net/blog/?p=1278http://www.sgoliver.net/blog/?p=1278http://www.sgoliver.net/blog/?p=1278
  • 8/12/2019 Android_Programacin

    15/188

  • 8/12/2019 Android_Programacin

    16/188

    ste es el #,s si#ple de todos los layots de Android( Un Irame

  • 8/12/2019 Android_Programacin

    17/188

    123!"

    #$%1&11121311!

    LinearLayot xmlns5android+http5//schemas.android.com/ap6/res/android android5layoutwidth+,illparent android5layoutheight+,illparent android5orientation+vertical4

    EditTe-tandroid5id+78id/9xt:ombre android5layoutwidth+,illparent android5layoutheight+,illparent/4

    Kttonandroid5id+78id/;tnAceptar android5layoutwidth+wrapcontent android5layoutheight+,illparent/4

    /LinearLayot

    4Esta propiedad nos va a per#itir dar a los ele#entos "ontenidos en el layot nasdi#ensiones propor"ionales entre ellas( Esto es #,s di'i"il de e-pli"ar /e de "o#prender"on n e7e#plo( 2i in"li#os en n

  • 8/12/2019 Android_Programacin

    18/188

    La estr"tra de la ta!la se de'ine de 'or#a si#ilar a "o#o se ha"e en insertados+ y el n3#ero total de "ol#nas /edar, deter#inado por el n3#ero de"o#ponentes de la 'ila /e #,s "o#ponentes "onten%a(

    Por nor#a %eneral+ el an"ho de "ada "ol#na se "orresponder, "on el an"ho del #ayor"o#ponente de di"ha "ol#na+ pero e-isten na serie de propiedades /e nos aydar,n a#odi'i"ar este "o#porta#iento:

    android5stretchColumns( Indi"ar, las "ol#nas /e peden e-pandir paraa!sorver el espa"io li!re de7ado por las de#,s "ol#nas a la dere"ha de la pantalla(

    android5shrin6Columns( Indi"ar, las "ol#nas /e se peden "ontraer parade7ar espa"io al resto de "ol#nas /e se pedan salir por la dere"ha de la palntalla(

    android5collapseColumns( Indi"ar, las "ol#nas de la ta!la /e se /iereno"ltar "o#pleta#ente(

    Todas estas propiedades del 9able

  • 8/12/2019 Android_Programacin

    19/188

    123!"

    #$%1&11121311!1"

    1#1$1%2&2122

    Ta!leLayot xmlns5android+http5//schemas.android.com/ap6/res/android android5layoutwidth+,illparent android5layoutheight+,illparent android5stretchColumns+14

    Ta!leRo>4 Te-t1ie>android5text+Celda 1.1/4 Te-t1ie>android5text+Celda 1.2/4 /Ta!leRo>4

    Ta!leRo>4 Te-t1ie>android5text+Celda 2.1/4 Te-t1ie>android5text+Celda 2.2/4

    /Ta!leRo>4

    Ta!leRo>4 Te-t1ie>android5text+Celda 3 android5layoutspan+2/4

    /Ta!leRo>4

    /Ta!leLayot40elati,ea-out

    El 3lti#o tipo de layot /e va#os a ver es el Relative

  • 8/12/2019 Android_Programacin

    20/188

    En el e7e#plo+ el !ot.n ;tnAceptar se "olo"ar, de!a7o del "adro de te-to 9xt:ombre6android5layoutbelow+7id/9xt:ombre9 y alineado a la dere"ha del layot

    padre 6android5layoutalignNarentRight+true9+ ade#,s de de7ar n#ar%en a s i*/ierda de S pi-eles 6android5layoutmargin

  • 8/12/2019 Android_Programacin

    21/188

    de este siste#a operativo( E#pe*are#os "on los "ontroles #,s !,si"os y se%ire#osposterior#ente "on al%nos al%o #,s ela!orados(

    En este pri#er post so!re el te#a nos va#os a "entrar en los di'erentes tipos de !otones y".#o pode#os personali*arlos( El 2D de Android nos propor"iona tres tipos de !otones:el "l,si"o 6;utton9+ el de tipo on=o'' 69oggle;utton9+ y el /e pede "ontener na

    i#a%en 6Fmage;utton9( En la i#a%en si%iente ve#os el aspe"to por de'e"to de estostres "ontroles(

    No va#os a "o#entar #"ho so!re ellos dado /e son "ontroles de so!ra "ono"idos portodos+ ni va#os a en#erar todas ss propiedades por/e e-isten de"enas( A #odo dere'eren"ia+ a #edida /e los vaya#os "o#entando ir$ poniendo enla"es a s p,%ina de la

    do"#enta"i.n o'i"ial de Android para poder "onsltar todas ss propiedades en "aso dene"esidad(

    Control /utton :AP;

    Un "ontrol de tipo ;utton es el !ot.n #,s !,si"o /e pode#os tili*ar( En el e7e#plosi%iente de'ini#os n !ot.n "on el te-to ;P3lsa#e@ asi%nando s propiedadandroid5text( Ade#,s de esta propiedad podr&a#os tili*ar #"has otras "o#o el "olorde 'ondo 6android5bac6ground9+ estilo de 'ente 6android5type,ace9+ "olor de'ente 6android5textcolor9+ ta#aFo de 'ente 6android5textGiPe9+ et"(

    1

    23

    Kttonandroid5id+78id/;tn;oton1 android5text+NQlsame android5layoutwidth+wrapcontent android5layoutheight+wrapcontent/4

    Control Toggle/utton :AP;

    Un "ontrol de tipo 9oggle;utton es n tipo de !ot.n /e pede per#ane"er en dosestados+ plsado=noplsado( En este "aso+ en ve* de de'inir n s.lo te-to para el "ontrolde'inire#os dos+ dependiendo de s estado( As&+ podre#os asi%nar las propiedadesandroid5textDnyandroid5textoD,,para de'inir a#!os te-tos( 1ea#os ne7e#plo a "ontina"i.n(

    123!

    To%%leKttonandroid5id+78id/;tn;oton2 android5textDn+D: android5textD,,+DII android5layoutwidth+wrapcontent android5layoutheight+wrapcontent/4

    Control +age/utton :AP;

    En n "ontrol de tipo Fmage;utton podre#os de'inir na i#a%en a #ostrar en ve* de nte-to+ para lo /e de!ere#os asi%nar la propiedad android5src( Nor#al#enteasi%nare#os esta propiedad "on el des"riptor de al%3n re"rso /e haya#os in"lido en la

    "arpeta =res=dra>a!le( As&+ por e7e#plo+ en nestro "aso he#os in"lido na i#a%en lla#ada;o(pn%@ por lo /e hare#os re'eren"ia al re"rso ;7drawable/o6;.

    http://developer.android.com/reference/android/widget/Button.htmlhttp://developer.android.com/reference/android/widget/ToggleButton.htmlhttp://developer.android.com/reference/android/widget/ImageButton.htmlhttp://www.sgoliver.net/blog/wp-content/uploads/2010/08/botones11.pnghttp://developer.android.com/reference/android/widget/Button.htmlhttp://developer.android.com/reference/android/widget/ToggleButton.htmlhttp://developer.android.com/reference/android/widget/ImageButton.html
  • 8/12/2019 Android_Programacin

    22/188

    123

    I#a%eKttonandroid5id+78id/;tn;oton3 android5layoutwidth+wrapcontent android5layoutheight+wrapcontent android5src+7drawable/o6/4

    E,entos de un 6otn

    Co#o pod$is i#a%inar+ an/e estos "ontroles peden lan*ar #"hos otros eventos+ el #,s"o#3n de todos ellos y el /e /erre#os "aptrar en la #ayor&a de las o"asiones es elevento onClic6( Para de'inir la l.%i"a de este evento tendre#os /e i#ple#entarlade'iniendo n nevo o!7eto =iew.DnClic6

  • 8/12/2019 Android_Programacin

    23/188

    La sol"i.n per'e"ta pasar&a por tanto por de'inir di'erentes i#,%enes de 'ondo dependiendodel estado del !ot.n( Pes !ien+ Android nos da total li!ertad para ha"er esto #ediante elso de sele"tores( Un sele"tor se de'ine #ediante n 'i"hero HML lo"ali*ado en la "arpeta/res/drawableJy en $l se peden esta!le"er los di'erentes valores de na propiedaddeter#inada de n "ontrol dependiendo de s estado(

    Por e7e#plo+ si /isi$ra#os dar n aspe"to plano a n !ot.n 9oggle;utton+ podr&a#osdiseFar las i#,%enes ne"esarias para los estados ;plsado@ 6en el e7e#plo to%%leon(pn%9 y;no plsado@ 6en el e7e#plo to%%leo''(pn%9 y "rear n sele"tor "o#o el si%iente:

    123!"#

    $%1&

    -#lversion+1.&encoding+09I-$4sele"tor xmlns5android+http5//schemas.android.com/ap6/res/android4

    ite#android5statechec6ed+,alse android5drawable+7drawable/toggleo,,/4

    ite#android5statechec6ed+true android5drawable+7drawable/toggleon/4

    /sele"tor4Este sele"tor lo %arda#os por e7e#plo en n 'i"hero lla#ado to%%lestyle(-#l y lo"olo"a#os "o#o n re"rso #,s en nestra "arpeta de re"rsos /res/drawable(

  • 8/12/2019 Android_Programacin

    24/188

    Desp$s de ha!er ha!lado en el art&"lo anteriorde los "ontroles de tipo !ot.n+ en estaneva entre%a nos va#os a "entrar en otros tres "o#ponentes !,si"os i#pres"indi!les ennestras apli"a"iones: las i#,%enes 6Fmage=iew9+ las eti/etas 69ext=iew9 y por 3lti#olos "adros de te-to 6>dit9ext9(

    Control +age!ie :AP;

    El "ontrol I#a%e1ie> per#ite #ostrar i#,%enes en la apli"a"i.n( La propiedad #,sinteresante es android5src+ /e per#ite indi"ar la i#a%en a #ostrar( Neva#ente+ lonor#al ser, indi"ar "o#o ori%en de la i#a%en el identi'i"ador de n re"rso de nestra"arpeta /res/drawable+ por e7e#plo android5src+7drawable/unaimagen(Ade#,s de esta propiedad+ e-isten al%nas otras 3tiles en al%nas o"asiones "o#o lasdestinadas a esta!le"er el ta#aFo #,-i#o /e pede o"par la i#a%en+android5maxOidthy android5maxeight(

    12

    3

    I#a%e1ie>android5id+78id/FmgIoto android5layoutwidth+wrapcontent

    android5layoutheight+wrapcontent android5src+7drawable/icon/4

    En la l.%i"a de la apli"a"i.n+ podr&a#os esta!le"er la i#a%en #ediante el #$todosetFmageResorceETH+ pas,ndole el ID del re"rso a tili*ar "o#o "ontenido de lai#a%en(

    12Fmage=iew img+ EFmage=iewH,ind=iew;yFdER.id.FmgIotoH(img.setFmageResourceER.drawable.iconH(

    Control Te*t!ie :AP;

    El "ontrol 9ext=iew es otro de los "l,si"os en la pro%ra#a"i.n de GUIs+ las eti/etas de

    te-to+ y se tili*a para #ostrar n deter#inado te-to al sario( Al i%al /e en el "aso delos !otones+ el te-to del "ontrol se esta!le"e #ediante la propiedad android5text( Aparte de esta propiedad+ la natrale*a del "ontrol ha"e /e las #,s interesantes sean las /eesta!le"en el 'or#ato del te-to #ostrado+ /e al i%al /e en el "aso de los !otones son lassi%ientes: android5bac6ground6"olor de 'ondo9+ android5textColor6"olor delte-to9+ android5textGiPe6ta#aFo de la 'ente9 yandroid5type,ace6estilo delte-to: ne%rita+ "rsiva+ ?9(

    123

    !"

    Te-t1ie>android5id+78id/tiueta android5layoutwidth+,illparent android5layoutheight+wrapcontent android5text+>scribe algo5 android5bac6ground+UAAII android5type,ace+monospace/4

    De i%al 'or#a+ ta#!i$n pode#os #aniplar estas propiedades desde nestro ".di%o( Co#oe7e#plo+ en el si%iente 'ra%#ento re"pera#os el te-to de na eti/eta "on get9extEH+y posterior#ente le "on"atena#os nos n3#eros+ a"tali*a#os s "ontenido #edianteset9extEHy le "a#!ia#os s "olor de 'ondo "on set;ac6groundColorEH(

    12

    3

    'inal9ext=iew lbl>tiueta +E9ext=iewH,ind=iew;yFdER.id.tiuetaH(

    Gtring texto + lbl>tiueta.get9extEH.toGtringEH(texto 8+ 123(lbl>tiueta.set9extEtextoH(

    http://www.sgoliver.net/blog/?p=1363http://developer.android.com/reference/android/widget/ImageView.htmlhttp://developer.android.com/reference/android/widget/TextView.htmlhttp://www.sgoliver.net/blog/?p=1363http://developer.android.com/reference/android/widget/ImageView.htmlhttp://developer.android.com/reference/android/widget/TextView.html
  • 8/12/2019 Android_Programacin

    25/188

    Control EditTe*t :AP;

    El "ontrol >dit9ext es el "o#ponente de edi"i.n de te-to /e propor"iona la plata'or#aAndroid( Per#ite la introd""i.n y edi"i.n de te-to por parte del sario+ por lo /e entie#po de diseFo la propiedad #,s interesante a esta!le"er+ ade#,s de s posi"i.n=ta#aFo y'or#ato+ es el te-to a #ostrar+ atri!to android5text(

    123

    EditTe-tandroid5id+78id/9xt9exto android5layoutwidth+,illparent android5layoutheight+wrapcontent android5layoutbelow+7id/tiueta/4

    De i%al 'or#a+ desde nestro ".di%o podre#os re"perar y esta!le"er este te-to #ediantelos #$todos get9extEHy set9extEnevoTe-toH respe"tiva#ente:

    123

    'inal>dit9ext txt9exto +E>dit9extH,ind=iew;yFdER.id.9xt9extoH(Gtring texto + txt9exto.get9extEH.toGtringEH(

    txt9exto.set9extEola mundoSH(Un detalle /e pede ha!er pasado desaper"i!ido( Os ha!$is 'i7ado en /e he#os tenido/e ha"er n toGtringEHso!re el resltado de get9extEH La e-pli"a"i.n para esto es/e el #$todo get9extEHno develve n Gtringsino n o!7eto de tipo >ditable+/e a s ve* i#ple#enta la inter'a* Gpannable( ) esto nos lleva a la "ara"ter&sti"a #,sinteresante del "ontrol >dit9ext+ y es /e no s.lo nos per#ite editar te-to plano sinota#!i$n te-to enri/e"ido o "on 'or#ato( 1ea#os ".#o y /$ op"iones tene#os+ y parae#pe*ar "o#ente#os al%nas "osas so!re los o!7etos Gpannable(

    nterfa Spanned

    Un o!7eto de tipo Gpanned es al%o as& "o#o na "adena de "ara"teres 6deriva de lainter'a* CharGeuence9 en la /e pode#os insertar otros o!7etos a #odo de #ar"as oeti/etas 6spans9 aso"iados a ran%os de "ara"teres( De esta inter'a* deriva la inter'a*Gpannable+ /e per#ite la #odi'i"a"i.n de estas #ar"as+ y a s ve* de $sta 3lti#a derivala inter'a* >ditable+ /e per#ite ade#,s la #odi'i"a"i.n del te-to(

    An/e en el apartado en el /e nos en"ontra#os nos interesare#os prin"ipal#ente por las#ar"as de 'or#ato de te-to+ en prin"ipio podr&a#os insertar "al/ier tipo de o!7eto(

    E-isten #"hos tipos de spans prede'inidos en la plata'or#a /e pode#os tili*ar para dar'or#ato al te-to+ entre ellos:

    9ype,aceGpan( Modi'i"a el tipo de 'ente(GtyleGpan( Modi'i"a el estilo del te-to 6ne%rita+ "rsiva+ ?9(IoregroudColorGpan( Modi'i"a el "olor del te-to(AbsoluteGiPeGpan( Modi'i"a el ta#aFo de 'ente(

    De esta 'or#a+ para "rear n nevo o!7eto Edita!le e insertar na #ar"a de 'or#atopodr&a#os ha"er lo si%iente:

    http://developer.android.com/reference/android/widget/EditText.htmlhttp://developer.android.com/reference/android/widget/EditText.html
  • 8/12/2019 Android_Programacin

    26/188

    123!

    //Creamos un nuevo objeto de tipo >ditable>ditable str +>ditable.Iactory.getFnstanceEH.new>ditableE>sto es unsimulacro.H(//?arcamos cono ,uente negrita la palabra simulacro

    str.setGpanEne>GtyleGpanEandroid.graphics.9ype,ace.;DVC>VCH(

    En este e7e#plo esta#os insertando n span de tipo GtyleGpan para #ar"ar n'ra%#ento de te-to "on estilo ne%rita( Para insertarlo tili*a#os el #$todo setGpanEH+/e re"i!e "o#o par,#etro el o!7eto Gpan a insertar+ la posi"i.n ini"ial y 'inal del te-to a#ar"ar+ y n 'la% /e indi"a la 'or#a en la /e el span se podr, e-tender al insertarse nevote-to(

    Te*to con for+ato en controles Te*t!ie - EditTe*t

    ditable y /e so!re $ste pod&a#os ha"er n

    http://www.sgoliver.net/blog/wp-content/uploads/2010/08/simulacro.png
  • 8/12/2019 Android_Programacin

    27/188

    toGtringEH( Pero "on esta sol"i.n esta#os perdiendo todo el 'or#ato del te-to+ por lo/e no podr&a#os por e7e#plo salvarlo a na !ase de datos(

    La sol"i.n a esto 3lti#o pasa o!via#ente por re"perar dire"ta#ente el o!7eto >ditabley seriali*arlo de al%3n #odo+ #e7or a3n si es en n 'or#ato estandar( Pes !ien+ en Androideste tra!a7o ya nos viene he"ho de ',!ri"a a trav$s de la "lase tmlAPIJ+ /e dispone de

    #$todos para "onvertir "al/ier o!7eto Gpanned en s representa"i.n dit9ext9 o na eti/eta 69ext=iew9 a partir de n 'ra%#ento de te-to en 'or#ato

  • 8/12/2019 Android_Programacin

    28/188

    123

    Che"Ko-android5id+78id/Ch6?arcame android5layoutwidth+wrapcontent android5layoutheight+wrapcontent android5text+?WrcameS/4

    En "anto a la personali*a"i.n del "ontrol pode#os de"ir /e $ste e-tiende indire"ta#enteJdel "ontrol Te-t1ie>+ por lo /e todas las op"iones de 'or#ato ya "o#entadas en art&"losanteriores son v,lidas ta#!i$n para este "ontrol(

    En el ".di%o de la apli"a"i.n podre#os ha"er so de los #$todos isChec6edEHpara"ono"er el estado del "ontrol+ y setChec6edEestadoHpara esta!le"er n estado "on"reto

    para el "ontrol(

    123

    i'Echec6;ox.isChec6edEHH ) chec6;ox.setChec6edE'alseH(*

    En "anto a los posi!les eventos /e pede lan*ar este "ontrol+ el #,s interesante es sindda el /e in'or#a de /e ha "a#!iado el estado del "ontrol+ /e re"i!e el no#!re deonChec6edChanged( Para i#ple#entar las a""iones de este evento podr&a#os tili*ar

    por tanto la si%iente l.%i"a:

    123!"#

    $%1&1112131

    'inalChec6;ox cb +EChec6;oxH,ind=iew;yFdER.id.ch6?arcameH(cb.setDnChec6edChangeChec6;ox.DnChec6edChange

  • 8/12/2019 Android_Programacin

    29/188

    123!"

    #$%1&11121311!1"

    RadioGropandroid5id+78id/gruporb android5orientation+vertical android5layoutwidth+,illparent android5layoutheight+,illparent4

    RadioKttonandroid5id+78id/radio1 android5layoutwidth+wrapcontent android5layoutheight+wrapcontent android5text+Dpcin 1/4

    RadioKttonandroid5id+78id/radio2 android5layoutwidth+wrapcontent android5layoutheight+wrapcontent android5text+Dpcin 2/4

    /RadioGrop

    4En pri#er l%ar ve#os ".#o pode#os de'inir el %rpo de "ontroles indi"ando sorienta"i.n 6verti"al hori*ontal9 al i%al /e o"rr&a por e7e#plo "on n LinearLayot(Tras esto+ se aFaden todos los o!7etos RadioKtton ne"esarios indi"ando s ID #ediante la

    propiedad android5idy s te-to #ediante android5text(

    Una ve* de'inida la inter'a* podre#os #aniplar el "ontrol desde nestro ".di%o 7avaha"iendo so de los di'erentes #$todos del "ontrol RadioKroup+ los #,s i#portantes:chec6EidHpara #ar"ar na op"i.n deter#inada #ediante s ID+ clearChec6EHparades#ar"ar todas las op"iones+ y getChec6edRadio;uttonFdEH/e "o#o s no#!reindi"a devolver, el ID de la op"i.n #ar"ada 6o el valor si no hay nin%na #ar"ada9(

    1ea#os n e7e#plo:123

    'inalRadioKroup rg +ERadioKroupH,ind=iew;yFdER.id.gruporbH(rg.clearChec6EH(rg.chec6ER.id.radio1H(

    intidGeleccionado + rg.getChec6edRadio;uttonFdEH(En "anto a los eventos lan*ados+ al i%al /e en el "aso de los "he"!o-es+ el #,si#portante ser, el /e in'or#a de los "a#!ios en el ele#ento sele""ionado+ lla#adota#!i$n en este "aso onChec6edChange( 1e#os ".#o tratar este evento del o!7eto

    RadioKroup:123!"#$

    'inalRadioKroup rg +ERadioKroupH,ind=iew;yFdER.id.gruporbH(rg.setDnChec6edChangeRadioKroup.DnChec6edChange

  • 8/12/2019 Android_Programacin

    30/188

    1ea#os 'inal#ente na i#a%en del aspe"to de estos dos nevos tipos de "ontroles !,si"os/e he#os "o#entado en este art&"lo:

    Pod$is des"ar%ar el ".di%o de este art&"lo desde este enla"e(

    nterfa de usuario en Android Controles de seleccin89

    Una ve* repasados los "ontroles !,si"os 6I+ II+III9 /e pode#os tili*ar en nestrasapli"a"iones Android+ va#os a dedi"ar los pr.-i#os art&"los a des"ri!ir los di'erentes"ontroles de sele""i.n disponi!les en la plata'or#a( Al i%al /e en otros 'ra#e>orsAndroid dispone de diversos "ontroles /e nos per#iten sele""ionar na op"i.n dentro dena lista de posi!ilidades( As&+ podre#os tili*ar listas desple%a!les 6Gpinner9+ listas 'i7as6

  • 8/12/2019 Android_Programacin

    31/188

    Ade#,s de proveer de datos a los "ontroles visales+ el adaptador ta#!i$n ser, responsa!lede %enerar a partir de estos datos las vistas espe"&'i"as /e se #ostrar,n dentro del "ontrolde sele""i.n( Por e7e#plo+ si "ada ele#ento de na lista estviera 'or#ado a s ve* por nai#a%en y varias eti/etas+ el responsa!le de %enerar y esta!le"er el "ontenido de todos estos;s!ele#entos@ a partir de los datos ser, el propio adaptador(

    Android propor"iona de serie varios tipos de adaptadores sen"illos+ an/e pode#ose-tender s 'n"ionalidad 'a"il#ente para adaptarlos a nestras ne"esidades( Los #,s"o#nes son los si%ientes:

    ArrayAdapter( Es el #,s sen"illo de todos los adaptadores+ y provee de datos a n"ontrol de sele""i.n a partir de n array de o!7etos de "al/ier tipo(

    GimpleAdapter( 2e tili*a para #apear datos so!re los di'erentes "ontrolesde'inidos en n 'i"hero HML de layot(

    GimpleCursorAdapter( 2e tili*a para #apear las "ol#nas de n "rsor so!relos di'erentes ele#entos visales "ontenidos en el "ontrol de sele""i.n(

    Para no "o#pli"ar e-"esiva#ente los ttoriales+ por ahora nos va#os a "on'or#ar "ondes"ri!ir la 'or#a de tili*ar n ArrayAdapter "on los di'erentes "ontroles de sele""i.ndisponi!les( M,s adelante aprendere#os a tili*ar el resto de adaptadores en "onte-tos #,sespe"&'i"os(

    1ea#os ".#o "rear n adaptador de tipo ArrayAdapter para tra!a7ar "on n array %en$ri"ode 7ava:

    123

    !"

    'inalGtringXY datos + ne>GtringXY)>lem1J>lem2J>lem3J>lemJ>lem!*(

    ArrayAdapterGtring4 adaptador + ne>ArrayAdapterGtring4EthisJ android.R.layout.simplespinneritemJ datosH(

    Co#ente#os n po"o el ".di%o( 2o!re la pri#era l&nea no hay nada /e de"ir+ es tan s.lo lade'ini"i.n del array 7ava /e "ontendr, los datos a #ostrar en el "ontrol+ en este "aso narray sen"illo "on "in"o "adenas de "ara"teres( En la se%nda l&nea "rea#os el adaptador ens&+ al /e pasa#os 4 par,#etros:

    ( El "onte-to+ /e nor#al#ente ser, si#ple#ente na re'eren"ia a la a"tividad donde se"rea el adaptador(

    2. El ID del layot so!re el /e se #ostrar,n los datos del "ontrol( En este "aso lepasa#os el ID de n layot prede'inido en Android6android.R.layout.simplespinneritem9+ 'or#ado 3ni"a#ente por n"ontrol 9ext=iew+ pero podr&a#os pasarle el ID de "al/ier layot de nestro

    proye"to "on "al/ier estr"tra y "on7nto de "ontroles+ #,s adelante vere#os".#o(

    4( El array /e "ontiene los datos a #ostrar(Con esto ya tendr&a#os "reado nestro adaptador para los datos a #ostrar y ya tan s.lo nos/edar&a asi%nar este adaptador a nestro "ontrol de sele""i.n para /e $ste #ostrase losdatos en la apli"a"i.n(

    Control Spinner :AP;

    http://developer.android.com/reference/android/widget/Spinner.htmlhttp://developer.android.com/reference/android/widget/Spinner.html
  • 8/12/2019 Android_Programacin

    32/188

    Las listas desple%a!les en Android se lla#an Gpinner( Qn"ionan de 'or#a si#ilar al de"al/ier "ontrol de este tipo+ el sario sele""iona la lista+ se #estra na espe"ie de listae#er%ente al sario "on todas las op"iones disponi!les y al sele""ionarse na de ellas $sta/eda 'i7ada en el "ontrol( Para aFadir na lista de este tipo a nestra apli"a"i.n pode#ostili*ar el ".di%o si%iente:

    123

    2pinnerandroid5id+78id/CmbDpciones android5layoutwidth+,illparent android5layoutheight+wrapcontent/4

    Po"o va#os a "o#entar de a/& ya /e lo /e nos interesan real#ente son los datos a#ostrar( En "al/ier "aso+ las op"iones para personali*ar el aspe"to visal del "ontrol6'ondo+ "olor y ta#aFo de 'ente+ ?9 son las #is#as ya "o#entadas para los "ontroles

    !,si"os(

    Para enla*ar nestro adaptador 6y por tanto nestros datos9 a este "ontrol tili*are#os elsi%iente ".di%o 7ava:

    123!"

    'inalGpinner cmbDpciones +EGpinnerH,ind=iew;yFdER.id.CmbDpcionesH(adaptador.setMropMown=iewResourceE android.R.layout.simplespinnerdropdownitemH(cmbDpciones.setAdapterEadaptadorH(

    Co#en*a#os "o#o sie#pre por o!tener na re'eren"ia al "ontrol a trav$s de s ID( ) en la3lti#a l&nea asi%na#os el adaptador al "ontrol #ediante el #$todo setAdapterEH( ) lase%nda l&nea para /$ es Cando indi"a#os en el apartado anterior ".#o "onstrir n

    adaptador vi#os ".#o no de los par,#etros /e le pas,!a#os era el ID del layot /etili*ar&a#os para visali*ar los ele#entos del "ontrol( 2in e#!ar%o+ en el "aso del "ontrolGpinner+ este layot tan s.lo se apli"ar, al ele#ento sele""ionado en la lista+ es de"ir+ al/e se #estra dire"ta#ente so!re el propio "ontrol "ando no est, desple%ado( 2ine#!ar%o+ antes indi"a#os /e el 'n"iona#iento nor#al del "ontrol Gpinner in"lyeentre otras "osas #ostrar na lista e#er%ente "on todas las op"iones disponi!les( Pes !ien+

    para personali*ar ta#!i$n el aspe"to de "ada ele#ento en di"ha lista e#er%ente tene#os el#$todo setMropMown=iewResourceEIDlayotH+ al /e pode#os pasar otro ID delayot distinto al pri#ero so!re el /e se #ostrar,n los ele#entos de la lista e#er%ente( Eneste "aso he#os tili*ado otro layot prede'inido an Android para las listas desple%a!les

    6android.R.layout.simplespinnerdropdownitem9(Con estas si#ples lineas de ".di%o "onse%ire#os #ostrar n "ontrol "o#o el /e ve#os enlas si%ientes i#,%enes:

  • 8/12/2019 Android_Programacin

    33/188

    Co#o se pede o!servar en las i#,%enes+ la representa"i.n del ele#ento sele""ionado6pri#era i#a%en9 y el de las op"iones disponi!les 6se%nda i#a%en9 es distinto+ in"lyendoel se%ndo de ellos in"lso al%3n ele#ento %r,'i"o a la dere"ha para #ostrar el estado de"ada op"i.n( Co#o he#os "o#entado+ esto es de!ido a la tili*a"i.n de dos layotsdi'erentes para no y otros ele#entos(

    En "anto a los eventos lan*ados por el "ontrol Gpinner+ el #,s "o#n#ente tili*adoser, el %enerado al sele""ionarse na op"i.n de la lista desple%a!le+ onFtemGelected(

    http://www.sgoliver.net/blog/wp-content/uploads/2010/09/spinner2.pnghttp://www.sgoliver.net/blog/wp-content/uploads/2010/09/spinner1.png
  • 8/12/2019 Android_Programacin

    34/188

    Para "aptrar este evento se pro"eder, de 'or#a si#ilar a lo ya visto para otros "ontrolesanterior#ente+ asi%nadole s "ontrolador #ediante el #$todosetDnFtemGelected

  • 8/12/2019 Android_Programacin

    35/188

    posterior#ente el adaptador de tipo ArrayAdapter y lo asi%nare#os 'inal#ente al"ontrol #ediante el #$todo setAdapterEH:

    123

    !"#$%1&

    'inalGtringXY datos + ne>GtringXY)>lem1J>lem2J>lem3J>lemJ>lem!*(

    ArrayAdapterGtring4 adaptador +

    ne>ArrayAdapterGtring4EthisJ android.R.layout.simplelistitem1J datosH(

  • 8/12/2019 Android_Programacin

    36/188

    123!"

    lstDpciones.setDnFtemClic6DnFtemClic6

  • 8/12/2019 Android_Programacin

    37/188

    123!"

    #$%1&11121311!1"

    1#1$1%2&21

    -#lversion+1.&encoding+ut,-$4

    LinearLayot xmlns5android+http5//schemas.android.com/ap6/res/android android5layoutwidth+wrapcontent android5layoutheight+wrapcontent android5orientation+vertical4

    Te-t1ie>android5id+78id/

    android5id+78id/

  • 8/12/2019 Android_Programacin

    38/188

    123!"

    #$%1&11121311!1"

    1#1$1%2&2122

    "lassAdaptador9itulares e-tendsArrayAdapter )

    Activity context(

    Adaptador9itularesEActivity contextH )

    sperEcontextJ R.layout.listitemtitularJdatosH(

    this.context + context( *

    p!li"=iew get=iewEintpositionJ =iew convert=iewJ=iewKroup parentH )

  • 8/12/2019 Android_Programacin

    39/188

    Una ve* tene#os de'inido el "o#porta#iento de nestro adaptador la 'or#a de pro"eder enla a"tividad prin"ipal ser, an,lo%a a lo ya "o#entado+ de'inire#os el array de datos de

    pre!a+ "reare#os el adaptador y lo asi%nare#os al "ontrol #ediante setAdapterEH:

    12

    3!"#$%1&1112

    1311!1"1#

    private9itularXY datos + ne>9itularXY)

    ne>9itularE9Ztulo 1J GubtZtulo largo 1HJ ne>9itularE9Ztulo 2J GubtZtulo largo 2HJ ne>9itularE9Ztulo 3J GubtZtulo largo 3HJ ne>9itularE9Ztulo J GubtZtulo largo HJ ne>9itularE9Ztulo !J GubtZtulo largo !H*(//...//...Adaptador9itulares adaptador +

    ne>Adaptador9itularesEthisH(

  • 8/12/2019 Android_Programacin

    40/188

    de este tipo+ al%o /e los sarios de nestra apli"a"i.n a%rade"er,n enor#e#ente al#e7orarse la respesta de la apli"a"i.n y red"irse el "ons#o de !ater&a(

    nterfa de usuario en Android Controles de seleccin

    89En el art&"lo anteriorya vi#os ".#o tili*ar los "ontroles de tipo List1ie> en Android( 2ine#!ar%o+ a"a!a#os "o#entando /e e-ist&a na 'or#a #,s e'i"iente de ha"er so de di"ho"ontrol+ de 'or#a /e la respesta de nestra apli"a"i.n 'era #,s a%il y se red"iese el"ons#o de !ater&a+ al%o /e en plata'or#as #.viles sie#pre es i#portante(

    Co#o !ase para este art&"lo va#os a tili*ar "o#o ".di%o /e ya es"ri!i#os en el art&"loanterior+ por lo /e si has lle%ado hasta a/& dire"ta#ente te re"o#iendo /e leas pri#ero el

    pri#er post dedi"ado al "ontrol List1ie>(

    Cando "o#enta#os ".#o "rear nestro propio adaptador+ e-tendiendo deArrayAdapter+ para personali*ar la 'or#a en /e nestros datos se i!an a #ostrar en lalista es"ri!i#os el si%iente ".di%o:

    123!"

    #$%1&11121311!1"1#1$1%2&21

    "lassAdaptador9itulares e-tendsArrayAdapter ) Activity context(

    Adaptador9itularesEActivity contextH )

    sperEcontextJ R.layout.listitemtitularJ datosH( this.context + context(

    *

    p!li"=iew get=iewEintpositionJ =iew convert=iewJ=iewKroup parentH )

  • 8/12/2019 Android_Programacin

    41/188

    todos los o!7etos "orrespondientes 6"on la estr"tra des"rita en el HML9 y posterior#entea""eder a di"hos o!7etos para #odi'i"ar ss propiedades( 2in e#!ar%o+ hay /e tener en"enta /e esto se ha"e todas y "ada na de las ve"es /e se ne"esita #ostrar n ele#entode la lista en pantalla+ se haya #ostrado ya o no "on anterioridad+ ya /e Android no;%arda@ los ele#entos de la lista /e desapare"en de pantalla 6por e7e#plo al ha"er s"rollso!re la lista9( El e'e"to de esto es o!vio+ dependiendo del ta#aFo de la lista y so!re todo dela "o#ple7idad del layot /e haya#os de'inido esto pede sponer la "rea"i.n ydestr""i.n de "antidades in%entes de o!7etos 6/e pede /e ni si/iera nos seanne"esarios9+ es de"ir+ /e la a""i.n de in'lar n layot HML pede ser !astante "ostosa+ lo/e podr&a a#entar #"ho+ y sin ne"esidad+ el so de CPU+ de #e#oria+ y de !ater&a(

    Para aliviar este pro!le#a+ Android nos propone n #$todo /e per#ite retili*ar al%3nlayot /e ya haya#os in'lado "on anterioridad y /e ya no nos ha%a 'alta por al%3n#otivo+ por e7e#plo por/e el ele#ento "orrespondiente de la lista ha desapare"ido de la

    pantalla al ha"er s"roll( De esta 'or#a evita#os todo el tra!a7o de "rear y estr"trar todoslos o!7etos aso"iados al layot+ por lo /e tan s.lo nos /edar&a o!tener la re'eren"ia a ellos

    #ediante ,ind=iew;yFdEHy #odi'i"ar ss propiedades(Pero ".#o pode#os retili*ar estos layots ;o!soletos@ Pes es !ien sen"illo+ sie#pre/e e-ista al%3n layot /e peda ser retili*ado $ste se va a re"i!ir a trav$s del par,#etroconvert=iew del #$todo get=iewEH( De esta 'or#a+ en los "asos en /e $ste no seanll podre#os o!viar el tra!a7o de in'lar el layot( 1ea#os ".#o /edar&a el #$todget=iewEHtras esta opti#i*a"i.n:

    123

    !"#$%1&111213

    11!1"1#1$

    p!li"=iew get=iewEintpositionJ =iew convert=iewJ=iewKroup parentH)

    =iew item + convert=iew(

    i'Eitem ++ nllH )

  • 8/12/2019 Android_Programacin

    42/188

    2i aFadi#os #,s ele#entos a la lista y e7e"ta#os ahora la apli"a"i.n pode#os "o#pro!ar/e al ha"er s"roll so!re la lista todo si%e 'n"ionando "on nor#alidad+ "on la di'eren"iade /e le esta#os ahorrando %ran "antidad de tra!a7o a la CPU(

    Pero va#os a ir n po"o #,s all,( Con la opti#i*a"i.n /e a"a!a#os de i#ple#entar"onse%i#os ahorrarnos el tra!a7o de in'lar el layot de'inido "ada ve* /e se #estra n

    nevo ele#ento( Pero a3n hay otras dos lla#adas relativa#ente "ostosas /e se si%ene7e"tando en todas las lla#adas( Me re'iero a la o!ten"i.n de la re'eren"ia a "ada no delos o!7etos a #odi'i"ar #ediante el #$todo ,ind=iew;yFdEH( La !3s/eda por ID de n"ontrol deter#inado dentro del ,r!ol de o!7etos de n layot ta#!i$n pede ser na tarea"ostosa dependiendo de la "o#ple7idad del propio layot(Por /$ no aprove"ha#os /eesta#os ;%ardando@ n layot anterior para %ardar ta#!i$n la re'eren"ia a los "ontroles/e lo 'or#an de 'or#a /e no ten%a#os /e volver a !s"arlos Pes eso es e-a"ta#entelo /e va#os a ha"er #ediante lo /e en los e7e#plos de Android lla#an n =iewolder(La "lase =iewolder tan s.lo va a "ontener na re'eren"ia a "ada no de los "ontroles/e ten%a#os /e #aniplar de nestro layot+ en nestro "aso las dos eti/etas de te-to(De'ina#os por tanto esta "lase de la si%iente 'or#a:

    123

    stati""lass=iewolder ) 9ext=iew titulo( 9ext=iew subtitulo(*

    La idea ser, por tanto "rear e ini"iali*ar el o!7eto =iewolder la pri#era ve* /ein'le#os n ele#ento de la lista y aso"iarlo a di"ho ele#ento de 'or#a /e posterior#ente

    poda#os re"perarlo ',"il#ente( Pero d.nde lo %arda#os Q,"il+ en Android todos los"ontroles tienen na propiedad lla#ada 9ag 6pode#os asi%narla y re"perarla #ediante los

    #$todosset9agEHy get9agEHrespe"tiva#ente9 /e pede "ontener "al/ier tipo deo!7eto+ por lo /e reslta ideal para %ardar nestro o!7eto =iewolder( De esta 'or#a+"ando el par,#etro convert=iew lle%e in'or#ado sa!re#os /e ta#!i$n tendre#os

    http://www.sgoliver.net/blog/wp-content/uploads/2010/09/listview-opt1.png
  • 8/12/2019 Android_Programacin

    43/188

    disponi!les las re'eren"ias a ss "ontroles hi7os a trav$s de la propiedad 9ag( 1ea#os el".di%o #odi'i"ado de get=iewEHpara aprove"har esta neva opti#i*a"i.n:

    123

    !"#$%1&111213

    11!1"1#1$1%2&212223

    22!2"

    p!li"=iew get=iewEintpositionJ =iew convert=iewJ=iewKroup parentH)

    =iew item + convert=iew( =iewolder holder(

    i'Eitem ++ nllH )

  • 8/12/2019 Android_Programacin

    44/188

    ter#inar de "o#entar los "ontroles de sele""i.n "on otro #enos "o#3n pero no por ello#enos 3til+ el "ontrol Krid=iew(

    El "ontrol Krid=iewde Android presenta al sario n "on7nto de op"ionessele""iona!les distri!idas de 'or#a ta!lar+ o di"ho de otra 'or#a+ divididas en 'ilas y"ol#nas( Dada la natrale*a del "ontrol ya pod$is i#a%inar ss propiedades #,s

    i#portantes+ /e paso a en#erar a "ontina"i.n:android5numColumns+ indi"a el n3#ero de "ol#nas de la ta!la o ;auto,it@

    si /ere#os /e sea "al"lado por el propio siste#a operativo a partir de lassi%ientes propiedades(

    android5columnOidth+ indi"a el an"ho de las "ol#nas de la ta!la(android5horiPontalGpacing+ indi"a el espa"io hori*ontal entre "eldas(android5verticalGpacing+ indi"a el espa"io verti"al entre "eldas(android5stretch?ode+ indi"a /$ ha"er "on el espa"io hori*ontal so!rante( 2i se

    esta!le"e al valor ;columnOidth@ este espa"io ser, a!sor!ido a partes i%ales por

    las "ol#nas de la ta!la( 2i por el "ontrario se esta!le"e a ;spacingOidth@ ser,a!sor!ido a partes i%ales por los espa"ios entre "eldas(1ea#os ".#o de'inir&a#os n Krid=iew de e7e#plo en nestra apli"a"i.n:

    123!"#

    $

    Grid1ie>android5id+78id/KridDpciones android5layoutwidth+,illparent android5layoutheight+,illparent android5numColumns+auto,it android5columnOidth+$&px android5horiPontalGpacing+!px android5verticalGpacing+1&px

    android5stretch?ode+columnOidth/4Una ve* de'inida la inter'a* de sario+ la 'or#a de asi%nar los datos desde el ".di%o de laapli"a"i.n es "o#pleta#ente an,lo%a a la ya "o#entada tanto para las listas desple%a!les"o#o para las listas est,ti"as: "rea#os n array %en$ri"o /e "onten%a nestros datos de

    pre!a+ de"lara#os n adaptador de tipo ArrayAdapter pas,ndole en este "aso n layot%en$ri"o 6simplelistitem1+ "o#pesto por n si#ple 9ext=iew9 y aso"ia#os eladaptador al "ontrol Krid=iew #ediante s #$todo setAdapterEH:

    12

    3!"#$%1&11

    privateGtringXY datos + ne>GtringX2!Y(//...

    'orEinti+1( i+2!( i88H datosXi-1Y + Mato 8 i(ArrayAdapterGtring4 adaptador +

    ne>ArrayAdapterGtring4EthisJandroid.R.layout.simplelistitem1J datosH(

    'inalKrid=iew grdDpciones +EKrid=iewH,ind=iew;yFdER.id.KridDpcionesH(

    grdDpciones.setAdapterEadaptadorH(

  • 8/12/2019 Android_Programacin

    45/188

    Por de'e"to+ los datos del array se aFadir,n al "ontrol Krid=iew ordenados por 'ilas+ ypor spesto+ si no "a!en todos en la pantalla se podr, ha"er s"roll so!re la ta!la( 1e#os enna i#a%en ".#o /eda nestra apli"a"i.n de pre!a:

    En "anto a los eventos disponi!les+ el #,s interesante velve a ser el lan*ado alsele""ionarse na "elda deter#inada de la ta!la: onFtemGelected( Este evento pode#os"aptrarlo de la #is#a 'or#a /e ha"&a#os "on los "ontroles Gpinner y

  • 8/12/2019 Android_Programacin

    46/188

    ) "on esto 'inali*a#os todo lo /e ten&a previsto "ontar so!re los distintos "ontrolesdisponi!les ;de serie@ en Android para "onstrir nestras inter'a"es de sario( E-isten#"hos #,s+ y es posi!le /e los "o#ente#os #,s adelante en al%3n otro art&"lo+ pero porel #o#ento nos va#os a "on'or#ar "on los ya vistos( En el pr.-i#o art&"lo+ y parater#inar "on la serie dedi"ada a los "ontroles Android+ vere#os las distintas 'or#as de "rear"ontroles de sario personali*ados(

    Pod$is des"ar%ar el ".di%o 'ente de este art&"lo desde este enla"e(

    nterfa de usuario en Android Controlespersonaliados 89

    En art&"los anteriores de la seriehe#os "ono"ido y aprendido a tili*ar #"hos de los"ontroles /e propor"iona Android en s 2D( Con la ayda de estos "ontroles pode#os

    diseFar inter'a"es %r,'i"as de lo #,s variopinto pero en o"asiones+ si /ere#os dar n to/eespe"ial y ori%inal a nestra apli"a"i.n+ o si#ple#ente si ne"esita#os "ierta 'n"ionalidadno presente en los "o#ponentes estandar de Android+ nos ve#os en la ne"esidad de "rearnestros propios "ontroles personali*ados+ diseFados a #edida de nestros re/isitos(

    Android ad#ite por spesto "rear "ontroles personali*ados+ y per#ite ha"erlo de di'erentes'or#as:

    ( E-tendiendo la 'n"ionalidad de n "ontrol ya e-istente(B( Co#!inando varios "ontroles para 'or#ar n otro #,s "o#ple7o(4( DiseFando desde "ero n nevo "ontrol(

    En este pri#er art&"lo so!re el te#a va#os a ha!lar de la pri#era op"i.n+ es de"ir+ va#os aver ".#o pode#os "rear n nevo "ontrol partiendo de la !ase de n "ontrol ya e-istente( A#odo de e7e#plo+ va#os a e-tender el "ontrol >dit9ext 6"adro de te-to9 para /e#estre en todo #o#ento el n3#ero de "ara"teres /e "ontiene a #edida /e se es"ri!e en$l( Intentar&a#os e#lar al%o as& "o#o el editor de #ensa7es 2M2 del propio siste#aoperativo+ /e nos avisa del n3#ero de "arateres /e "ontiene el #ensa7e( En nestro "aso+"o#o resltado o!tendre#os n "ontrol "o#o el /e se #estra en la si%iente i#a%en:

    http://www.sgoliver.net/blog/wp-content/uploads/2010/09/android-gridview.ziphttp://www.sgoliver.net/blog/?p=1457http://www.sgoliver.net/blog/?p=1457http://www.sgoliver.net/blog/?p=1313http://www.sgoliver.net/blog/wp-content/uploads/2010/09/android-gridview.ziphttp://www.sgoliver.net/blog/?p=1457http://www.sgoliver.net/blog/?p=1457http://www.sgoliver.net/blog/?p=1313
  • 8/12/2019 Android_Programacin

    47/188

    Co#o ve#os+ en la es/ina sperior dere"ha del "adro de te-to va#os a #ostrar el n3#erode "ara"teres del #ensa7e de te-to introd"ido+ /e ira a"tali*,ndose a #edida /e#odi'i"a#os el te-to(

    Para e#pe*ar+ va#os a "rear na neva "lase 7ava /e e-tienda del "ontrol /e /ere#ostili*ar "o#o !ase+ en este "aso >dit9ext(

    123

    p!li""lass>xtended>dit9ext e-tends>dit9ext) //...*

    Tras esto+ so!rees"ri!ire#os sie#pre los tres "onstr"tores heredados+ donde por el#o#ento nos li#itare#os a lla#ar al #is#o "onstr"tor de la "lase padre(

    123

    !"#$%1&11

    p!li">xtended>dit9extEContext contextJ AttributeGetattrsJ intde,GtyleH) sperEcontextJ attrsJde,GtyleH(*

    p!li">xtended>dit9extEContext contextJ AttributeGetattrsH )

    sperEcontextJ attrsH(*

    p!li">xtended>dit9extEContext contextH ) sperEcontextH(

    *Por 3lti#o el paso #,s i#portante( Dado /e /ere#os #odi'i"ar el aspe"to del "ontrolpara aFadir el "ontador de "ara"teres tendre#os /e so!rees"ri!ir el evento onMrawEH+ /e

    http://www.sgoliver.net/blog/wp-content/uploads/2010/09/ExtendedEditText.png
  • 8/12/2019 Android_Programacin

    48/188

  • 8/12/2019 Android_Programacin

    49/188

    de la ventana tal "o#o har&a#os "on "al/ier otro "ontrol+ teniendo en "enta /ede!ere#os ha"er re'eren"ia a $l "on el no#!re "o#pleto de la neva "lase "reada 6in"lidoel pa/ete 7ava9+ /e en #i "aso parti"lar ser&a net.sgoliver.>xtended>dit9ext(

    12

    3

    net(s%oliver(E-tendedEditTe-t android5id+78id/9xtNrueba

    android5layoutwidth+,illparent android5layoutheight+wrapcontent/4

    En el si%iente art&"lo vere#os ".#o "rear n "ontrol personali*ado tili*ando la se%ndade las op"iones e-pestas+ es de"ir+ "o#!inando varios "ontroles ya e-istentes(Co#entare#os ade#,s "o#o aFadir eventos y propiedades personali*adas a nestro "ontroly ".#o ha"er re'eren"ia a di"has propiedades desde s de'ini"i.n HML(

    Pod$is des"ar%ar el ".di%o de este art&"lo desde este enla"e(

    nterfa de usuario en Android Controlespersonaliados 89

    )a vi#os ".#o Android o're"e tres 'or#as di'erentes de "rear "ontroles personali*ados paranestras apli"a"iones y dedi"a#os el art&"lo anteriora "o#entar la pri#era de las

    posi!ilidades+ /e "onsist&a en e-tender la 'n"ionalidad de n "ontrol ya e-istente(

    En este se%ndo art&"lo so!re el te#a va#os a "entrarnos en la "rea"i.n de controlesco+puestos+ es de"ir+ "ontroles personali*ados "onstridos a partir de varios "ontrolesestandar+ "o#!inando la 'n"ionalidad de todos ellos en n s.lo "ontrol retili*a!le en otras

    apli"a"iones(Co#o e7e#plo ilstrativo va#os a "rear n "ontrol de identi'i"a"i.n 6lo%in9 'or#ado porvarios "ontroles estandar de Android( La idea es "onse%ir n "ontrol "o#o el /e se#estra la si%iente i#a%en es/e#,ti"a:

    A e'e"tos did,"ti"os+ y para no "o#pli"ar #,s el e7e#plo+ va#os a aFadir ta#!i$n a ladere"ha del !ot.n Lo%in na eti/eta donde #ostrar el resltado de la identi'i"a"i.n delsario 6lo%in "orre"to o in"orre"to9(

    http://www.sgoliver.net/blog/wp-content/uploads/2010/09/android-ExtendedEditText.ziphttp://www.sgoliver.net/blog/?p=1467http://www.sgoliver.net/blog/?p=1467http://www.sgoliver.net/blog/?p=1457http://www.sgoliver.net/blog/wp-content/uploads/2010/09/esquema-login.pnghttp://www.sgoliver.net/blog/wp-content/uploads/2010/09/android-ExtendedEditText.ziphttp://www.sgoliver.net/blog/?p=1467http://www.sgoliver.net/blog/?p=1467http://www.sgoliver.net/blog/?p=1457
  • 8/12/2019 Android_Programacin

    50/188

    A este "ontrol aFadire#os ade#,s e,entos personaliados+ vere#os "o#o aFadirlo anestras apli"a"iones+ y hare#os /e se peda personali*ar s aspe"to desde el layot HMLde nestra inter'a* tili*ando ta#!i$n atri6utos =% personaliados(

    E#pe"e#os por el prin"ipio( Lo pri#ero /e va#os a ha"er es "onstrir la inter'a* denestro "ontrol a partir de "ontroles sen"illos: eti/etas+ "adros de te-to y !otones( Para

    ello va#os a "rear n nevo layot HML en la "arpeta ]res]layout"on el no#!re;"ontrollo%in(-#l;( En este 'i"hero va#os a de'inir la estr"tra del "ontrol "o#o yahe#os visto en #"hos art&"los anteriores+ sin nin%na parti"laridad desta"a!le( Para este"aso /edar&a "o#o si%e:

  • 8/12/2019 Android_Programacin

    51/188

    123!"

    #$%1&11121311!1"

    1#1$1%2&21222322!2"

    2#2$2%3&31323333!3"

    3#3$3%&123!"

    #$

    LinearLayot xmlns5android+http5//schemas.android.com/ap6/res/android android5layoutwidth+,illparent android5layoutheight+wrapcontent android5orientation+vertical android5padding+1&dip4

    Te-t1ie>android5id+78id/9ext=iew&1 android5layoutwidth+wrapcontent android5layoutheight+wrapcontent android5text+0suario5 android5textGtyle+bold/4

    EditTe-tandroid5id+78id/9xt0suario android5layoutheight+wrapcontent android5layoutwidth+,illparent/4

    Te-t1ie>android5id+78id/9ext=iew&2 android5layoutwidth+wrapcontent android5layoutheight+wrapcontent android5text+Contrase^a5 android5textGtyle+bold/4

    EditTe-tandroid5id+78id/9xtNassword

    android5layoutheight+wrapcontent android5layoutwidth+,illparent/4

    LinearLayotandroid5orientation+horiPontal android5layoutwidth+,illparent android5layoutheight+,illparent4

    Ktton android5layoutwidth+wrapcontent android5layoutheight+wrapcontent

    android5id+78id/;tnAceptar android5text+

  • 8/12/2019 Android_Programacin

    52/188

    1isal#ente+ nestro "ontrol ya /edar&a "o#o se o!serva en la si%iente i#a%en:

    A "ontina"i.n "reare#os s "lase 7ava aso"iada donde de'inire#os toda la 'n"ionalidad denestro "ontrol( Dado /e nos he#os !asado en n

  • 8/12/2019 Android_Programacin

    53/188

    123!"

    #$%1&11121311!1"

    1#

    privatevoidinicialiParEH) //0tiliPamos el layout _controllogin_ como inter,aPdel control Gtring in,Gervice + Context.R=FC>( dit9extH,ind=iew;yFdER.id.9xtNasswordH( btnventosEH+ volvere#os so!re $l #,starde(

    Con esto ya tene#os de'inida la inter'a* y la 'n"ionalidad !,si"a del nevo "ontrol por lo

    /e ya pode#os tili*arlo desde otra a"tividad "o#o si se tratase de "al/ier otro "ontrolprede'inido( Para ello hare#os re'eren"ia a $l tili*ando la rta "o#pleta del pa/ete 7avatili*ado+ en nestro "aso /edar&a "o#o net.sgoliver.Control

  • 8/12/2019 Android_Programacin

    54/188

    1a#os a aFadir ahora al%o #,s de 'n"ionalidad( En pri#er l%ar+ pode#os aFadir al%3n#$todo p3!li"o e-"lsivo de nestro "ontrol( Co#o e7e#plo pode#os aFadir n #$todo /e

    per#ita #odi'i"ar el te-to de la eti/eta de resltado del lo%in( Esto no tiene nin%nadi'i"ltad:

    1

    23

    p!li"voidset?ensajeEGtring msgH) lbl?ensaje.set9extEmsgH(*

    En se%ndo l%ar+ todo "ontrol /e se pre"ie de!e tener al%nos eventos /e nos per#itanresponder a las a""iones del sario de la apli"a"i.n( As& por e7e#plo+ los !otones tienen nevento DnClic6+ las listas n evento DnFtemGelected+ et"( Pes !ien+ nosotros va#osa dotar a nestro "ontrol de n evento personali*ado+ lla#ado Dn

  • 8/12/2019 Android_Programacin

    55/188

    123!"

    #$%1&11

    p!li""lassControl

  • 8/12/2019 Android_Programacin

    56/188

    123!"

    #$%1&11

    privatevoidasignar>ventosEH)

    btn

  • 8/12/2019 Android_Programacin

    57/188

    Nestro "ontrol est, ya "o#pleto+ en aspe"to y 'n"ionalidad(

  • 8/12/2019 Android_Programacin

    58/188

    nevo atri!to de'inido 6#ediante s ID+ /e estar, 'or#ado por la "on"atena"i.n delno#!re del "ontrol y el no#!re del atri!to+ en nestro "aso;Control

  • 8/12/2019 Android_Programacin

    59/188

    Co#o res#en+ en este art&"lo he#os visto ".#o "onstrir n "ontrol androidpersonali*ado a partir de otros "ontroles estandar+ "o#poniendo s inter'a*+ aFadiendo#$todos y eventos personali*ados+ e in"lso aFadiendo nevas op"iones en tie#po dediseFo aFadiendo atri!tos -#l e-"lsivos(

    Pod$is des"ar%ar el ".di%o 'ente de este art&"loplsando a/&(

    Espero /e os sea 3til y /e si%,is los art&"los /e /edan por venir(

    nterfa de usuario en Android Controlespersonaliados 89

    En art&"los anteriores del "rsoya "o#enta#os dos de las posi!les v&as /e tene#os para"rear "ontroles personali*ados en Android: la pri#era de ellas e-tendiendo la 'n"ionalidadde n "ontrol ya e-istente+ y "o#o se%nda op"i.n "reando n nevo "ontrol "o#pesto porotros #,s sen"illos(

    En este nevo art&"lo va#os a des"ri!ir la ter"era de las posi!ilidades /e ten&a#osdisponi!les+ /e "onsiste en "rear n "ontrol "o#pleta#ente desde "ero+ sin tili*ar "o#o

    !ase otros "ontroles e-istentes( Co#o e7e#plo+ va#os a "onstrir n "ontrol /e nosper#ita sele""ionar n "olor entre varios disponi!les(

    Los "olores disponi!les van a ser s.lo "atro+ /e se #ostrar,n en la 'ran7a sperior del"ontrol( En la parte in'erior se #ostrar, el "olor sele""ionado en "ada #o#ento+ o

    per#ane"er, ne%ro si a3n no se ha sele""ionado nin%3n "olor( 1al%a la si%iente i#a%en"o#o #estra del aspe"to /e tendr, nestro "ontrol de sele""i.n de "olor:

    http://www.sgoliver.net/blog/wp-content/uploads/2010/12/android-controllogin.ziphttp://www.sgoliver.net/blog/?p=1655http://www.sgoliver.net/blog/?p=1655http://www.sgoliver.net/blog/?p=1313http://www.sgoliver.net/blog/?p=1457http://www.sgoliver.net/blog/?p=1457http://www.sgoliver.net/blog/?p=1467http://www.sgoliver.net/blog/?p=1467http://www.sgoliver.net/blog/wp-content/uploads/2010/12/control-login-4.pnghttp://www.sgoliver.net/blog/wp-content/uploads/2010/12/android-controllogin.ziphttp://www.sgoliver.net/blog/?p=1655http://www.sgoliver.net/blog/?p=1655http://www.sgoliver.net/blog/?p=1313http://www.sgoliver.net/blog/?p=1457http://www.sgoliver.net/blog/?p=1457http://www.sgoliver.net/blog/?p=1467http://www.sgoliver.net/blog/?p=1467
  • 8/12/2019 Android_Programacin

    60/188

    Por spesto este "ontrol no tiene #"ha tilidad pr,"ti"a dada s sen"ille*+ pero "reo /epede servir "o#o e7e#plo para "o#entar los pasos ne"esarios para "onstrir "al/ier otro"ontrol #,s "o#ple7o( E#pe"e#os(

    En las anteriores o"asiones vi#os ".#o el nevo "ontrol "reado sie#pre hereda!a de al%3notro "ontrol o "ontenedor ya e-istente( En este "aso sin e#!ar%o+ va#os a heredar nestro

    "ontro dire"ta#ente de la "lase =iew 6"lase padre de la %ran #ayor&a de ele#entosvisales de Android9( Esto i#pli"a+ entre otras "osas+ /e por de'e"to nestro "ontrol no va atener nin%3n tipo de inter'a* %r,'i"a+ por lo /e todo el tra!a7o de ;di!7ar@ la inter'a* lova#os a tener /e ha"er nosotros( Ade#,s+ "o#o paso previo a la representa"i.n %r,'i"a dela inter'a*+ ta#!i$n va#os a tener /e deter#inar las di#ensiones /e nestro "ontroltendr, dentro de s ele#ento "ontenedor( Co#o vere#os ahora+ a#!as "osas se llevar,n a"a!o rede'iniendo dos eventos de la "lase =iew+ onMrawEHpara el di!7o de la inter'a*+ yon?easureEHpara el ",l"lo de las di#ensiones(

    Por llevar n orden "ronol.%i"o+ e#pe"e#os "o#entando el evento on?easureEH( Este

    evento se e7e"ta ato#,ti"a#ente "ada ve* /e se ne"esita re"al"lar el ta#aFo de n"ontrol( Pero "o#o ya he#os visto en varias o"asiones+ los ele#entos %r,'i"os in"lidos enna apli"a"i.n Android se distri!yen por la pantalla de na 'or#a otra dependiendo deltipo de "ontenedor o layot tili*ado( Por tanto+ el ta#aFo de n "ontrol deter#inado en la

    pantalla no depender, s.lo de $l+ sino de "iertas restri""iones i#pestas por s ele#ento"ontenedor o ele#ento padre( Para resolver esto+ en el evento on?easureEHre"i!ire#os"o#o par,#etros las restri""iones del ele#ento padre en "anto a an"ho y alto del "ontrol+"on lo /e podre#os tenerlas en "enta a la hora de deter#inar el an"ho y alto de nestro"ontrol personali*ado( Estas restri""iones se re"i!en en 'or#a de o!7etos ?easureGpec+/e "ontiene dos "a#pos: #odo y ta#aFo( El si%ni'i"ado del se%ndo de ellos es o!vio+ el

    pri#ero por s parte sirve para #ati*ar el si%ni'i"ado del se%ndo( Me e-pli"o( Este "a#po#odo pede "ontener tres valores posi!les:

    http://www.sgoliver.net/blog/wp-content/uploads/2011/02/control-seleccion-color.png
  • 8/12/2019 Android_Programacin

    61/188

    A9?DG9: indi"a /e el "ontrol podr, tener "o#o #,-i#o el ta#aFo espe"i'i"ado(>VAC9

  • 8/12/2019 Android_Programacin

    62/188

    123!"

    #$%1&11121311!1"

    1#1$1%2&21222322!2"

    2#2$2%3&31323333!3"

    3#3$3%&12

    7Dverride

    prote"tedvoidon?easureEintwidth?easureGpecJ intheight?easureGpecH)

    intancho + calcularAnchoEwidth?easureGpecH(

    intalto + calcularAltoEheight?easureGpecH(

    set?easuredMimensionEanchoJ altoH(*

    privateintcalcularAltoEintlimitesGpecH)

    intres + 1&&( //Alto por de,ecto

    intmodo + ?easureGpec.get?odeElimitesGpecH(

    intlimite + ?easureGpec.getGiPeElimitesGpecH(i'Emodo ++ ?easureGpec.A9?DG9H )

    res + limite( *

    elsei'Emodo ++ ?easureGpec.>VAC9VAC9

  • 8/12/2019 Android_Programacin

    63/188

    Con esto ya he#os deter#inado las di#ensiones del "ontrol+ por lo /e tan s.lo nos /edadi!7ar s inter'a* %r,'i"a( Co#o he#os indi"ado antes+ esta tarea se reali*a dentro delevento onMrawEH( Este evento re"i!e "o#o par,#etro n o!7eto de tipo Canvas+ so!re el/e podre#os e7e"tar todas las opera"iones de di!7o de la inter'a*( No voy a entrar endetalles de la "lase Canvas+ por/e $se ser, te#a "entral de n pr.-i#o art&"lo( Por ahoranos va#os a "on'or#ar sa!iendo /e es la "lase /e "ontiene la #ayor parte de los #$todosde di!7o en inter'a"es Android+ por e7e#plo drawRectEHpara di!7ar re"t,n%los+drawCircleEHpara "&r"los+ draw;itmapEHpara i#a%enes+ draw9extEHparate-to+ e in'inidad de posi!ilidades #,s( Para "onsltar todos los #$todos disponi!les pedesdiri%irte a la do"#enta"i.n o'i"ial de la "lase Canvas de Android( Ade#,s de la "laseCanvas+ ta#!i$n #e %star&a desta"ar la "lase Naint+ /e per#ite de'inir el estilo dedi!7o a tili*ar en los #etodos de di!7o de Canvas+ por e7e#plo el an"ho de tra*ado delas l&neas+ los "olores de relleno+ et"(

    Para nestro e7e#plo no ne"esitar&a#os "ono"er nada #,s+ ya /e la inter'a* del "ontrol esrelativa#ente sen"illa( 1e#os pri#ero el ".di%o y desp$s "o#enta#os los pasos

    reali*ados:

    http://developer.android.com/reference/android/graphics/Canvas.htmlhttp://developer.android.com/reference/android/graphics/Canvas.html
  • 8/12/2019 Android_Programacin

    64/188

    123!"

    #$%1&11121311!1"

    1#1$1%2&21222322!2"

    2#2$2%3&3132333

    7Dverride

    prote"tedvoidonMrawECanvas canvasH) //Dbtenemos las dimensiones del control

    intalto + get?easuredeightEH(

    intancho + get?easuredOidthEH(

    //Colores Misponibles

    Naint pRelleno + ne>NaintEH( pRelleno.setGtyleEGtyle.IF>:H(

    canvas.drawRectEancho/J &J 2BEancho/HJ alto/2JpRellenoH(

    pRelleno.setColorEColor.;H( canvas.drawRectE2BEancho/HJ &J 3BEancho/HJ alto/2JpRellenoH(

    pRelleno.setColorEColor.`>H( p;orde.setColorEColor.OF9>H( canvas.drawRectE&J &J ancho-1J alto/2J p;ordeH( canvas.drawRectE&J &J ancho-1J alto-1J p;ordeH(*

    En pri#er l%ar o!tene#os las di#ensiones "al"ladas en la 3lti#a lla#ada aon?easureEH#ediante los #$todos get?easuredeightEHyget?easuredOidthEH( Posterior#ente de'ini#os n o!7eto Naint/e sare#os paradi!7ar los rellenos de "ada "olor sele""iona!le( Para indi"ar /e se trata del "olor de rellenoa tili*ar tili*are#os la lla#ada a setGtyleEGtyle.IFdado /e se tili*ar, para di!7ar s.lo l&neas+no rellenos(

  • 8/12/2019 Android_Programacin

    65/188

    Con esto+ ya de!er&a#os tener n "ontrol "on el aspe"to e-a"to /e de'ini#os en nprin"ipio( El si%iente paso ser, de'inir s 'n"ionalidad i#ple#entando los eventos a los/e /era#os /e responda nestro "ontrol+ tanto eventos internos "o#o e-ternos(

    En nestro "aso s.lo va#os a tener n evento de "ada tipo( En pri#er l%ar de'inire#os nevento interno 6evento /e s.lo /ere#os "aptrar de 'or#a interna al "ontrol+ sin

    e-ponerlo al sario9 para responder a las plsa"iones del sario so!re los "olores de la*ona sperior+ y /e tili*are#os para a"tali*ar el "olor de la *ona in'erior "on el "olorsele""ionado( Para ello i#ple#entare#os el evento on9ouchEH+ lan*ado "ada ve* /e elsario to"a la pantalla so!re nestro "ontrol( La l.%i"a ser, sen"illa+ si#ple#ente"onsltare#os las "oordenadas donde ha plsado el sario 6#ediante los #$todos getVEHy get`EH9+ y dependiendo del l%ar plsado deter#inare#os el "olor so!re el /e se hasele""ionado y a"tali*are#os el valor del ati!to colorGeleccionado( Qinal#ente+lla#a#os al #$todo invalidateEHpara re'res"ar la inter'a* del "ontrol+ re'le7ando as& el"a#!io en el "olor sele""ionado+ si se ha prod"ido(

    123!"#$%1&11121311!1"1#1$1%2&21

    222322!2"

    7Dverride

    p!li"!ooleanon9ouch>ventE?otion>vent eventH) //Gi se ha pulsado en la Pona superior

    i'Eevent.get`EH 4 & event.get`EH Eget?easuredeightEH/2HH ) //Gi se ha pulsado dentro de los lZmites delcontrol

    i'Eevent.getVEH 4 & event.getVEH

    get?easuredOidthEHH ) //Meterminamos el color seleccionado segQnel punto pulsado

    i'Eevent.getVEH 4 Eget?easuredOidthEH/HB3H colorGeleccionado + Color.`>>:(

    else colorGeleccionado + Color.R>M(

    //Re,rescamos el control

    this.invalidateEH( * *

    retrnsper.on9ouch>ventEeventH(*

  • 8/12/2019 Android_Programacin

    66/188

    En se%ndo l%ar "reare#os n evento e-terno personali*ado+ /e lan*are#os "ando elsario plse so!re la *ona in'erior del "ontrol+ "o#o na 'or#a de a"eptar de'initiva#enteel "olor sele""ionado( Lla#are#os a este evento onGelectedColorEH( Para "rearloa"tare#os de la #is#a 'or#a /e ya vi#os en el art&"lo anterior( Pri#ero de'inire#osna inter'a* para el listener de nestro evento:

    123!"

    pa"a%enet.sgoliver.android(p!li"inter'a"eDnColorGelected

  • 8/12/2019 Android_Programacin

    67/188

    123!"

    #$%1&11121311!1"

    1#1$

    7Dverride

    p!li"!ooleanon9ouch>ventE?otion>vent eventH) //Gi se ha pulsado en la Pona superior

    i'Eevent.get`EH 4 & event.get`EH Eget?easuredeightEH/2HH ) //... * //Gi se ha pulsado en la Pona in,erior

    elsei'Eevent.get`EH 4 Eget?easuredeightEH/2H event.get`EH get?easuredeightEHH ) //ventEeventH(*

    Con esto+ nestra apli"a"i.n prin"ipal ya podr&a ss"ri!irse a este nevo evento para estarin'or#ada "ada ve* /e se sele""ione n "olor( 2irva la si%iente plantilla a #odo dee7e#plo:

  • 8/12/2019 Android_Programacin

    68/188

    123!"

    #$%1&11121311!1"

    1#1$1%2&212223

    p!li""lassControlNersonaliPado e-tendsActivity)

    privateGelectorColor ctlColor(

    7Dverride

    p!li"

    void

    onCreateE;undle savedFnstanceGtateH )

    sper.onCreateEsavedFnstanceGtateH( setContent=iewER.layout.mainH(

    ctlColor +EGelectorColorH,ind=iew;yFdER.id.scColorH(

    ctlColor.setDnColorGelectedDnColorGelected

  • 8/12/2019 Android_Programacin

    69/188

    he"ho en otras o"asiones+ sino /e ta#!i$n ne"esitare#os "o#pletar el "on7nto "onal%nas l&neas de ".di%o( Desarrolle#os esto po"o a po"o(

    En Android+ el ele#ento prin"ipal de n "on7nto de pestaFas ser, el "ontrol 9abost(ste va a ser el "ontenedor prin"ipal de nestro "on7nto de pestaFas y de!er, tenero!li%atoria#ente "o#o id el valor ;7android5id/tabhost;( Dentro de $ste va#os a

    in"lir n

  • 8/12/2019 Android_Programacin

    70/188

    123!"

    #$%1&11121311!1"

    1#1$1%2&21222322!2"

    2#2$2%3&31323333!3"

    3#3$3%&1

    Ta!android5id+78id/text=iew1 android5text+Contenido 9ab 1 android5layoutwidth+wrapcontent android5layoutheight+wrapcontent

    /4 /LinearLayot4

    LinearLayotandroid5id+78id/tab2 android5orientation+vertical android5layoutwidth+matchparent android5layoutheight+matchparent4

    Te-t1ie>android5id+78id/text=iew2 android5text+Contenido 9ab 2 android5layoutwidth+wrapcontent

    android5layoutheight+wrapcontent/4

    /LinearLayot4

    /Qra#eLayot4 /LinearLayot4

    /Ta!

  • 8/12/2019 Android_Programacin

    71/188

    Con esto ya tendr&a#os #ontada toda la estr"tra de "ontroles ne"esaria para nestrainter'a* de pestaFas( 2in e#!ar%o+ "o#o ya di7i#os al prin"ipio del art&"lo+ "on esto no ess'i"iente( Ne"esita#os aso"iar de al%na 'or#a "ada pestaFa "on s "ontenido+ de 'or#a/e el el "ontrol se "o#porte "orre"ta#ente "ando "a#!ia#os de pestaFa( ) estotendre#os /e ha"erlo #ediante ".di%o en nestra a"tividad prin"ipal(

    E#pe*are#os o!teniendo na re'eren"ia al "ontrol prin"ipal 9abosty prepar,ndolo paras "on'i%ra"i.n lla#ando a s #$todo setupEH( Tras esto+ "reare#os n o!7eto de tipo9abGpecpara "ada na de las pestaFas /e /era#os aFadir #ediante el #$todonew9abGpecEH+ al /e pasare#os "o#o par,#etro na eti/eta identi'i"ativa de la

    pestaFa 6en #i "aso de e7e#plo ;#ita!;+ ;#ita!B;+ ?9( Ade#,s+ ta#!i$n le asi%nare#os ellayot de "ontenido "orrespondiente a la pestaFa lla#ando al #$todo setContentEH+ eindi"are#os el te-to y el i"ono /e /ere#os #ostrar en la pestaFa #ediante el #$todosetFndicatorEtextoJ iconoH( 1ea#os el ".di%o "o#pleto(

    123!"#$%1&11121311!1"1#1$

    Resources res + getResourcesEH(9abosttabs+E9abostH,ind=iew;yFdEandroid.R.id.tabhostH(tabs.setupEH(9abost.9abGpec spec+tabs.new9abGpecEmitab1H(spec.setContentER.id.tab1H(spec.setFndicatorE9A;1J res.getMrawableEandroid.R.drawable.icbtnspea6nowHH(tabs.add9abEspecH(spec+tabs.new9abGpecEmitab2H(spec.setContentER.id.tab2H(spec.setFndicatorE9A;2J res.getMrawableEandroid.R.drawable.icdialogmapHH(tabs.add9abEspecH(tabs.setCurrent9abE&H(

    2i ve#os el ".di%o+ ve#os por e7e#plo "o#o para la pri#era pestaFa "rea#os n o!7eto9abGpec"on la eti/eta ;#ita!;+ le asi%na#os "o#o "ontenido no de los

  • 8/12/2019 Android_Programacin

    72/188

    En "anto a los eventos disponi!les del "ontrol 9abost+ an/e no sele ser ne"esario"aptrarlos+ pode#os ver a #odo de e7e#plo el #,s interesante de ellos+ Dn9abChanged+/e se lan*a "ada ve* /e se "a#!ia de pestaFa y /e nos in'or#a de la neva pestaFavisali*ada( Este evento pode#os i#ple#entarlo y asi%narlo #ediante el #$todosetDn9abChanged

  • 8/12/2019 Android_Programacin

    73/188

    En Android pode#os en"ontrar 4 tipos di'erentes de #en3s:

    %en>s Principales( Los #,s ha!itales+ apare"en en la *ona in'erior de la pantalla alplsar el !ot.n Z#en[ del tel$'ono(

    Su6+en>s( 2on #en3s se"ndarios /e se peden #ostrar al plsar so!re na op"i.nde n #en3 prin"ipal(

    %en>s Conte*tuales( \tiles en #"has o"asiones+ apare"en al reali*ar na plsa"i.nlar%a so!re al%3n ele#ento de la pantalla(En este pri#er art&"lo so!re el te#a vere#os ".#o tra!a7ar "on los dos pri#eros tipos de#en3s( En el si%iente+ "o#entare#os los #en3s "onte-tales y al%nos "ara"ter&sti"as #,savan*adas(

    Co#o "asi sie#pre+ va#os a tener dos alternativas a la hora de #ostrar n #en3 en nestraapli"a"i.n Android( La pri#era de ellas #ediante la de'ini"i.n del #en3 en n 'i"heroHML+ y la se%nda "reando el #en3 dire"ta#ente #ediante ".di%o( En este art&"lovere#os a#!as alternativas(

    1ea#os en pri#er l%ar ".#o "rear n #en3 a partir de s de'ini"i.n en HML( Los 'i"herosHML de #en3 se de!en "olo"ar en la "arpeta ;res]menu@ de nestro proye"to y tendr,nna estr"tra an,lo%a a la del si%iente e7e#plo:

    123!"#

    $%1&1112

    -#lversion+1.&encoding+ut,-$4#en xmlns5android+http5//schemas.android.com/ap6/res/android4

    ite#android5id+78id/?nuDpc1android5title+Dpcion1 android5icon+7drawable/tag4/ite#4

    ite#android5id+78id/?nuDpc2android5title+Dpcion2 android5icon+7drawable/,ilter4/ite#4ite#android5id+78id/?nuDpc3android5title+Dpcion3 android5icon+7drawable/chart4/ite#4

    /#en4Co#o ve#os+ la estr"tra !,si"a de estos 'i"heros es #y sen"illa( Tendre#os n ele#ento

    prin"ipal menu4/e "ontendr, na serie de ele#entos item4/e se "orresponder,n"on las distintas op"iones a #ostrar en el #en3( Estos ele#entos Vite#W tendr,n a s ve*

    varias propiedades !,si"as+ "o#o s ID 6android5id9+ s te-to 6android5title9 o si"ono 6android5icon9( Los i"onos tili*ados de!er,n estar por spesto en las "arpetas;res]drawable-T@ de nestro proye"to 6al 'inal del art&"lo os paso nos enla"es donde

    pod$is "onse%ir al%nos i"onos de #en3 Android %ratitos9(

    Una ve* de'inido el #en3 en el 'i"hero HML+ tendre#os /e i#ple#entar el eventoonCreateDptions?enuEHde la a"tividad /e /ere#os /e lo #estre( En este eventode!ere#os ;in'lar@ el #en3 de 'or#a pare"ida a ".#o ya he#os he"ho otras ve"es "on otrotipo de layots( Pri#ero o!tendre#os na re'eren"ia al in'later #ediante el #$todoget?enuFn,laterEHy posterior#ente %enerare#os la estr"tra del #en3 lla#ando as #$todo in,ateEHpas,ndole "o#o par,#etro el ID del #en de'inido en HML+ /e ennestro "aso ser, R.menu.menuprincipal( Por 3lti#o devolvere#os el valor true

    para "on'ir#ar /e de!e #ostrarse el #en3(

    http://schemas.android.com/apk/res/androidhttp://schemas.android.com/apk/res/androidhttp://schemas.android.com/apk/res/androidhttp://schemas.android.com/apk/res/android
  • 8/12/2019 Android_Programacin

    74/188

    123!"

    #

    7Dverride

    p!li"!ooleanonCreateDptions?enuE?enu menuH ) //Alternativa 1 ?enuFn,later in,later + get?enuFn,laterEH( in,later.in,lateER.menu.menuprincipalJ menuH(

    retrntre(*

    ) ya he#os ter#inado+ "on estos sen"illos pasos nestra apli"a"i.n ya de!er&a #ostrar sinpro!le#as el #en3 /e he#os "onstr&do+ an/e todav&a nos 'altar&a i#ple#entar la'n"ionalidad de "ada na de las op"iones #ostradas(

    Co#o he#os "o#entado antes+ este #is#o #en3 ta#!i$n lo podr&a#os "rear dire"ta#ente#ediante ".di%o+ ta#!i$n desde el evento onCreateDptions?enuEH( Para ello+ paraaFadir "ada op"i.n del #en3 pode#os tili*ar el #$todo addEHso!re el o!7eto de tipo?enu/e nos lle%a "o#o par,#etro del evento( Este #$todo re"i!e ] par,#etros: ID del

    %rpo aso"iado a la op"i.n 6vere#os /$ es esto en el si%iente art&"lo+ por ahoratili*are#os ?enu.:D:>9+ n ID 3ni"o para la op"i.n 6/e de"larare#os "o#o "onstantesde la "lase9+ el orden de la op"i.n 6/e no nos interesa por ahora+ tili*are#os?enu.:D:>9 y el te-to de la op"i.n( Por otra aprte+ el i"ono de "ada op"i.n loesta!le"ere#os #ediante el #$todo setFconEHpas,ndole el ID del re"rso( 1ea#os".#o /edar&a el ".di%o tili*ando esta alternativa+ /e %enerar&a n #en3 e-a"ta#entei%al al del e7e#plo anterior:

    http://www.sgoliver.net/blog/wp-content/uploads/2011/03/android-menus1.png
  • 8/12/2019 Android_Programacin

    75/188

    123!"

    #$%1&1112131

    privatestati"'inalint?:0DNC1 + 1(privatestati"'inalint?:0DNC2 + 2(privatestati"'inalint?:0DNC3 + 3(//...

    7Dverride

    p!li"!ooleanonCreateDptions?enuE?enu menuH ) //Alternativa 2 menu.addE?enu.:D:>J ?:0DNC1J ?enu.:D:>JDpcion1H.setFconER.drawable.tagH( menu.addE?enu.:D:>J ?:0DNC1J ?enu.:D:>JDpcion2H.setFconER.drawable.,ilterH( menu.addE?enu.:D:>J ?:0DNC1J ?enu.:D:>JDpcion3H.setFconER.drawable.chartH(

    retrntre(*Constrido el #en3+ la i#ple#enta"i.n de "ada na de las op"iones se in"lir, en el eventoonDptionsFtemGelectedEH de la a"tividad /e #ostrar, el #en3( Este evento re"i!e"o#o par,#etro el ite# de #en3 /e ha sido plsado por el sario+ "yo ID pode#osre"perar "on el #$todo getFtemFdEH( 2e%3n este ID podre#os sa!er /$ op"i.n ha sido

    plsada y e7e"tar nas a""iones otras( En nestro "aso de e7e#plo+ lo 3ni"o /e hare#osser, #odi'i"ar el te-to de na eti/eta 6lbl?ensaje9 "olo"ada en la pantalla prin"ipal dela apli"a"i.n(

    1

    23!"#$%1&11

    121311!1"

    7Dverride

    p!li"!ooleanonDptionsFtemGelectedE?enuFtem itemH ) s>it"hEitem.getFtemFdEHH ) "aseR.id.?nuDpc15 lbl?ensaje.set9extEDpcion 1 pulsadaSH(

    retrntre( "aseR.id.?nuDpc25 lbl?ensaje.set9extEDpcion 2 pulsadaSH((

    retrntre( "aseR.id.?nuDpc35

    lbl?ensaje.set9extEDpcion 3 pulsadaSH(( retrntre( de'alt5 retrnsper.onDptionsFtemGelectedEitemH( **

    Con esto+ he#os "onse%ido ya n #en3 "o#pleta#ente 'n"ional( 2i e7e"ta#os elproye"to en el e#lador "o#pro!are#os ".#o al plsar el !ot.n de Z#enZ del tel$'onoapare"e el #en3 /e he#os de'inido y /e al plsar "ada op"i.n se #estra el #ensa7e dee7e#plo(

    Pase#os ahora a "o#entar los s!#en3s( Un s!#en3 no es #,s /e n #en3 se"ndario/e se #estra al plsar na op"i.n deter#inada de n #en3 prin"ipal( Los s!#en3s en

  • 8/12/2019 Android_Programacin

    76/188

    Android se #estran en 'or#a de lista e#er%ente+ "yo t&tlo "ontiene el te-to de la op"i.nele%ida en el #en3 prin"ipal( Co#o e7e#plo+ va#os a aFadir n s!#en3 a la Op"i.n 4 dele7e#plo anterior+ al /e aFadire#os dos nevas op"iones se"ndarias( Para ello+ !astar, "oninsertar en el HML de #en3 n nevo ele#ento menu4dentro del ite# "orrespondiente ala op"i.n 4( De esta 'or#a+ el HML /edar&a ahora "o#o si%e:

    123!"#$%1&

    11121311!1"1#1$1%

    -#lversion+1.&encoding+ut,-$4#en xmlns5android+http5//schemas.android.com/ap6/res/android4

    ite#android5id+78id/?nuDpc1android5title+Dpcion1 android5icon+7drawable/tag4/ite#4ite#android5id+78id/?nuDpc2android5title+Dpcion2 android5icon+7drawable/,ilter4/ite#4ite#android5id+78id/?nuDpc3android5title+Dpcion3 android5icon+7drawable/chart4 #en4 ite#android5id+78id/Gub?nuDpc1 android5title+Dpcion 3.1/4

    ite#android5id+78id/Gub?nuDpc2 android5title+Dpcion 3.2/4

    /#en4/ite#4

    /#en42i volve#os a e7e"tar ahora el proye"to y plsa#os la op"i.n 4 nos apare"er, el"orrespondiente s!#en3 "on las dos nevas op"iones aFadidas( Lo ve#os en la si%ientei#a%en:

    http://schemas.android.com/apk/res/androidhttp://schemas.android.com/apk/res/androidhttp://schemas.android.com/apk/res/androidhttp://schemas.android.com/apk/res/android
  • 8/12/2019 Android_Programacin

    77/188

    Co#pro!a#os "o#o e'e"tiva#ente apare"en las dos nevas op"iones en la lista e#er%ente+y /e el t&tlo de la lista se "orresponde "on el te-to de la op"i.n ele%ida en el #en3

    prin"ipal 6;Op"ion4;9(

    Para "onse%ir esto #is#o #ediante ".di%o pro"eder&a#os de 'or#a si#ilar a la anterior+"on la 3ni"a di'eren"ia de /e la op"i.n de #en3 4 la aFadire#os tili*ando el #$todoaddGub?enuEHen ve* de addEH+ y %ardando na re'eren"ia al s!#en( 2o!re els!#en3 aFadido insertare#os las dos nevas op"iones tili*ando na ve* #,s el #$todoaddEH( 1e#os ".#o /edar&a:

    123!"

    #$%

    //Alternativa 2menu.addE?enu.:D:>J ?:0DNC1J ?enu.:D:>JDpcion1H.setFconER.drawable.tagH(menu.addE?enu.:D:>J ?:0DNC1J ?enu.:D:>JDpcion2H.setFconER.drawable.,ilterH(//menu.addE?enu.:D:>J ?:0DNC1J ?enu.:D:>J

    Dpcion3H.setFconER.drawable.chartH(Gub?enu smnu + menu.addGub?enuE?enu.:D:>J ?:0DNC1J?enu.:D:>J Dpcion3H .setFconER.drawable.chartH(smnu.addE?enu.:D:>J G?:0DNC1J ?enu.:D:>J Dpcion 3.1H(smnu.addE?enu.:D:>J G?:0DNC2J ?enu.:D:>J Dpcion 3.2H(

    En "anto a la i#ple#enta"i.n de estas op"iones de s!#en3 no ha!r&a di'eren"ia "on todolo "o#entado anterior#ente ya /e ta#!i$n se tratan desde el eventoonDptionsFtemGelectedEH+ identi'i",ndolas por s ID(

    Por tanto+ "on esto ha!r&a#os ter#inado de "o#entar las op"iones !,si"as a la hora de "rear#en3s y s!#ens en nestras apli"a"iones Android( En el si%iente art&"lo vere#os

    http://www.sgoliver.net/blog/wp-content/uploads/2011/03/android-submenus1.png
  • 8/12/2019 Android_Programacin

    78/188

    al%nas op"iones al%o #,s avan*adas /e+ an/e #enos 're"entes+ pede /e nos ha%an'alta para desarrollar deter#inadas apli"a"iones(

    El ".di%o de este art&"lo pod$is des"ar%arlo desde este enla"e(

    2i ne"esit,is i"onos para #ostrar en los #en3s a/& ten$is varios enla"es "on al%nos%ratitos /e pod$is tili*ar en vestras apli"a"iones Android:

    http:==>>>(androidi"ons("o#='ree!ies(php http:==>>>(%ly'-("o#=prod"ts='reeandroidB(ht#l

    %en>s en Android 89 %en>s Conte*tuales

    En el art&"lo anteriordel "rsoya vi#os ".#o "rear #en3s y s!#en3s !,si"os paranestras apli"a"iones Android( 2in e#!ar%o+ e-iste otro tipo de #en3s /e nos peden ser#y 3tiles en deter#inados "onte-tos: los #en3s "onte-tales( Este tipo de #en3 sie#preva aso"iado a n "ontrol "on"reto de la pantalla y se #estra al reali*ar na plsa"i.n lar%a

    so!re $ste( 2ele #ostrar op"iones espe"&'i"as disponi!les 3ni"a#ente para el ele#entoplsado( Por e7e#plo+ en n "ontrol de tipo lista podr&a#os tener n #en3 "onte-tal /eapare"iera al plsar so!re n ele#ento "on"reto de la lista y /e per#itiera editar s te-to oeli#inarlo de la "ole""i.n(

    Pes !ien+ la "rea"i.n y tili*a"i.n de este tipo de #en3s es #y pare"ida a lo /e ya vi#ospara los #en3s y s!#en3s !,si"os+ pero presentan al%nas parti"laridades /e ha"eninteresante tratarlos al #ar%en del resto en este nevo art&"lo(

    E#pe"e#os por n "aso sen"illo( 1a#os a partir del e7e#plo del art&"lo anterior+ al /eva#os a aFadir en pri#er l%ar n #en3 "onte-tal /e apare*"a al plsar so!re la eti/eta

    de te-to /e #ostr,!a#os en la ventana prin"ipal de la apli"a"i.n( Para ello+ lo pri#ero /eva#os a ha"er es indi"ar en el #$todo onCreateEHde nestra a"tividad prin"ipal /e laeti/eta tendr, aso"iado n #en3 "onte-tal( Esto lo "onse%i#os "on na lla#ada aregisterIorContext?enuEH:

    123!"

    #$%1&

    p!li"voidonCreateE;undle savedFnstanceGtateH ) sper.onCreateEsavedFnstanceGtateH( setContent=iewER.layout.mainH(

    //Dbtenemos las re,erencias a los controles lbl?ensaje +E9ext=iewH,ind=iew;yFdER.id.

  • 8/12/2019 Android_Programacin

    79/188

    op"iones+ o "reando a #ano el #en3 #ediante el #$todo addEHpara #,s in'or#a"i.n leerel art&"lo anteriorJ( En nestro e7e#plo he#os de'inido n #en3 en HML lla#ado;#en"t-eti/eta(-#l;:

    12

    3!"#$%1&

    -#lversion+1.&encoding+ut,-$4#en

    xmlns5android+http5//schemas.android.com/ap6/res/android4