【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