打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
symbian 多视图(view)
使用view的应用程序每次只能有一个活动的view,当另一个view要激活时,当前的view就要被释放。当一个view被释放后,所以的菜单,对话框以及包含的应用都将被关闭。
每个view都被当作一个应用UI对待,它必须提供一个Id()函数以便为系统所标识,它也要重载DoActivateL(),DoDeactivate(),HandleForegroundEventL(),HandlCommandL()和HandleStatusPaneSizeChange()函数以处理各种事件。

下面一个个的看
DoActivateL()
当客户端要求你的view激活时,它就要被调用。client可能发送消息参数给你的view,如果你的view已经是激活了,那只有当client明确要求再次激活时才被调用,所以你的DoActivateL()实现得应付这种情况,ie已经激活了view。如果你不打算显示view或者你的view不想处理任何消息,那一个简单的检查和return即可。

DoDeactive()
这个函数当你的view被注销时调用,view被注销时通常有两种情况:一是你的应用程序要退出了,二是相同程序里另一个view要被激活。这个函数很重要,咱们可不能忘记了:)

HandleForegroundEventL()
这个函数主要是在你的view被激活时调用(即在DoActivateL()和DoDeactivate()之间被调用)。当你的view在前台时,它将是HanleForegroundEvent(ETrue),当你的view移出前台时,它将为HandleForegroundEvent(EFalse),只有当前台状态确实改变时这个函数才会被调用。

HandleCommandL()
当view菜单产生一个命令后本函数将被调用。

HandleStatusPaneSizeChange()
当client的尺寸由于status pane而改变时,本函数被调用了就。

下面是一个view在接受事件的典型调用顺序
1.DoActivateL()
2.HandleForegroundEventL(ETrue)
3.HandleForegroundEventL(EFalse)
4.DoDeactivate()

其中一对HandleForegrounEventL在view被激活的过程中会发生多次调用。

而DoActivateL()在DoDeactivate()被调用前可能会被多次调用。

View Resources
如果你要使用view来显示pages,那唯一的途径是创建出自己的AVKON_VIEW资源,里面有自己的CBA和菜单,把这个资源的id传递给view的BaseContructL()函数即可。

RESOURCE AVKON_VIEW r_viewapp_view1
{
hotkeys = r_viewapp_hotkeys;
menubar = r_viewapp_view1_menubar;
cba = R_AVKON_SOFTKEYS_OPTIONS_BACK;
}
注意如果没有给定的menubar资源,那就会使用确省的系统menubar

Construction
下面这个例程是用的AppUI object's ConstructL来构造出view的,使用了AddView来登记,最后把第一个创建的view做为缺省的view了:

void CMyViewArchAppUi::ConstructL()
{
BaseConstructL();

CMyViewArchAppView1* view1 = new(ELeave) CMyViewArchAppView1;
CleanupStack::PushL(view1);
view1->ConstructL();
AddViewL(view1); //Add view1 to CAknAppUi; transfers ownership
CleanupStack::Pop();

CMyViewArchAppView2* view2 = new(ELeave) CMyViewArchAppView2;
AddViewL(View2); // transfer ownership to CAknAppUi
CleanupStack::Pop();

CMyViewArchAppView3* view3 = new(ELeave) CMyViewArchAppView3;
AddViewL(View2); // transfer ownership to CAknAppUi
CleanupStack::Pop();

SetDefaultViewL(*view1);

.......(more code)

要让view发挥作用(注意,一个view自身是没有绘图能力的),它必须拥有得到一个从CCoeControl派生的containers,譬如
class CMyViewArchAppView1Container: public CCoeControl, MCoeControlObserver

下面这个例程将展现编程者自己的CAknView派生类
class CMyViewArchAppView1: public CAknVIew
{
.....
private:
CMyViewArchAppView1Container* iVIew;
}

大家可以看出App里产生了View,View类中有我们必须的Container.
 
当前激活的view在HandleCommandL()处理命令,这些是自定义功能键和菜单所生成的命令。

void CMyAppView1::HandleCommandL(TInt aCommand)
{
switch (aCommand)
{
case EMyAppCmdSwitchView:
AppUi()->ActivateLocalViewL(KView2Id);
break;
case EAknSoftKeyOk:
{
......
break;
}
case EAknSoftKeyBack:
{
((MEikCommandObserver*)AppUi())->ProcessCommandL(EEikCmdExit);
break;
}
default:
AppUi()->HandleCommandL(aCommand);
break;
}
}

Local View Switching
如果你要切换view,你得提供view的UID
//Now switch the view to view2
iAvkonViewAppUi->ActivateLocalViewL(TUid::Uid(2));
事实上,每个view都有自己的菜单系统,如果你要使用它,应当在AVKON_VIEW资源结构中设置,前面已经讲过了。

而且不管怎么说,如果要使用系统菜单,它的内容在切换之前是一定要更新一次的。
//Switch to a new menu system for the new view
iEikonEnv->AppUiFactory()->MenuBar()->SetMenuTitleResourceId(R_MY_VIEW_ARCH_APP_VIEW2_MENU);
//Now swtich the view to view2

如果要进行远程的视图切换,那就要调用CCoeAppUi::ActivateViewL()函数,并传递了一个包含目标应用程序UID和目标视图UID的TVwsViewId

Leave recovery
Avkon视图体系结构在DoActivateL()退出时会有个自动的回复机制。系统会调用DoDeactivate()在当前view离去时,回复前一个view,并把用户带到之前他们所在的地方。如果程序并没有前一个view的存在,那它就会退出,如果程序前个view就是当前的view(也就是说他们是重激活的),则应用程序会试图恢复缺省的view.
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
iOS 获取当前正在显示的ViewController
IOS面试宝典
【新提醒】求view同域迁移脚本或者方法
集中维护多表数据(转自sap屠夫)
Android 中 更新视图的函数ondraw() 和dispatchdraw()的区别
四个主要的应用软件框架类
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服