在制作一个2048的时候我需要在一个GridLayout中加入2048的中数字的卡片,于是建立了一个方法
//向布局中加入卡片 private void addCards(int cardWidth,int cardHeight) { Card card; for(int i = 0;i < 4;i++) { for (int j = 0; j < 4; j++) { //建立卡片的信息 card = new Card(getContext()); card.setNumber(2); //将卡片加入到布局中 addView(card, cardWidth, cardHeight); //记录卡片 cards[i][j] = card; } } }
然后这个方法的卡片的宽高在OnSizeChange中获取,保证获取的宽高适合屏幕
@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); int cardWidth = ( Math.min(w,h) - 10 ) / 4; addCards(cardWidth,cardWidth); }
后来却发现这个addView没办法帮我将卡片加入到布局当中去
经过排查,发现,是因为onSizeChange这个方法是在构造函数执行之后才会执行的,而这个时候布局已经完成了,所以没有办法将卡片加入到布局当中去
所以卡片的宽高应该是在构造函数中就已经获取了,所以我做了之后的修改
这是构造函数中自定义的方法
private void initializeGameView() { setColumnCount(4); //一行只有4列 setBackgroundColor(0xffbbada0); //一个灰色的背景 addCards(GetCardWidth(),GetCardWidth()); //向布局中加入卡片 getGesture(); //获取手势 }
在构造函数中就addCards,然后宽高用另一种方法获取
private int GetCardWidth() { //屏幕信息的对象 DisplayMetrics displayMetrics; displayMetrics = getResources().getDisplayMetrics(); //获取屏幕信息 int cardWidth; cardWidth = displayMetrics.widthPixels; //一行有四个卡片,每个卡片占屏幕的四分之一 return ( cardWidth - 10 ) / 4; }
这样就不用依赖这个gridLayout中的回调函数去获取屏幕的宽高,从而能够在方法构造阶段就可以读出屏幕的宽高,然后将这个宽高加入到卡片当中去,使得addView()这个函数有效果