在onCreate外部的方法中添加视图

时间:2017-07-25 22:03:53

标签: java android

当我调用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

感谢您的耐心等待。

2 个答案:

答案 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);