Symbian学习笔记(11):初识SettingItemList

来源:互联网 发布:真人cs好玩吗 知乎 编辑:程序博客网 时间:2024/05/19 20:43
在BREW中要做一个配置窗口是非常麻烦的事情,而S60的配置列表却相当方便。尤其是利用资源文件来构造配置页,在RSS中写的东西有点复杂但是代码却简化了不少。

先看简单的代码,需要自己构造一个SettingItemList类派生于CAknSettingItemList即可:

class CUniNewsSettingItemList: public CAknSettingItemList
{
public:
        
void ConstructL();
        CAknSettingItem
* CreateSettingItemL( TInt aIdentifier );

public:
        TBool     iDown;
        TTime    iTime;
}
;

其中,iDown和iTime是两个需要配置的内容(这个例子中我需要在配置页让用户选择“是否自动下载”以确定“自动下载的时间”。)

然后在实现代码中这样:
void CUniNewsSettingItemList::ConstructL()
{
    CAknSettingItemList::ConstructFromResourceL( R_CFG_ITEM_LIST );
}

CAknSettingItem
* CUniNewsSettingItemList::CreateSettingItemL(TInt aIdentifier)
{
    CAknSettingItem
* settingItem = NULL;

        
switch (aIdentifier)
            
{
            
case EMySettingItemBinary:
                settingItem 
=
                    
new (ELeave) CAknBinaryPopupSettingItem(
                            aIdentifier, iDown);
                
break;
            
case EMySettingItemTime:
                settingItem 
=
                    
new (ELeave) CAknTimeOrDateSettingItem(
                            aIdentifier,CAknTimeOrDateSettingItem::ETime,iTime);
                
break;
            }


        
return settingItem;
}

在ConstructL中简单地调用基类的函数从资源中生成配置页,而在CreateSettingItemL函数里根据aIdentifier去资源文件中读取相应的描述来生成配置项。
创建一个BOOL配置项可用CAknBinaryPopupSettingItem,它在构造函数第二个参数就是iDown成员,这样关联一下就把这个配置项与成员iDown关联上了,同理,创建一个

CAknTimeOrDateSettingItem实例,与iTime成员关联上。相关的配置项有很多,在SDK中可以找到它们的说明:API Reference Guide/C++API Reference/UI Framework/Setting Pages API。

代码差不多就这样了,使用与普通的ListBox没什么两样,只需要在保存和加载时注意一下即可。

在显示配置页时,记得先iListBox->LoadSettingsL()一下就让iListBox从成员变量中加载数据,而在保存时也同样iListBox->StoreSettingsL()让成员变量从配置页中得到配置结果。

现在来看看RSS中的描述,相对于代码来说,这稍有点复杂了。
RESOURCE AVKON_VIEW r_view_cfg
{
    cba 
= R_AVKON_SOFTKEYS_DONE_CANCEL;
}
RESOURCE AVKON_SETTING_ITEM_LIST r_cfg_item_list
{
    flags 
= EAknSettingItemNumberedStyle;
    title 
= qtn_cfg_title;
    initial_number 
= 1;
    items 
=
        {
            AVKON_SETTING_ITEM
                    {
                        identifier 
= EMySettingItemBinary;
                        setting_page_resource 
= r_binary_setting_page;
                        associated_resource 
= r_popup_setting_binary_texts;
                        name 
= qtn_cfg_autodown;
                    }
,
            AVKON_SETTING_ITEM
                    {
                        identifier 
= EMySettingItemTime;
                        setting_page_resource 
= r_time_setting_page;
                        name 
= qtn_cfg_autotime;
                    }
        };
}
RESOURCE AVKON_SETTING_PAGE r_binary_setting_page
{  
    number 
= 1;
    label 
= qtn_cfg_autodown;
    type 
= EAknCtPopupSettingList;
    editor_resource_id 
= r_binary_popup_setting_list;
}
RESOURCE AVKON_POPUP_SETTING_TEXTS r_popup_setting_binary_texts
{
    flags 
= 0;
    setting_texts_resource 
= r_on_off_texts;
    popped_up_texts_resource 
= r_popped_up_on_off_texts;
}
RESOURCE ARRAY r_on_off_texts
{
    items 
=
        {
        AVKON_ENUMERATED_TEXT { value 
= 1; text = qtn_cfg_autodown_on; },
        AVKON_ENUMERATED_TEXT { value 
= 0; text = qtn_cfg_autodown_off; }
        };
}
RESOURCE ARRAY r_popped_up_on_off_texts
{
    items 
=
        {
        LBUF { txt 
= qtn_cfg_autodown_on; },
        LBUF { txt 
= qtn_cfg_autodown_off; }
        };
}
RESOURCE POPUP_SETTING_LIST r_binary_popup_setting_list
{
    flags
= 0;
}
RESOURCE AVKON_SETTING_PAGE r_time_setting_page
    {
    number 
= 2;
    label 
= qtn_cfg_autotime;
    type 
= EEikCtTimeEditor;
    editor_resource_id 
= r_settinglist_time_editor;
    }

RESOURCE TIME_EDITOR r_settinglist_time_editor
    {
    minTime 
= TIME
        {
        second 
= 0;
        minute 
= 0;
        hour 
= 0;
        };
    maxTime 
= TIME
        {
        second 
= 59;
        minute 
= 59;
        hour 
= 23;
        };
    }

我也是按网上找到的资料来改写的。虽然看上去有点多,不过看明白了其实还是相当有规律的,应该比在代码中写大堆的东西要简便一点。
其实也可以完全在代码中动态生成配置页而不依靠资源文件中的描述。但是那样做太复杂了,我以后再去研究吧。
原创粉丝点击