【LGame入门学堂011.控件篇】简单控件之解决添加控件后控件不显示的问题

笨木头  2012-05-9 8:57   LGame   阅读(3,163)   6条评论

LGame学堂011简单控件之解决添加控件后控件不显示的问题

 

关键字:LGame 入门 控件

 

位,不好意思,之前忘了说一个很重要的问题,也许有些朋友已经遇到这个问题了。那就是,明明创建了控件,也调用了add函数,控件也已经设为可见了,但控件就是不显示。

1.们是怎么创建控件的呢?当然是在构造器里咯:

public class GameScreen extends Screen {
 
        
 
        public GameScreen() {
 
                createBtn();
 
        }
 
        
 
        private void createBtn() {
 
                LButton btn = new LButton("assets/btn.png");
 
                add(btn);
 
        }
 
}

好吧,这很糟糕,因为这个按钮永远都不会显示出来了。

2.实,要解决这个问题,只需要一个步骤:

不要在构造器里添加控件,要在onLoad函数中添加控件。

@Override
 
        public void onLoad() {
 
btn = new LButton("笨木头", 100, 100, 4, 4);
 
add(btn);
 
    }

3.onLoad()函数是Screen的一个函数(好吧,我好像说了废话),其实它也是一个钩子函数(不准告诉我你不知道钩子函数~你没有认真看我之前的文章,好伤心~),或者用设计模式的术语来说,就是“将父类的实现延迟到子类中”(糟糕,顿时觉得我好专业~忽略吧,管它什么设计模式呢~懂了就好)。

方文档说,onLoad函数使用了异步操作,可以在这个函数里做一些耗时的初始化操作。哎吖,其实我们别管它异步不异步了,其实我们之前创建了控件,却不显示的问题。全都是desktop的错。

4.果你有看过Screen的源码,刚好有看到了onCreate函数,那就会明白了,我们一起来看看:

/**
 
         * 当Screen被创建(或再次加载)时将调用此函数
 
         * 
         * @param width
 
         * @param height
 
         */
 
        public void onCreate(int width, int height) {
 
                ...
 
                this.desktop = new Desktop(baseInput, width, height);
 
                ...
 
        }

嘿,看到这么短的代码很兴奋是不是~其实是我干的坏事,因为我们只需要看这一句。desktop是在onCreate函数里初始化的,在这之前desktop一直都是null值。啥?这又跟我们讨论的问题有什么关系呢?有~再来看看我们是怎么添加控件的,我们是调用Screenadd函数来添加控件的,好了,捂着你的心脏,别被气疯咯:

/**
 
         * 添加游戏组件
 
         * 
         * @param comp
 
         */
 
        public void add(LComponent comp) {
 
                if (desktop != null) {
 
                        desktop.add(comp);
 
                }
 
        }

5.~~终于抓到凶手了~因为在onCreate函数执行之前,desktop一直都是null值,而我们在构造器里添加控件之后不起作用。对了~!你已经想到了吧?那就是因为,Screen的构造器是先被执行的,其后再执行onCreate函数。那么,在构造器里,desktop永远都是null值,我们又怎么能在这里添加控件呢?

为什么,为什么没有人问我为什么我要给这篇文字编号呢?~我编号12345有什么规律呢?~

嘿嘿,好吧,那我就回答你吧~

没有规律~觉得好玩~觉得文字有点长,怕你看不下去,就编编号咯~

呼呼~我啰嗦完了~希望没有气到你~

那么,下次再和你唠叨哈~我最可爱的读者。

 

 

 

原文第一次发布于Android-Fans论坛:

http://www.android-fans.net/forum.php?mod=viewthread&tid=1623&page=1&extra=#pid4912

 

 

6 评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注