您的位置:首页 > 其它

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

2012-05-09 08:57 316 查看
【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值。啥?这又跟我们讨论的问题有什么关系呢?有~再来看看我们是怎么添加控件的,我们是调用Screen的add函数来添加控件的,好了,捂着你的心脏,别被气疯咯:
/**
 
         * 添加游戏组件
 
         * 
         * @param comp
 
         */
 
        public void add(LComponent comp) {
 
                if (desktop != null) {
 
                        desktop.add(comp);
 
                }
 
        }


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

为什么,为什么没有人问我为什么我要给这篇文字编号呢?~我编号1、2、3、4、5有什么规律呢?~
嘿嘿,好吧,那我就回答你吧~
没有规律~觉得好玩~觉得文字有点长,怕你看不下去,就编编号咯~

呼呼~我啰嗦完了~希望没有气到你~
那么,下次再和你唠叨哈~我最可爱的读者。



原文第一次发布于Android-Fans论坛:
http://www.android-fans.net/forum.php?mod=viewthread&tid=1623&page=1&extra=#pid4912
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐