精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

jQuery Mobile設計Android通訊錄(第一章)

移動開發 移動應用 Android
本系列教程將指導大家一步步使用jQuery Mobile設計一個Android的通訊錄應用。其中在應用的界面部分,將使用jQuery Mobile框架,并且會指導大家如何使Android中提供的webview瀏覽器容器控件中的javaScript去訪問后端Java應用程序,以及后端JAVA應用如何去訪問前端的JavaScript和HTML。

本文假設讀者已對jQuery Mobile有一定的初步認識,同時也初步了解Android的一些基本用法。

本教程的結構

本系列教程安排如下。在***部分中,我們將介紹在應用程序中的運行界面截圖,說明整個應用的流程走向及結構,并說明一些如何在Android的Webview控件中通過Javascript與后端的JAVA應用程序交互的一些技巧和知識點,其中會介紹jQuery Mobile中的各種重要頁面元素。在本系列的第二部分中,將介紹如何在通訊錄應用中新增加、編輯和刪除帳號。在本系列的第三部分中,將介紹如何增加通訊錄,其中會介紹用到一個工具類。在第四部分,將重點介紹如何使用Jackson JSON處理庫去將JAVA對象和JSON對象之間進行轉換,并介紹了項目整個工程如何配置,如何根據Android的圖標設計***實踐去設計圖標,***總結全系列的教程。

頁面流程結構

下面來講解應用的頁面流程結構。在這個應用中,每個通訊錄都與帳號相關聯的,也就是說,每個帳號的用戶中可以建立多個通訊錄,就象gmail一樣。當Android應用啟動后,會檢查應用中是否已經建立了帳號,如果是***次啟動,是不存在帳號的,那么會提示用戶新建立一個帳號,如下圖所示:

使用Jquery Mobile設計Android通訊錄

一旦建立了帳號后,就可以進入通訊錄的初始頁面了,如下圖:

就可以進入通訊錄的初始頁面了

可以看到,上圖是按字母順序對通訊錄排序。當用戶點“Add”按鈕時,則會顯示讓用戶輸入具體的通訊錄的頁面,如下邊左邊***張圖所示

而在通訊錄列表中

而在通訊錄列表中,用戶可以點選某一個已存在的聯系人的信息進行查看,查看的實際效果圖如上圖的第二張圖所示,這里用戶可以對信息進行編輯修改,再保存,保存后會回到

通訊錄列表的界面。同時,用戶如果點“delete”按鈕,會顯示出如下圖的界面,詢問用戶是否真正要刪除該用戶的聯系信息。

使用Jquery Mobile設計Android通訊錄

而在整個應用程序中,由于考慮到要處理的記錄數量會大,以及移動設備的處理能力,一個友好的做法是在處理數據時,添加一個表示當前進度的進度的圖標,如下圖:

使用Jquery Mobile設計Android通訊錄

總結一下,整個應用的實際流程如下圖所示:

使用Jquery Mobile設計Android通訊錄#p#

jQuery Mobile 頁面設計

現在我們來看下如何使用jQuery Mobile框架去設計頁面元素。在jQuery Mobile框架設計的HTML頁中,通常是一個頁面中有一個頁面容器,而頁面容器中則存在多個頁面。頁面容器以date-role=“page”作標識,而普通頁面以date-role=“content”作標識。在一個頁面中,頁面頭部和尾部是可選的部分。在我們的這個應用中,有兩個頁面是都有頭部和尾部的,一個頁面沒有頭部和尾部,下面看示例代碼:

  1. <div data-role="page"> 
  2.  
  3.   <div data-role="header">...</div> 
  4.   <div id="contentWithHeaderAndFooter1" data-role="content">...</div> 
  5.   <div data-role="footer">...</div> 
  6.  
  7.   <div data-role="header">...</div> 
  8.   <div id="contentWithHeaderAndFooter2" data-role="content">...</div> 
  9.   <div data-role="footer">...</div> 
  10.  
  11.   <div id="contentWithNoHeaderAndFooter" data-role="content">...</div> 
  12. </div> 

在上面的代碼中,展示了如何在一個容器頁面中包含了三個頁面,其中有2個頁面是有頁頭和頁腳的,分別用data-role="header"和data-role="footer"標識。

在本應用中,創建帳號、通訊錄列表和進度圖標都是以內容頁的形式出現,而在ListPage.html中將會有一個頁面容器包裹著它們,而DetailPage.html中也有一個頁面容器,其中包含三個頁面,分別是“空的通訊錄”,“已經存在的通訊錄”和“提示是否刪除通訊錄”,下圖表示了它們之間的結構關系:

使用Jquery Mobile設計Android通訊錄

如何整合前端代碼和Android后端Java代碼

在本篇教程中,我們將重點學習如何在jQuery Mobile設計的前端頁面HTML/JAVASCRPT中,去訪問Android中后端的Java應用程序,以及它們之間如何互相交互。要知道,jQuery Mobile只是幫助開發者用自己熟悉的HTML/Javascript等知識去開發出統一界面,能在不同平臺上運行的應用,但它并沒有跟Android整合的機制,因此我們分三個部分去講解如何:

1. 通過Javascript去訪問Android的Java代碼

2. Android Java應用訪問前端Javascript/HTML代碼

3. 在前后端交互中參數的類型問題

通過Javascript去訪問Android的Java代碼

首先來學習如何通過Javascript去訪問Android的Java代碼。Android提供了一個方法,可以供JavaScript 去訪問Java應用,這個方法是位于android.webkit.WebView類中的addJavascriptInterface(Object object, String interfaceName) 方法。這個方法允許從JavaScript代碼去訪問在WebView中運行的Java類中的public方法。要注意的是,WebView其實也是android.view.View中的一種。WebView是Android中顯示HTML頁面和JavaScript的瀏覽器。其中,addJavascriptInterface方法中的obj為和javascript通信的應用程序,interfacename為提供給JavaScript調用的名稱,下面這個圖,清楚地顯示了兩者之間的調用關系:

使用Jquery Mobile設計Android通訊錄

下面這段代碼,顯示了ContactsActivity 這個類的實例,如何通過addJavascriptInterface方法,對外暴露為一個Javascript對象,對外的接口名稱為“contactSupport”。其中ContactsActivity中有很多public方法,它向外暴露了其中的deleteContact()方法,

  1. import android.webkit.WebView; 
  2. import android.app.Activity; 
  3. ... 
  4. public class ContactsActivity extends Activity { 
  5.   WebView webView; 
  6.   ... 
  7.   public void onCreate(Bundle savedInstanceState) { 
  8.     ... 
  9.     webView = new WebView(this); 
  10.     ... 
  11.     webView.addJavascriptInterface(this, "contactSupport"); 
  12.     ... 
  13.   } 
  14.   public void  deleteContact(String contactId, String displayPage){ 
  15.     ... 
  16.   } 

下面的Javascript代碼則顯示了如何訪問后端Java代碼ContactsActivity 對象實例中的deleteContact方法

  1. <script> 
  2.   ... 
  3.   function someJavaScriptFunction(){ 
  4.     .. 
  5.     contactSupport.deleteContact(contactIdVar.val(),'ListPage.html'); 
  6.   } 
  7.   ... 
  8. </script> 

Android Java代碼如何訪問前端Javascript代碼

在本應用中,我們使用WebView類中的loadUrl(String url)方法去實現兩個目的:

(1)在Webview瀏覽器中加載HTML頁 (2) 在WebView中加載HTML時,可以一道加載其中的Javascript。我們要注意如下兩點:

◆在同一個容器頁面中,不同內容頁之間的跳轉,都使用Javascript代碼。

◆Transition from one container page to another is performed by Java code usingWebView.loadUrl(String url). The container page to display is passed to Java code from JavaScript as a callback parameter.

在不同的容器中的互相調用,需要在WebView的Java應用程序中,通過使用

WebView.loadUrl(String url)去加載,下面這個圖講解了Java后端代碼如何訪問前端Javascript代碼的步驟:

用戶首先訪問HTML網頁,這時調用Javascipt顯示頁面

◆用戶首先訪問HTML網頁,這時調用Javascipt顯示頁面

◆接著,Javascript進行一些數據的處理,并調用后端的Java代碼。

◆在Java代碼處理完后,會通過loadurl的方法,回調前端的Javascript代碼或者加載HTML頁。

下面的代碼,講解了前端的Javascript 代碼調用了后段的delteContact()方法后,刪除了數據庫中的記錄,然后會重新加載一個HTML頁進行顯示。

  1. import android.webkit.WebView; 
  2. import android.app.Activity; 
  3. import android.os.Handler; 
  4. ... 
  5. public class ContactsActivity extends Activity { 
  6.   WebView webView; 
  7.   private Handler handler = null
  8.   ... 
  9.   public void onCreate(Bundle savedInstanceState) { 
  10.     ... 
  11.     webView = new WebView(this); 
  12.     ... 
  13.     handler = new Handler(); 
  14.     ... 
  15.   } 
  16.  
  17.   public void deleteContact(String contactId, String displayPage){ 
  18.     ContactUtility.deleteContact(contactId,...); 
  19.     loadPage(displayPage); 
  20.   }   
  21.  
  22.   public void loadPage(String in){ 
  23.     final String url = "file:///android_asset/www/" + in; 
  24.     loadURL(url); 
  25.   }   
  26.  
  27.   private void loadURL(final String in){ 
  28.     handler.post(new Runnable() { 
  29.       public void run() { 
  30.         webView.loadUrl(in); 
  31.       } 
  32.     }); 
  33.   } 

這里,我們用到了Android中的Handler消息處理機制。本文不打算詳細講解Handler機制的用法,詳細的請參考Android手冊。這里簡單提一下Handler消息處理機制,主要是在Android中,新啟動的線程是無法刷新或者訪問UI界面的,因此就要使用Handler機制。在這里,deleteContact()方法是無法直接調用 WebView.loadUrl()的,主要有兩個原因,一個是WebView實例是在onCreate方法中創建調用的,這是在主線程中;第二個原因是當Javascript去調用deleteContact()時,執行它的線程實際上是跟ContactsActivity中的onCreate()方法中的主線程是不同的。因此,我們不難理解下面的三個步驟:

在deleteContac()中,我們刪除了某條通訊錄記錄。

接下來,我們調用loadPage方法,這里我們指定了將要跳轉的顯示頁面,并在前面加了file:// android_asset/www/的前綴,意思是我們跳轉的這個頁面,實際上是存放在android_asset/www目錄下的。

Finally, we call the loadURL() method to have the Handler object call the WebView.***,我們在loadURL方法中使用Handler機制的post,在新開的線程中加在WebView的loadUrl方法,并將其發送到消息隊列中去。#p#

如何調用前端的JavaScript

現在看下如何在后端的Java代碼中,調用前端的Javascript,代碼如下:

  1. public class ContactsActivity extends Activity { 
  2.   ... 
  3.   public void   getAllContacts(String callback, String accountCallback){ 
  4.     final String accountCallbackFunction = "javascript:" + accountCallback + "()"; 
  5.  
  6.     if(accountName == null){ 
  7.       loadURL(accountCallbackFunction); 
  8.         return; 
  9.     } 
  10.  
  11.     final String json = ContactUtility.getAllContactDisplaysJSON(getContentResolver()); 
  12.     final String callbackFunction = "javascript:" + callback + "('" + json + "')"; 
  13.  
  14.     loadURL(callbackFunction); 
  15.   } 

在上面的代碼中,getAllContacts方法作用是產生JSON格式的通訊錄列表,其結果存放在json變量中。然后再把結果回調給前端的javascript方法去處理解析JSON格式。這里

的callbackFunction = "javascript:" + callback + "(" + json + ")",通過javascript:前端處理的JAVASCRIPT方法名+JSON格式結果集,返回給前端。***也是通過loadURL方法,則可以達到調用前端Javascipt處理的效果。下面看前端Javscript代碼部分:

  1. <script> 
  2.   $(document).ready(function () { 
  3.     ... 
  4.     contactSupport.getAllContacts('setContactsList','showAccount'); 
  5.   }); 
  6. </script> 

在上面的代碼中,調用了Java后端的getAllContacts方法,而getAllContacts方法獲得JSON格式的結果集后,會調用前端Javascript的setContactsList方法去處理(這個方法具體內容我們稍侯會介紹),而參數中的showAccount,則在后端的getAllContacts方法中,會判斷如果當前通訊錄沒有任何數據時,則會重新使用前端的showAccount這個JavaScript方法去處理。

在前后端交互中參數的類型問題

在這個應用中,我們在前后端的交互中,只是使用了字符串類型。而其他類型如Integer等都將被轉型為字符串。而象復合類型的對象都將以JSON的形式進行傳遞交互。在Java后端中,我們會使用Jackson JSON處理類庫對Java對象及JSON對象進行轉換,在Javascript方面,則采用jQuery.parseJSON()方法去解析后端返回的JSON,在接下來的教程中,將會具體講解。

程序入口介紹

在我們的應用中,ContactsActivity 是程序的主類,代碼如下:

  1. public class ContactsActivity extends Activity { 
  2.   WebView webView; 
  3.   private Handler handler = null
  4.   private String accountType = null
  5.   private String accountName = null
  6.   ... 
  7.  
  8.   public void onCreate(Bundle savedInstanceState) { 
  9.       super.onCreate(savedInstanceState); 
  10.  
  11.       // 初始化WebView 
  12.       webView = new WebView(this); 
  13.  
  14.       setContentView(webView); 
  15.  
  16.       //允許使用Javscript 
  17.       webView.getSettings().setJavaScriptEnabled(true);       
  18.  
  19.       //檢查應用中的帳號是否已經建立 
  20.       accountType = "com.jquerymobile.demo.contact"
  21.       Account[] accounts = AccountManager.get(this).getAccountsByType(accountType); 
  22.       if(accounts.length != 0){ 
  23.         accountName = accounts[0].name; 
  24.       } 
  25.       handler = new Handler(); 
  26.  
  27.      
  28.       webView.addJavascriptInterface(this, "contactSupport");         
  29.  
  30.       // 裝載index.html頁 
  31.       loadPage("index.html"); 
  32.   } 
  33.   ... 

代碼中關鍵點講解如下:

◆首先初始化WebView并允許Webview使用Javascript。

◆由于在前面已經提到,通訊錄的使用必須關聯帳號,所以這里使用android.accounts.AccountManager類去檢查應用中是否已經存在帳號,如果存在的話,將帳號名稱賦值給變量accountName。

◆We initialize the handler field.接著使用handler機制,將ContactsActivity的對象實例和前端的Javascript綁定,交互的接口名稱為contactSupport。

index.html頁的代碼如下,其中,在jQuery的ready方法中,當加載頁面完畢后,就開始加載ListPage.html了。

ListPage.html

首先講解的是ListPage.html代碼,其中回憶下前文提到的結構圖,可以看到這個頁面容器包含了三個內容頁,分別是創建帳號,通訊錄列表和進度等待,代碼如下:

  1. <html> 
  2. <head> 
  3. <B><!-- jQuery Mobile Libraries --></B> 
  4.   <link rel="stylesheet" href="css-js/jquery.mobile-1.0a3.min.css" /> 
  5.   <script src="css-js/jquery-1.5.min.js"></script> 
  6.   <script src="css-js/jquery.mobile-1.0a3.min.js"></script> 
  7. </head> 
  8. <body> 
  9. <B><!-- Container Page --></B> 
  10. <div data-role="page" data-theme="c" id="containerPage"> 
  11.   <B><!-- Contact List --></B> 
  12.   <div data-role="header" id="hdrList" data-nobackbtn="true"> 
  13.     <h1><img align="top"  src="img/contacts.png"> Contacts</h1> 
  14.     <a id="buttonAddContact" data-icon="plus" class="ui-btn-right" 
  15.       href="<B>javascript:addContact();</B>return false;" data-role="button" data-inline="true">Add</a> 
  16.   </div> 
  17.   <div data-role="content" id="contentList" data-theme="c"> 
  18.     <ul data-role="listview" data-dividertheme="c" id="contactSelections"></ul> 
  19.   </div> 
  20.   <div data-role="footer" id="ftrList"></div> 
  21.  
  22.   <B><!--  Progress --></B> 
  23.   <div data-role="header" id="hdrProgress" data-nobackbtn="true"  data-theme="c"> 
  24.     <h1>Processing...</h1> 
  25.   </div> 
  26.   <div data-role="content" id="contentProgress"  data-theme="c"> 
  27.     <div align="CENTER"><h4>Please wait.</h4></div> 
  28.     <div align="CENTER"><img id="spin" src="img/wait.gif"/></div> 
  29.   </div> 
  30.   <div data-role="footer" id="ftrProgress"  data-theme="c"></div> 
  31.  
  32.   <B><!--  Create Account --></B> 
  33.   <div data-role="header" id="hdrAccount" data-nobackbtn="true"  data-theme="c"> 
  34.     <h1>Create Account</h1> 
  35.   </div> 
  36.   <div data-role="content" id="contentAccount"  data-theme="c"> 
  37.     <div align="CENTER"><img src="img/contacts-master-bgd.png"></div> 
  38.     <div align="CENTER"><h4>Please enter name of the new account for this application</h4></div> 
  39.     <div align="CENTER">Contacts created with this application will be associated with the new account specified below. 
  40.     Other contacts can be viewed, however, cannot be deleted or modified with this application.</div> 
  41.     <div align="CENTER" id="accountDiv" data-role="fieldcontain"> 
  42.       <input id="accountName" type="text" /> 
  43.     </div> 
  44.     <div align="CENTER"> 
  45.       <a href="javascript:createAccount();return false;" <B>data-role="button" 
  46.         data-inline="true"</B>>Save</a> 
  47.     </div> 
  48.     ... 
  49.   </div> 
  50.   <div data-role="footer" id="ftrAccount"  data-theme="c"></div> 
  51.  
  52. </div> <B><!-- Container Page Ends Here --></B> 
  53. ... 

#p#以上的代碼中,注意如下幾點

◆所有的三個內容頁都有頁頭,頁腳和內容區域。其中,每個部分都是用DIV層的方式去定義的,并且定義了data-theme=“c”,這個是使用了jQuery Mobile框架中預先定義好的顏色樣式,詳細的請參考jQuery Mobile手冊中的論述。

◆jQuery Mobile有預先定義好的返回按鈕,但我們將在應用程序中去定義,因此這里并不需要,所以設置data-nobackbtn=“true”。

◆在“Contact List”的內容頁中,有一個增加的按鈕,它是調用了addContact()方法,這個方法稍后會學習到。而id="contentList"的那個DIV中,實際上目前的內容是空的,在程序中,會動態把結果集填充到這里,另外請注意這里使用了jQuery Mobile中的listview樣式,表明這是一個列表的樣式。

◆注意在“Create Account”中的按鈕,其中用了data-incline=“true”,這表示按鈕的大小剛好是跟文字“Save”的大小相匹配的。

下面我們繼續分析ListPage.html。接下來,我們看下如何實現同一個時間之顯示頁面容器中的某個頁面,比如我們在新建帳號時,只希望顯示新建帳號的這個div。方法很簡單,在jQuery的ready()方法中,將初始化一些變量,以保存頁面容器中的頁面,這通過jQuery中的$("#...")選擇器就可以實現了。然后,在需要顯示某個層的地方,定義hidePage()和showPage()方法,在這些方法中分別調用層的hide和show方法,就可以實現了。下面是例子,部分雷同的代碼省略,詳細見代碼下載:

  1. <script> 
  2.   var hdrListVar; 
  3.   var contentListVar; 
  4.   var ftrListVar; 
  5.   var hdrProgressVar; 
  6.   var contentProgressVar; 
  7.   var ftrProgressVar; 
  8.   var hdrAccountVar; 
  9.   var contentAccountVar; 
  10.   var ftrAccountVar; 
  11.  
  12.   $(document).ready(function () { 
  13.     // Initialize commonly used variables 
  14.     hdrListVar = $('#hdrList'); 
  15.     contentListVar = $('#contentList'); 
  16.     ftrListVar = $('#ftrList'); 
  17.     hdrProgressVar = $('#hdrProgress'); 
  18.     contentProgressVar = $('#contentProgress'); 
  19.     ftrProgressVar = $('#ftrProgress'); 
  20.     hdrAccountVar = $('#hdrAccount'); 
  21.     contentAccountVar = $('#contentAccount'); 
  22.     ftrAccountVar = $('#ftrAccount'); 
  23.     ... 
  24.   }); 
  25.  
  26.   ... 
  27.   function hideList(){ 
  28.     hdrListVar.hide(); 
  29.     contentListVar.hide(); 
  30.     ftrListVar.hide(); 
  31.   } 
  32.  
  33.   function showList(){ 
  34.     hideProgress(); 
  35.     hideAccount(); 
  36.     hdrListVar.show(); 
  37.     contentListVar.show(); 
  38.     ftrListVar.show(); 
  39.   } 
  40.  
  41.   function hideProgress(){ 
  42.     hdrProgressVar.hide(); 
  43.     contentProgressVar.hide(); 
  44.     ftrProgressVar.hide(); 
  45.   }  
  46.  
  47.  
  48.   ... 
  49. </script> 

接下來,我們看下getAllContacts()方法,這個方法中,是獲得通訊錄列表,代碼如下:

  1. public void getAllContacts(String callback, String accountCallback){ 
  2.   final String accountCallbackFunction = "javascript:" + accountCallback + "()"; 
  3.  
  4.   if(accountName == null){ 
  5.     loadURL(accountCallbackFunction); 
  6.     return; 
  7.   } 
  8.   final String json = ContactUtility.getAllContactDisplaysJSON(getContentResolver()); 
  9.   final String callbackFunction = "javascript:" + callback + "('" + json + "')"; 
  10.   loadURL(callbackFunction); 

We had partially reviewed that code before. To recap:這段代碼之前已經提到,其中我們著重看getAllContactDisplaysJSON方法,它會把后端的結果集取出,轉變為JSON格式的字符串,然后回調到前端的Javascript中的方法去把JSON格式的數據重新整理。在我們的應用中,是按字母表順序把聯系人的姓名進行分組,下面我們來看其JSON格式的數據集,關于JSON本文不再詳細展開論述,請參考相關文檔。

  1. {"contacts":[ 
  2.   {"key":"A","values":[ 
  3.     {"contactId":"257","displayName":"Aach Herb","key":"A"}, 
  4.     ..., 
  5.     {"contactId":"256","displayName":"Aaker David","key":"A"} 
  6.     ] 
  7.   }, 
  8.   {"key":"B","values":[ 
  9.     {"contactId":"259","displayName":"Belanger Andre","key":"B"}, 
  10.     ..., 
  11.     {"contactId":"260","displayName":"Bohme Jacob","key":"B"} 
  12.     ] 
  13.   }, 
  14.   ... 
  15.   ] 

可以看到,其中按字母表順序進行了分組,key屬性代表的是字母,values的值是一個JSON格式的數組,包含的是每個字母下的聯系人的具體通訊錄。

接下來,我們看下前端頁面的Javascript如何解析后端傳送過來的JSON格式的字符串。代碼如下:

  1. <div data-role="content" id="contentList" data-theme="c"> 
  2.     <ul data-role="listview" data-dividertheme="c" id="contactSelections"></ul> 
  3.   </div> 
  4.   ... 
  5. <script> 
  6.   ... 
  7.   // Commonly used variables 
  8.   ... 
  9. var contactSelectionsVar; 
  10.  
  11.   $(document).ready(function () { 
  12.     // Initialize commonly used variables 
  13.     ... 
  14.    contactSelectionsVar = $('#contactSelections'); 
  15.     ... 
  16.   } 
  17.   ... 
  18.   function setContactsList(jsonText){ 
  19.     var tmpJson = $.parseJSON(jsonText); 
  20.     if(tmpJson != null && tmpJson.contacts != null){ 
  21.       var tmpContacts = tmpJson.contacts; 
  22.       for(i = 0; i < tmpContacts.length; i++){ 
  23.         var tmpKey = (tmpContacts[i]).key; 
  24.         var tmpKeyFragment = '<li data-role="list-divider">'+tmpKey+'</li>'; 
  25.         contactSelectionsVar.append(tmpKeyFragment); 
  26.         var tmpValues = (tmpContacts[i]).values; 
  27.         if(tmpValues != null){ 
  28.           var j; 
  29.           for(j = 0; j < tmpValues.length; j++){ 
  30.             var tmpDisplayName = tmpValues[j].displayName; 
  31.             var tmpContactId = tmpValues[j].contactId; 
  32.             var tmpLiFragment = '<li><a href="javascript:showContact(' + 
  33.               tmpContactId + ');return false;">'+tmpDisplayName+'</a></li>'; 
  34.             contactSelectionsVar.append(tmpLiFragment); 
  35.           } 
  36.         } 
  37.       } 
  38.     } 
  39.     contactSelectionsVar.listview('refresh'); 
  40.     showList(); 
  41.   } 
  42.   ... 
  43. </script> 

◆首先,利用了jQuery的parseJSON方法,去解析后端獲得的JSON格式代碼,解析后的賦值給tmpJson變量。

然后,使用var tmpContacts = tmpJson.contacts;一句,獲得了前文提到的JSON格式中的CONTACTS部分的內容,然后再使用一個FOR循環,在循環體內,每次通過

var tmpKey = (tmpContacts[i]).key,獲得的JSON字符串中的key部分(即每個字母),

◆然后將tmpKey變量與組合成變量tmpKeyFragment。其是jQuery Mobile中的列表項目分割符號。

◆.再將tmpKeyFragment變量,使用jQuery的append方法添加到contactSelectionsVar這個DIV區域中。

◆接下來的這步,是先讀取JSON字符串中的values屬性中的值,變量tmpValues存放的就是每個字母下的所有通訊錄聯系人列表,然后使用循環去讀取每個聯系人的contactId和displayName。

再把tmpDisplayName和 tmpContactId組合成tmpLiFragment變量,注意這里加入了一個鏈接",其目的是當用戶點這個聯系人的名稱時,會用javascript調出另外的顯示詳細信息的頁面。同樣,***我們將其添加到contactSelectionsVar這個div層中。

◆***,我們使用contactSelectionsVar.listview的refresh方法,更新列表。

下圖是該部分代碼跟實際效果的對應圖,可以清楚看到兩者間的結構:

使用Jquery Mobile設計Android通訊錄

小結

在本系列教程的***篇,我們介紹了將要設計的應用的概況,頁面結構和jQuery Mobile框架中頁面的一些元素知識,也介紹了Android中的后端JAVA程序如何跟前端的Javascript進行互相數據交互的基本知識。在下篇教程中,我們將學習如何新建立一個通訊錄的帳號,以及如何對通訊錄列表進行增刪改。

責任編輯:佚名 來源: IT168
相關推薦

2011-07-20 08:49:24

jQuery MobiAndroid

2011-07-20 10:27:18

jQuery Mobi手機新聞瀏覽器

2014-01-13 11:22:28

storm

2012-02-09 10:39:37

AndroidWeb App官方文檔

2015-12-30 09:25:47

編程故事printf

2011-09-05 14:08:21

微信Andriod安卓

2023-08-03 13:56:53

配置文件容器

2010-12-07 10:40:27

軟考系統架構設計師

2023-05-24 16:13:31

ChatGPT神經網絡

2013-10-15 14:18:31

2010-06-18 22:42:42

智能手機平臺Android網秦

2022-01-04 15:34:31

鴻蒙HarmonyOS應用

2011-09-16 14:05:42

Andrioid應用iPhone應用Symbian應用

2012-12-21 14:51:52

手機中國

2021-12-10 10:12:44

鴻蒙HarmonyOS應用

2012-02-09 09:10:44

Path通訊錄隱私

2017-09-06 14:51:21

Swift

2021-08-02 05:20:22

Android 12谷歌 Material Yo

2012-06-05 13:53:03

天天聯系華為

2013-03-18 10:19:27

安卓軟件手機通訊錄隱私信息
點贊
收藏

51CTO技術棧公眾號

亚洲欧美精品一区二区三区| 一区二区在线看| 91久久精品一区二区| 91在线观看欧美日韩| 欧美日韩高清丝袜| 亚洲七七久久综合桃花剧情介绍| 欧美日韩有码| 91在线porny国产在线看| 精品国产欧美成人夜夜嗨| 毛片av免费在线观看| 欧美视频在线观看一区二区三区| 日韩精品永久网址| 色琪琪一区二区三区亚洲区| 在线无限看免费粉色视频| 免费精品一区二区| 小说区图片区色综合区| 香蕉成人伊视频在线观看| 亚洲一区二区三区久久 | 日韩欧美在线观看免费| 久久免费视频66| 亚洲另类在线制服丝袜| 成人激情视频在线播放| 日日碰狠狠添天天爽| 欧美一级网址| 国产精品国产三级国产普通话蜜臀| 国产va免费精品高清在线观看 | 天堂精品久久久久| 亚洲激情五月婷婷| 日韩精品一区二区三区色偷偷| 午夜婷婷在线观看| 欧美另类视频| 亚洲国产精品va在线看黑人| 免费观看国产精品视频| 亚洲av成人精品日韩在线播放| 亚洲精品在线二区| 日韩精品在线免费观看视频| 久久婷婷国产精品| 高清日韩av电影| 久久精品国产网站| 不卡av电影院| 日本国产在线视频| 美脚恋feet久草欧美| 国产欧美一区二区精品秋霞影院 | 91九色综合| 国产精品久久久久一区| 亚洲一区二区三区四区在线播放 | 欧美一区二区三区在线观看视频| 大地资源网在线观看免费官网| 国产ts人妖调教重口男| 在线观看视频免费一区二区三区| 日韩的一区二区| 宅男噜噜噜66国产免费观看| 超碰免费在线播放| 不卡的看片网站| 国产精品wwww| 九九视频免费看| 亚洲传媒在线| 555www色欧美视频| 黄色www网站| 玖玖在线播放| 最新高清无码专区| 精品久久久久久一区| 中文字幕乱码视频| 国产综合色产| 伊人伊成久久人综合网小说| 久草福利在线观看| 美女18一级毛片一品久道久久综合| 亚洲a一区二区| 亚洲自偷自拍熟女另类| 米奇777四色精品人人爽| 成人激情视频网站| 精品视频第一区| 欧美女同网站| 国产福利一区二区| 国产精品99久久久久久人 | 极品人妻videosss人妻| 6080亚洲理论片在线观看| 91国内精品野花午夜精品 | 亚洲天堂日韩av| 日韩在线观看| 久久成人免费视频| 日韩av免费网址| 午夜影院欧美| 国产亚洲欧洲黄色| 黄色性生活一级片| av综合网页| 欧美少妇性性性| 青青草原av在线播放| 日韩av福利| 亚洲va中文字幕| 激情视频综合网| 周于希免费高清在线观看 | 日韩在线激情视频| 美女被到爽高潮视频| 国产精品99一区二区三区| 亚洲网站在线播放| 欧美国产日韩在线观看成人| 精品99在线| 麻豆乱码国产一区二区三区| 亚洲天堂一区在线观看| 国产在线不卡一卡二卡三卡四卡| 国产精品白嫩初高中害羞小美女| 91久久久久国产一区二区| 丝袜亚洲另类欧美综合| 欧美亚洲日本网站| 在线观看 中文字幕| 秋霞成人午夜伦在线观看| 欧美在线视频免费| 在线天堂中文字幕| 国产一区二区三区国产| 欧美日韩中文国产一区发布| 亚洲欧美综合一区二区| 亚洲欧洲一区二区三区| 久久精品国产精品亚洲色婷婷| 疯狂欧洲av久久成人av电影| 3atv一区二区三区| wwwwww日本| 精品久久视频| 性欧美xxxx视频在线观看| 国产一级aa大片毛片| 亚洲午夜视频| 成人黄色短视频在线观看| 久久这里精品| 婷婷中文字幕综合| 日韩精品无码一区二区三区免费| 日韩黄色av| 日韩视频免费观看| 青娱乐在线免费视频| 97精品久久久久中文字幕| 精品一区二区三区毛片| 九七影院97影院理论片久久 | ㊣最新国产の精品bt伙计久久| 狠狠爱免费视频| 国内精品偷拍| 亚洲人成毛片在线播放| 99在线视频免费| 妖精视频一区二区三区| 欧美高清视频免费观看| 国产精品不卡av| 久久久精品午夜少妇| 国产精品久久久久久久app| 亚洲aⅴ在线观看| 天天综合色天天综合| 日本一区二区在线观看视频| 欧美91视频| 97在线看福利| 日本韩国免费观看| 午夜久久福利影院| 日韩av无码一区二区三区不卡| 天海翼亚洲一区二区三区| 久久久免费av| 最近中文字幕免费观看| 国产成人自拍网| 99久久久无码国产精品性色戒| 国产极品嫩模在线观看91精品| 在线电影av不卡网址| 中文字幕无码乱码人妻日韩精品| 欧美激情综合网| gai在线观看免费高清| 91成人精品在线| 欧美精品久久久久久久免费观看| 一级一片免费看| 国产一区二区三区在线观看免费 | 激情网站在线| 午夜欧美视频在线观看| 日韩精品一区二区三区高清免费| 精品国产一区一区二区三亚瑟| 国产99久久精品一区二区 夜夜躁日日躁 | 亚洲欧美一级二级三级| 成人动漫视频在线观看免费| 国产小视频免费在线观看| 在线观看日韩电影| 国产精品久久久久久在线观看| 最新亚洲一区| 欧美成人免费在线| 黄网av在线| 日韩精品中文字幕有码专区| 中文字幕免费播放| 亚洲欧美国产高清| 男人网站在线观看| 欧美a级理论片| 欧美日韩三区四区| 国产黄色精品| 国模精品一区二区三区色天香| 精品电影在线| 粉嫩老牛aⅴ一区二区三区| 视频区 图片区 小说区| 色琪琪久久se色| 97在线中文字幕| 黄色av免费在线| 欧美日韩国产美女| 久久久久久国产免费a片| 国产在线播精品第三| 国产91xxx| 日韩精品一区国产| 2019精品视频| 色一情一乱一区二区三区| 曰韩精品一区二区| www.久久国产| 国产精品69毛片高清亚洲| 激情网站五月天| 欧美激情日韩| 日韩片电影在线免费观看| 亚洲一级大片| 国产精品欧美日韩一区二区| 国产1区2区3区在线| 日韩精品一区二区在线观看| 国产免费无码一区二区视频| 国产又粗又猛又爽又黄91精品| 国产v片免费观看| 综合视频在线| yy111111少妇影院日韩夜片| 美女日韩欧美| 久久人91精品久久久久久不卡| 成人动漫在线免费观看| 欧美色老头old∨ideo| 免费人成在线观看| 日韩一区中文字幕| 亚洲色成人网站www永久四虎| 丁香六月综合激情| 中国丰满人妻videoshd| 综合精品久久| 亚洲欧洲国产日韩精品| 99久久这里有精品| 九九热这里只有在线精品视| 成人久久久精品国产乱码一区二区| 一区二区三区四区乱视频| 一级在线观看视频| 久久一夜天堂av一区二区三区| 黄色片视频在线播放| 黄色另类av| 国产91porn| 91精品二区| 一区精品在线| 久久av国产紧身裤| 999热视频| 日韩精品一区二区三区中文 | 成人黄色片视频| 国产手机视频一区二区 | 狠狠色伊人亚洲综合网站l| 亚洲国产精品网站| 免费看污视频的网站| 欧美日韩国产在线| 色婷婷av国产精品| 18涩涩午夜精品.www| 国产调教在线观看| 国产女人18毛片水真多成人如厕| 九色porny自拍视频| 久久99精品久久久久久国产越南 | 国模精品娜娜一二三区| 六月婷婷综合| 青青草原成人在线视频| 蜜臀国产一区| 国产精品国内视频| 九九热这里有精品| 91精品久久久久久蜜桃| 97se亚洲| 蜜桃久久精品乱码一区二区| 国产精品一国产精品| 91视频免费在线观看| 精品国产一区二区三区2021| 777精品视频| 一本大道色婷婷在线| 国产v综合v亚洲欧美久久| 不卡亚洲精品| 亚洲aaa激情| 亚洲综合影院| 久久久久久a亚洲欧洲aⅴ| www欧美在线观看| 亚洲综合精品伊人久久| 加勒比色老久久爱综合网| 美女精品国产| 日韩在线观看一区 | 麻豆极品一区二区三区| 欧美一级小视频| 国产精品久久久久久久久久妞妞| www国产精品内射老熟女| 日韩av电影天堂| 三上悠亚 电影| 久久久青草青青国产亚洲免观| 青娱乐国产精品视频| 成人午夜免费电影| 久操视频免费看| 亚洲色图视频网| 精品人妻中文无码av在线| 中文字幕av免费专区久久| 亚洲最大的黄色网| 国产喂奶挤奶一区二区三区| 亚洲激情 欧美| 国产欧美综合在线| 男女免费视频网站| 在线视频观看一区| www.国产欧美| 日韩欧美久久一区| 可以直接在线观看的av| 欧美精品在线看| av大片在线| 欧美成人午夜激情视频| 涩涩视频在线播放| 91免费国产视频| 伊人久久大香线蕉无限次| 中文字幕乱码免费| 亚洲色图国产| 精品视频无码一区二区三区| 国产乱对白刺激视频不卡| 奇米777在线视频| 91在线观看下载| 校园春色 亚洲| 欧美午夜精品电影| 夜夜爽8888| 9191国产精品| 色在线免费视频| 日韩电影在线观看中文字幕| 欧美成人hd| 国产mv免费观看入口亚洲| 精品综合久久88少妇激情| 吴梦梦av在线| 久久国产尿小便嘘嘘| 国产精品亚洲无码| 精品美女久久久久久免费| 国产xxxx孕妇| 日韩亚洲欧美中文高清在线| 性欧美超级视频| 美女精品国产| 国产免费成人| 国产福利在线观看视频| 一区二区激情视频| 久久久久久久久影院| 日韩欧美精品在线| 快射av在线播放一区| 国产精品永久免费视频| 韩国三级大全久久网站| 色综合久久久久久久久五月| 888久久久| 999在线观看| 国产精品美女久久久久久 | 欧美一区二区三区免费观看视频| 97在线观看免费观看高清| 久热国产精品视频| 人人精品久久| 一区一区视频| 极品少妇xxxx偷拍精品少妇| 香蕉视频污视频| 亚洲午夜日本在线观看| 成人一级免费视频| 亚洲人成绝费网站色www| 久久99久久99精品免观看软件| 国产视频999| 欧美电影在线观看免费| 日韩三级电影网站| 日韩av网站在线观看| 色噜噜噜噜噜噜| 欧美久久高跟鞋激| 黑人精品一区二区| 国内精品视频一区| 亚州综合一区| 超碰影院在线观看| 国产精品乱人伦| 国产av无码专区亚洲a∨毛片| 欧美大片网站在线观看| 精品国产一区二区三区不卡蜜臂 | 久久国产生活片100| 污污的视频在线免费观看| 狠狠色狠色综合曰曰| 青青久在线视频| 国产精品美女久久| 亚洲女同另类| 色婷婷免费视频| 在线观看亚洲精品| 97影院秋霞午夜在线观看| 国产欧美一区二区视频| 视频一区二区三区在线| 亚洲一级二级片| 欧美午夜精品理论片a级按摩| 香蕉视频免费在线播放| 日本久久精品视频| 成人情趣视频| 国产免费一区二区三区视频| 国产日韩欧美精品一区| 国产女人18毛片水18精| 在线日韩欧美视频| 美国十次综合久久| 国产91美女视频| 日韩一区中文字幕| 亚洲人午夜射精精品日韩| 国产噜噜噜噜噜久久久久久久久| 欧美激情五月| 爱爱免费小视频| 在线电影院国产精品| 少妇视频在线观看| 国产精品jizz在线观看老狼| av毛片久久久久**hd| 久久亚洲国产成人精品性色| 亚洲欧美国产va在线影院| 精精国产xxxx视频在线野外 | 国产高潮在线观看| 国产精品高潮呻吟久久av无限| 欧美私人啪啪vps| 日本免费www| 日韩激情av在线播放|