addView() 无法显示的问题

在制作一个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()这个函数有效果


猜你喜欢

转载自blog.csdn.net/a591243801/article/details/67640114