【转】对话框之 查询

本文介绍了S60平台上的应用程序如何使用不同类型的查询与用户交互,包括确认查询、数据查询、列表查询及多选列表查询的具体实现方法,并简要提及了全局查询的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文: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 应用程序开发》。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值