[英]Add a view in a method outside onCreate
我試圖在我調用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);
}
我看到了一些不適合我的問題:
另外,我在同一類的其他方法中添加了其他視圖,但是此方法在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
將調用Partita
類的finePartita
方法,該方法將調用disegnaMessaggio
。
謝謝你的耐心。
在您的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);
}
您可以只在onCreate中創建textview並將可見性設置為走了。 當您單擊按鈕時,只需實施
TextView.setVisibility(View.Visible);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.