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中的成员直接使用中文也是正常的。