Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

Смена View в приложении с использованием CAknViewAppUi и CAknView

From Wiki
Jump to: navigation, search
Article Metadata

Пример кода
Исходный файл: Media:ViewSwitchingCAknViewAppUi.zip

Статья
Автор: vogdb (18 Dec 2008)
Последнее редактирование: hamishwillee (10 Nov 2011)

Цель данной статьи дать небольшое пояснение к ViewSwitchingCAknViewAppUi.zip, далее называемый Пример. В примере показано как можно реализовать переключение между различными View унаследованными от CCoeControl с использованием CAknViewAppUi и CAknView.

Использование CAknViewAppUi и CAknView подразумевает, что архитектура вашего приложения будет являться примерно следующей: S60Architecture.png


CAknViewAppUi - UI контролер. В Примере это CTestAppUi. Его основные функции таковы:

  - Создание View контролеров, что наследуются от CAknView.
  - Обработка event'ов и команд меню, что не обрабатываются View контролерами.
  - Переключение между View'ами.

CAknView - View контролер. В Примере CTestViewMain, CTestViewAdd, CTestViewEdit:

  - Создание одного или несколько View.
  - Обработка event'ов и команд меню, им зарегистрированных.

View унаследованный от CCoeControl. В Примере CMainContainer,CAddContainer,CEditContainer:

  - собственно он показывает данные приложения на экране.

Также для корректной работы нам понадобится изменить основной rss файл нашего приложения, Test.rss, и для удобства изменить Test.hrh.


Итак, обо всем по порядку.

1. Изменяем rss файл. Так как у нас теперь три View, то нам понадобится три AVKON_VIEW, по одному на каждый.

Вот так будет выглядеть описание меню для CTestViewMain.

//////////////Main View//////////////////
RESOURCE AVKON_VIEW r_test_view_main{
menubar = r_test_menubar_main;
cba = R_AVKON_SOFTKEYS_OPTIONS_BACK;
}
 
RESOURCE MENU_BAR r_test_menubar_main{
titles=
{
MENU_TITLE {menu_pane=r_test_menu_main;}
};
}
 
RESOURCE MENU_PANE r_test_menu_main{
items =
{
MENU_ITEM {
command=ETestMainAddCmd;
txt=qtn_command_main_add;
},
MENU_ITEM {
command=ETestMainEditCmd;
txt=qtn_command_main_edit;
},
MENU_ITEM {
command=EAknSoftkeyExit;
txt=qtn_exit;
}
};
}

Для остальных View контролеров создание меню происходит аналогично.

2. Создаем в Test.hrh файле enum, что будет содержать Id для каждого отдельного View. По этим Id позже будет происходить переключение между View.

enum TTestViewId
{
EMainView = 0x7001,
EAddView,
EEditView
};


3. Создаем собственный UI контролер CTestAppUi : public CAknViewAppUi. Его особенностью будет метод ConstructL(), в котором будут создаваться View контролеры:

void CTestAppUi::ConstructL(){
 
BaseConstructL();
 
CTestViewMain* view_main = new (ELeave) CTestViewMain;
view_main->ConstructL();
AddViewL( view_main );
iViewId1 = view_main->Id();
 
.............
 
SetDefaultViewL( *view_main );
 
}

4. Создаем View контролеры. Рассмотрим на примере CTestViewMain : public CAknView. Особенностями создания являются:

void CTestViewMain::ConstructL(){
BaseConstructL(R_TEST_VIEW_MAIN);// тот самый AVKON_VIEW, что мы определили в Test.rss
}
 
TUid CTestViewMain::Id() const{
return TUid::Uid(EMainView);// тот самый Id, что мы определили в Test.hrh
}
 
void CTestViewMain::HandleCommandL(TInt aCommand){
switch( aCommand ){
case ETestMainAddCmd:
iEikonEnv->InfoMsg(R_TEST_MAIN_ADD);
AppUi()->ActivateLocalViewL(TUid::Uid(EAddView));// переключение в CTestViewAdd
break;
case ETestMainEditCmd:
iEikonEnv->InfoMsg(R_TEST_MAIN_EDIT);
AppUi()->ActivateLocalViewL(TUid::Uid(EEditView));// переключение в CTestViewEdit
break;
case EAknSoftkeyExit:
case EAknSoftkeyBack:
default:
AppUi()->HandleCommandL(aCommand);// оставляем обработку незнакомых нам команд на совесть CTestAppUi
break;
 
}
}
 
/*
Здесь происходит переключение на один из View, подконтрольных данному View контролеру.
Но поскольку в моем примере каждый View контролер имеет только один View, то
параметры переключения(Id другого View и прочие) мне не нужны.
Здесь же сразу происходит создание требуемого View, если он еще не создан.
*/

void CTestViewMain::DoActivateL( const TVwsViewId& /*aPrevViewId*/,TUid /*aCustomMessageId*/,
const TDesC8& /*aCustomMessage*/){
if(!iContainer){
iContainer = CMainContainer::NewL( ClientRect() ) ;
iContainer->SetMopParent(this);
AppUi()->AddToStackL( *this, iContainer );
}
 
}

5. Создаем View. Тут ничего особенного, все также как и в архитектуре с CAknAppUi. Также наследуем от CCoeControl и реализуем все те же методы, что и в традиционной UI архитектуре.

6. Вроде все. Выложенное здесь приложение тестировалось лишь на WINSCW эмуляторе для S60 3rd Edition. При написании активно использовалась C++ Developer's Library 1.4 и собственный код, основанный на коде пользователя A.A.M.

This page was last modified on 10 November 2011, at 03:18.
188 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×