【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