Symbian開發/視圖間參數傳遞
外觀
在使用Series 60多視圖架構時我們經常需要在視圖間傳遞數據。多視圖架構提供了函數
CAknViewAppUi::ActivateLocalViewL(TUid aViewId, TUid aCustomMessageId, const TDesC8& aCustomMessage)
用於在激活某個視圖時傳入相應的參數。我們可以通過實現視圖類的
DoActivateL(const TVwsViewId& aPrevViewId,TUid aCustomMessageId, const TDesC8& aCustomMessage)
來進行參數的處理。
通過觀察上面這兩個函數發現我們可以利用aCustomMessageId和aCustomMessage來進行直接進行整數型和8位描述符的傳遞。但如果我們要在視圖間傳遞的參數有很多,這時怎麼辦?我們可能會想到把多個參數按一定順序格式化到aCustomMessage中,然後在接收方進行解析。這種方法會產生一個問題:當參數增加或減少時對參數組織和解析都會增加負擔。其時Symbian提供了TPckgBuf這個類來進行打包工作,通過它我們可以把一個簡單對象(通常是T類)包裝到8位描述符的緩衝區中。下面的代碼演示了如何利用TPckgBuf在視圖間傳遞簡單對象:
//Parameter class class TViewPara { public: TInt32 iId; TBuf<32> iCode; TBuf<8> iStatus; TTime iDate; };
傳遞參數:
_LIT(KCode, "1021568"); _LIT(KStatus, "N"); TViewPara info; info.iId = 300125; info.iCode.Copy(KCode); info.iStatus.Copy(KStatus); info.iDate.HomeTime(); TPckgBuf<TViewPara> package(info); TBuf8<128> para; //要根据TViewPara所占的内存空间准备足够的缓冲区 para.Copy(package); ui->ActivateLocalViewL(TUid::Uid(EBrowserViewId), TUid::Uid(0), para);
解析參數:
void CBrowserView::DoActivateL(const TVwsViewId& /*aPrevViewId*/, TUid aCustomMessageId, const TDesC8& aCustomMessage) { if(aCustomMessage.Length()) { TViewPara info; TPckgBuf<TViewPara> package(info); package.Copy(aCustomMessage); iInfo = package(); //iInfo是TViewPara类型的数据成员 } //…………………………… }
備註:
為了示例簡單明了並沒有通過aCustomMessageId進行防禦性編碼。
上面的代碼在基於Series60 3rd的設備上進行了測試,TViewPara中的成員直接使用中文也是正常的。