原文:http://hi.baidu.com/richiechyi/blog/item/8eddf55c44687a47faf2c028.html
Series60应用程序使用各种查询向用户提问,用户的回答将决定应用程序如何继续。查询的响应可能需要用户输入一些数据、从一个列表中选择一个或多个项、或是简单地确认某个操作。查询的基本类型包含确认查询、数据查询、列表查询和全局查询。
关于数据查询的类型见下图:
关于全局查询的类型见下图:
确认查询 / 数据查询
两者处理方式相似,这里仅以数据查询示例
1. 在资源中定义数据查询
RESOURCE DIALOG r_dataquery_confirmation_query
{
flags=EGeneralQueryFlags
;
buttons = R_AVKON_SOFTKEYS_YES_NO;
items =
{
DLG_LINE
{
type = EAknCtQuery;
id = EDataQueryDlgCIdConfirmationQuery;
control = AVKON_CONFIRMATION_QUERY
{
layout = EConfirmationQueryLayout;
label = SAVE_GAME_TEXT;
};
}
};
}
2. 构建和执行数据查询
CAknQueryDialog
* saveGameQuery = CAknQueryDialog::NewL();
if (saveGameQuery->ExecuteLD(R_DATAQUERY_CONFIRMATION_QUERY))
{
TBuf<KMaxGameNameLength> gameName;
CAknTextQueryDialog
* gameNameQuery = CAknTextQueryDialog::NewL(gameName);
CleanupStack::PushL(gameNameQuery);
HBufC* prompt;
prompt = StringLoader::LoadLC(R_DATA_QUERY_PROMPT); // Pushes prompt onto the Cleanup Stack.
gameNameQuery->SetPromptL
(*prompt);
CleanupStack::PopAndDestroy(prompt);
CleanupStack::Pop(gameNameQuery);
if (gameNameQuery->ExecuteLD
(R_DATAQUERY_DATA_QUERY))
{
SaveGameToFileL(gameName);
}
}
列表查询
列表查询包含一个菜单列表,用户可以从中选择一个或多个项。列表中的项可以包含一行或两行文本,带有或不带有图标、标题。和所有列表类似,各个项的内容必须为相同的类型。
1. 列表查询的资源定义
用于列表查询的资源类型为AVKON_QUERY资源。此资源应含有单个对话框行AVKON_LIST_QUERY_DLG_LINE,其中包含一个
AVKON_LIST_QUERY_CONTROL。控件需要定义listtype字段,说明查询所包含列表的类型;listbox引用一个
AVKON_LIST_QUERY_LIST资源结构中指定的array_id可以引用另外一个由表示列表项的静态字符串组成的数组资源,当然也可以设置
为空,动态地定义列表项(本例)。
RESOURCE AVKON_LIST_QUERY r_listquery_list_query
{
items =
{
AVKON_LIST_QUERY_DLG_LINE
{
control = AVKON_LIST_QUERY_CONTROL
{
listtype = EAknCtSinglePopupMenuListBox;
heading = SELECT_GAME_TEXT;
listbox = AVKON_LIST_QUERY_LIST
{
// array of items will be defined dynamically
};
};
}
};
}
2. 创建和执行列表查询
动态加载列表项,需要事先构建列表项数组,然后调用SetItemTextArray()加载。
iListQueryItemArray = new (ELeave) CDesCArrayFlat(KMaxSavedGames);
_LIT (KStringHeader, "Saved Game %d");
TBuf <16> aString;
for (TInt i = 1; i<= KMaxSavedGames; i++)
{
aString.Format(KStringHeader(), i);
iListQueryItemArray->AppendL (aString);
}
创建和执行过程如下:
CAknQueryDialog* saveGameQuery = CAknQueryDialog::NewL();
if (saveGameQuery->ExecuteLD(R_LISTQUERY_CONFIRMATION_QUERY))
{
TInt index(0); // the index of the selected item
CAknListQueryDialog* query = new (ELeave) CAknListQueryDialog(&index);
query->PrepareLC(R_LISTQUERY_LIST_QUERY);
query->SetItemTextArray(iListQueryItemArray);
// keep ownership of the item array. Only call this after setting the item array!
query->SetOwnershipType (ELbmDoesNotOwnItemArray);
if (query->RunLD())
{
// use the name of the currently selected item as the file name.
SaveGameToFileL((*iListQueryItemArray)[index]);
}
}
对于多选列表查询
,创建方法和列表查询相似,但是有以下区别:
* 在AVKON_LIST_QUERY中,使用AVKON_MULTISELECTION_LIST_QUERY_DLG_LINE,而不是AVKON_LIST_QUERY_DLG_LINE。
* 把AVKON_LIST_QUERY_LIST中的listbox设置为AVKON_MULTISELECTION_LIST_QUERY_LIST。
* 列表项需要包含一个图标索引,用来引用复选框,例如"1/tMy Item"。列表类自动提供了用作复选框的位图,所以和多选列表不同,不需要把它们添加到列表的图标数组。
* 构建多选列表查询时,应传入一个TInt数组(CSelectionIndexArray)。查询关闭时,该数组将包含选择项的索引。
全局查询 总会获取焦点,即使拥有它的应用程序正在 后台运行。用户在关闭全局查询之前,无法切换到其他任务,因此应谨慎地使用全局查询。全局查询的功能同时依赖于通知框架和活动对象机制。为了产生全局查 询,必须构建一个活动对象来处理对话框的关闭。关于全局查询这里不再详述,可参考《Series 60 应用程序开发》。