当我调用disegnaMessaggio(String mesaggio)
方法时,我试图以动态方式添加TextView。
点击按钮时会调用此方法。
TextView
没有出现。
这是方法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);
}
我看到一些对我不起作用的问题:
After onCreate: add a View and remove it upon buttonclick
Add view outside of onCreate in android
另外,我在同一个类中的其他方法中添加了其他视图,但是在onCreate中调用了此方法。
这是完整的代码:
MainActivity类:
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课程:
package com.example.user.prima_app;
/**
* Created by 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课程:
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 by 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课程:
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);
}
}
}
当我点击Quadratino
视图时,在点击监听器中,我调用propagaClick
类的方法Griglia
。
propagaClick
会调用finePartita
类的Partita
方法,该方法将调用disegnaMessaggio
。
感谢您的耐心等待。
答案 0 :(得分:0)
在onCreate中,您应该使用此行来扩展活动的根布局(或任何要添加视图的布局)
parentLayout = getLayoutInflater().inflate(R.layout.activity_main,null);
然后在任何其他方法中,
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);
}
答案 1 :(得分:0)
您可以在onCreate中创建文本视图,并将可见性设置为已消失。当您单击按钮时,只需实现
TextView.setVisibility(View.Visible);