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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值