java - Add a view in a method outside onCreate -
i'm trying add textview dinamically when call disegnamessaggio(string mesaggio)
method. method called when button tapped.
the textview
not appear.
this method disegnamessaggio
:
public void disegnamessaggio(string messaggio){ textview textview=new textview(getcontext()); viewgroup.layoutparams lp=new viewgroup.layoutparams(layoutparams.wrap_content,layoutparams.wrap_content); textview.settext(messaggio); textview.settextcolor(color.red); textview.settextsize(20); textview.setx(this.getheight()/2); textview.sety(this.getwidth()/2); this.addview(textview,lp); }
i have seen questions not works me:
after oncreate: add view , remove upon buttonclick
add view outside of oncreate in android
in addition, add other view in other method in same class, method called in oncreate.
this complete code:
mainactivity class:
package com.example.user.prima_app; import android.support.v7.app.appcompatactivity; import android.os.bundle; import android.view.view; import android.view.viewgroup; import android.widget.textview; import android.widget.button; import android.widget.linearlayout; import android.view.viewgroup.layoutparams; import android.view.viewgroup.marginlayoutparams; import android.view.menu; import android.view.menuitem; import android.view.menuinflater; import org.w3c.dom.text; public class mainactivity extends appcompatactivity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); linearlayout layout=(linearlayout) findviewbyid(r.id.layout); partita.creagriglia(this); partita.nuovapartita(); layout.addview(partita.griglia); } @override public boolean oncreateoptionsmenu(menu menu) { menuinflater inflater=getmenuinflater(); inflater.inflate(r.menu.main,menu); return true; } @override public boolean onoptionsitemselected(menuitem item) { int id=item.getitemid(); switch(id) { case r.id.reset: partita.nuovapartita(); } return false; } }
partita class:
package com.example.user.prima_app; /** * created user on 04/07/2017. */ import android.content.context; public class partita { public static griglia griglia; public static int larghezza=10; public static int altezza=10; public static int nmine=15; public static context context; public static boolean finepartita=false; public static void creagriglia(context cont){ context=cont; griglia=new griglia(cont); } public static void nuovapartita(){ finepartita=false; griglia.svuotagriglia(); griglia.creagriglia(larghezza,altezza,nmine,50); griglia.partitaincorso=true; } public static void finepartita(){ finepartita=true; griglia.partitaincorso=false; griglia.disegnamessaggio("hai perso"); //this call disegnamessaggio } }
griglia class:
package com.example.user.prima_app; import android.graphics.color; import android.view.view; import android.content.context; import android.util.attributeset; import android.view.viewgroup; import android.widget.textview; import android.graphics.rect; import android.util.log; import java.util.random; import java.util.list; import java.util.arraylist; /** * created user on 18/05/2017. */ public class griglia extends viewgroup { public quadratino[][] griglia;//quadratino[x][y] private int larg=10; private int alt=10; private int lato=25; public boolean partitaincorso; public griglia(context cont,attributeset as) { super(cont, as); } public griglia(context cont){ super(cont); } public void creagriglia(int larghezza,int altezza,int nmine,int lato1){ larg=larghezza; alt=altezza; lato=lato1; quadratino quadratino; viewgroup.layoutparams lp=new viewgroup.layoutparams(lato,lato); quadratino.setlato(lato); quadratino.setgriglia(this); griglia=new quadratino[larghezza][altezza]; boolean campomine[][]=campomine(nmine); int camponumeri[][]=generanumeretti(campomine); for(int l=0;l<larghezza;l++){ for(int a=0;a<alt;a++){ quadratino=new quadratino(camponumeri[l][a],campomine[l][a],l,a,getcontext()); griglia[l][a]=quadratino; addview(quadratino,lp); } } } public void svuotagriglia(){ this.removeallviews(); griglia=null; } private boolean[][] campomine(int nmine){ int i=0; boolean campomine[][]=new boolean[larg][alt]; random random=new random(); int x; int y; while(i<nmine){ x=random.nextint(larg); y=random.nextint(alt); if(!campomine[x][y]){ campomine[x][y]=true; i++; } } return campomine; } private int[][] generanumeretti(boolean campomine[][]){ if(larg<1) return new int[0][0]; int numeretti[][]=new int[larg][alt]; for(int i=0;i<larg;i++){ for(int j=0;j<alt;j++){ if(campomine[i][j]){ aggiungi1intorno(numeretti,campomine,i,j); } } } return numeretti; } public void propagaclick(quadratino quadratino){ log.d("propagaclick","propagato il quadratino alla x:"+quadratino.posizionex+" e alla y:"+quadratino.posizioney+" con numero:"+quadratino.numeretto+" e con bomba:"+quadratino.bomba); if(!partitaincorso) return; if(quadratino.bomba) { quadratino.cliccato=true; quadratino.invalidate(); partita.finepartita(); } list<quadratino> interessati=new arraylist<quadratino>(); interessati.add(griglia[quadratino.posizionex][quadratino.posizioney]); for(int i=0;i<interessati.size();i++){ interessati.get(i).cliccato=true; interessati.get(i).invalidate(); if(interessati.get(i).numeretto==0 && !interessati.get(i).bomba){ aggiungiallalista(interessati,i); } } } private int[][] aggiungi1intorno(int numeretti[][],boolean campomine[][],int x,int y){ if(x>0){ if(!campomine[x-1][y])numeretti[x-1][y]++; if(y>0) { if(!campomine[x-1][y-1])numeretti[x-1][y-1]++; } if(y<alt-1) { if(!campomine[x-1][y+1])numeretti[x-1][y+1]++; } } if(x<larg-1){ if(!campomine[x+1][y])numeretti[x+1][y]++; if(y<alt-1){ if(!campomine[x+1][y+1]) numeretti[x+1][y+1]++; } if(y>0){ if(!campomine[x+1][y-1])numeretti[x+1][y-1]++; } } if(y>0){ if(!campomine[x][y-1])numeretti[x][y-1]++; } if(y<alt-1){ if(!campomine[x][y+1])numeretti[x][y+1]++; } return numeretti; } private list<quadratino> aggiungiallalista(list<quadratino> interessati,int n){ int x=interessati.get(n).posizionex; int y=interessati.get(n).posizioney; if(x>0){ if(!interessati.contains(griglia[x-1][y])) interessati.add(griglia[x-1][y]); if(y>0) { if(!interessati.contains(griglia[x-1][y-1])) interessati.add(griglia[x-1][y-1]); } if(y<alt-1) { if(!interessati.contains(griglia[x-1][y+1])) interessati.add(griglia[x-1][y+1]); } } if(x<larg-1){ if(!interessati.contains(griglia[x+1][y])) interessati.add(griglia[x+1][y]); if(y<alt-1){ if(!interessati.contains(griglia[x+1][y+1])) interessati.add(griglia[x+1][y+1]); } if(y>0){ if(!interessati.contains(griglia[x+1][y-1])) interessati.add(griglia[x+1][y-1]); } } if(y>0){ if(!interessati.contains(griglia[x][y-1])) interessati.add(griglia[x][y-1]); } if(y<alt-1){ if(!interessati.contains(griglia[x][y+1])) interessati.add(griglia[x][y+1]); } return interessati; } public void disegnamessaggio(string messaggio){//<------------ disegnamessaggio textview textview=new textview(cont); viewgroup.layoutparams lp=new viewgroup.layoutparams(layoutparams.wrap_content,layoutparams.wrap_content); textview.settext(messaggio); textview.settextcolor(color.red); textview.settextsize(20); textview.setx(this.getheight()/2); textview.sety(this.getwidth()/2); this.addview(textview,lp); } @override public void onmeasure(int largmisura,int altmisura){ super.onmeasure(largmisura,altmisura); int latospec=measurespec.makemeasurespec(lato,measurespec.exactly); for(int l=0;l<larg;l++){ for(int a=0;a<alt;a++){ griglia[l][a].measure(latospec,latospec); } } } @override public void onlayout(boolean cambiato,int sin,int sopra,int dest,int sotto){ int x1; int y1; int x2; int y2; for(int l=0;l<larg;l++){ x1=(l*lato)+1; x2=(l+1)*lato; for(int a=0;a<alt;a++){ y1=(a*lato)+1; y2=(a+1)*lato; griglia[l][a].layout(x1,y1,x2,y2); } } } }
quadratino class:
package com.example.user.prima_app; import android.view.view; import android.content.context; import android.util.attributeset; import android.graphics.paint; import android.graphics.canvas; import android.graphics.color; import android.graphics.rect; import android.graphics.bitmap; import android.graphics.picture; public class quadratino extends view { public int numeretto; public boolean cliccato; public boolean bomba; public int posizionex; public int posizioney; public static griglia griglia; private static paint paintnum; private static paint paintbomba; private static paint paintlato; private static paint paintsfondo; private static rect rettangolo; private static rect rettangololato; private static final int contornoquadratino=2; private static int lato; public static int grandezzatesto=25; static{ paintnum=new paint(); paintlato=new paint(); paintsfondo=new paint(); paintbomba=new paint(); paintnum.setcolor(color.black); paintnum.settextsize(grandezzatesto); paintnum.settextalign(paint.align.center); paintbomba.setcolor(color.red); paintbomba.settextsize(grandezzatesto); paintbomba.settextalign(paint.align.center); paintlato.setcolor(color.gray); paintlato.setstyle(paint.style.stroke); paintlato.setstrokewidth(contornoquadratino); paintsfondo.setcolor(color.ltgray); } public static void setlato(int lato1){ lato=lato1; rettangolo=new rect(0,0,lato,lato); rettangololato=new rect(0,0,lato,lato); } public static void setgriglia(griglia griglia1){ griglia=griglia1; } public quadratino(context cont, attributeset attr) { super(cont, attr); numeretto=0; cliccato=false; bomba=false; rettangolo=new rect(0,0,50,50); rettangololato=new rect(0,0,50,50); this.setonclicklistener(new view.onclicklistener(){ public void onclick(view view){ quadratino quadratino=(quadratino)view; quadratino.cliccato=true; quadratino.invalidate(); quadratino.griglia.propagaclick(quadratino); } }); } public quadratino(int num,int x,int y,context cont){ this(num,false,false,x,y,cont); } public quadratino(int num,boolean bomba,int x,int y,context cont){ this(num,bomba,false,x,y,cont); } public quadratino(int num,boolean bomba,boolean cliccato,int x,int y,context cont){ super(cont); numeretto=num; this.cliccato=cliccato; this.bomba=bomba; posizionex=x; posizioney=y; this.setonclicklistener(new view.onclicklistener(){ public void onclick(view view){ quadratino quadratino=(quadratino)view; quadratino.griglia.propagaclick(quadratino); } }); } @override protected void ondraw(canvas canvas){ super.ondraw(canvas); canvas.drawrect(rettangolo,paintsfondo); canvas.drawrect(rettangololato,paintlato); if(cliccato) { if(!bomba) { canvas.drawtext(integer.tostring(numeretto), lato / 2, lato - (grandezzatesto / 2), paintnum); } else canvas.drawtext("b", lato / 2, lato - (grandezzatesto / 2), paintbomba); } } }
when tap quadratino
view, in click listener, call method propagaclick
of griglia
class.
propagaclick
call finepartita
method of partita
class call disegnamessaggio
.
thanks patience.
in oncreate should have line inflates root layout of activity (or layout want add view to)
parentlayout = getlayoutinflater().inflate(r.layout.activity_main,null);
then in other method,
public void disegnamessaggio(string messaggio){ textview textview=new textview(getcontext()); viewgroup.layoutparams lp=new viewgroup.layoutparams(layoutparams.wrap_content,layoutparams.wrap_content); textview.settext(messaggio); textview.settextcolor(color.red); textview.settextsize(20); textview.setx(this.getheight()/2); textview.sety(this.getwidth()/2); //this.addview(textview,lp); parentlayout.addview(textview,lp); }
Comments
Post a Comment