原来一直是在写台,前台UI操作比较少,这次很多工作是在前台UI的操作,做为底端MTK的行业应用,UI的使用也比较简单,主要是使用列表的category,单行输入框。比较常用的是以下
ShowCategory151Screen:这个我用于显示平台返回的数据内容
ShowCategory171Screen:有带标题的单行输入框
ShowCategory174Screen:用于做菜单列表
总结:在做界面时,一定要把菜单流程或说界面流程理清楚来,我在做完后使用freemind把结构图画出来了。如下:
关于在写程序时,要注意的是,在写界面操作时命名为:
Entry_XXX_Screen 还有一个是Entry_XXX_ScreenPre,还有就是XXXX_LeftOk,XXXX_RigthOK
在进入一个界面时,要写Pre的进入界面前的预处理,特别是输入框的界面,因为有关返回时,一些数值要保存,history_buffer一定要处理要,在MTK中很多要使用全局变量的,全局变量的初始化,清空操作放在Pre中,这样返回时才不会出错。
//全局变量定义区 char g_szInputBuffer[MAX_INPUT_LEN]={0}; char g_szTitleBuffer[MAX_TITLE_LEN]={0}; //函数定义区 void Entry_XXX_Input_Screen(void); void Entry_XXX_Input_Screen(void); void Entry_Account_Secrect_Input_Screen_pre(void) { //其它操作 memset(g_szInputBuffer, 0x00, sizeof(g_szInputBuffer)); Entry_XXX_Input_Screen(); } // void Entry_XXX_Input_Screen(void) { U8 *guiBufferPointer; TextToUC2StrEx(g_szTitleBuffer, (U8 *)"输入框"); //注意这里把界面添加到历史了 EntryNewScreen(SCRN_ID_XXX_SECRET_INPUT, NULL, Entry_XXX_Input_Screen, NULL); entry_full_screen(); clear_screen(); guiBufferPointer = GetCurrGuiBuffer(SCRN_ID_XXX_SECRET_INPUT); ShowCategory171Screen( (PU8) GetString(STR_GLOBAL_OK), (PU8) GetImage(IMG_GLOBAL_OK), (PU8) GetString(STR_GLOBAL_BACK), (PU8) GetImage(IMG_GLOBAL_BACK), g_szTitleBuffer, NULL, INPUT_TYPE_SAT_NUMERIC_PASSWORD, g_szInputBuffer, XXX_LEN, guiBufferPointer); SetLeftSoftkeyFunction(Entry_Account_Trans_Show_Screen_pre, KEY_EVENT_UP); SetCategory171RightSoftkeyFunction(GoBackHistory, KEY_EVENT_UP); }
只有规化好输入框的流程的,还有每个输入框的值操作,这样在使用中就不会出现返回时各种异常情况的发生。关于返回时除了返回一级外,还可以返回多级,在写代码前,想清楚,画出来,这样菜单操作时就不会乱了。这是这次项目的经验。
在界面操作上,我碰到了,返回时数据是为空,把数据记数值没有清空,还有菜单层级跳错,因为是gobackhistory,不是自己操作,而是使用MTK的历史机制,所以有些问题很怪。
还有一点记录一下:mtk中的列表很多最大是不超过90个,所以要使用短信或电话本中的列表菜单那样,
static pBOOL ps_fail_list_get_item(S32 item_index, UI_string_type str_buff, PU8 *img_buff_p, U8 str_img_mask) { UCS2Strcpy((S8*) str_buff, (S8*)g_szDetailMenuList[item_index]); *img_buff_p = NULL;//get_image(IMG_MESSAGE_UNREAD); return TRUE; } for(i=0;i<100i++) { sprintf(g_szDetailMenuList[i],"%s",i); } ShowCategory184Screen( STR_PAYSUM_LIST, 0, STR_GLOBAL_OK, 0, STR_GLOBAL_BACK, 0, i, ps_fail_list_get_item, 0, 0, guiBufferPointer);
使用这个列表,它的本质是分块加载列表,我跟了一下代码是32个,这样大数据时也会不太慢。
这次还把自己写的代码改了一个地方,是让打印能支持回调,这样要打印的数据再大也可以打印出来,每次打印1K的数据。
随便说一下,在河北的,如果在一些麦当劳或一些消费场所,可以使用积分换物品,那商户使用的设备中的程序是我写的,哈哈。如果在福州能看到自己做的东西在使用,那是一件很开心的事。
这次外面使用完后,反馈在连续操作后终端会死机,查看log原来是MTK的历史超过30个,自己在做的过程想到这个问题,当时使用的函数是DeleteScreenIfPresent,但这个函数是删除历史列表其中一个历史,应该使用
GoBackToHistory,这个函数在返回指定ID的历史,同时也会把这段区间中的历史清掉。
关于历史的初始化函数是DinitHistory。