1. 程式人生 > >實現基於Android的英文電子詞典

實現基於Android的英文電子詞典



     英文詞典是手機中經常使用的應用。因此,在本文將結合Android來討論如何實現一個Android版的英文詞典。實現英文詞典的方法很多。在本文使用了SQLite資料庫來儲存英文單詞資訊。系統通過SQLite資料庫中儲存的單詞資訊來查詢到與指定英文對應的中文資訊。當然,實現這樣一個英文詞典需要解決一系列技術問題。例如,如何將儲存英文單詞資訊的資料庫檔案隨程式(apk檔案)一起釋出;釋出後如何開啟資料庫;如何在輸入前幾個字母后,在AutoCompleteTextView元件提示列表中顯示以所輸入字串開頭的所有單詞。在本章將逐漸給出這些問題的詳細答案。關於本文實現的英文電子詞典的完整程式碼請讀者參本文提供的原始碼。


實現電子詞典要解決的技術問題及初步的解答 
   在本節將給出實現電子詞典需要解決的主要技術問題,並給出這些技術問題的初步答案或提示。關於詳細的答案和程式碼請讀者參閱本文後面的內容。

主要技術問題及解答如下:


   1. 
如何將SQLite資料庫(dictionary.db檔案)與apk檔案一起釋出?

解答:可以將dictionary.db檔案複製到Eclipse Android工程中的res aw目錄中,如圖1所示。所有在res aw目錄中的檔案不會被壓縮,這樣可以直接提取該目錄中的檔案。

2. 如何將開啟res aw目錄中的資料庫檔案?

解答:在Android中不能直接開啟

res aw目錄中的資料庫檔案,而需要在程式第一次啟動時將該檔案複製到手機記憶體或SD卡的某個目錄中,然後再開啟該資料庫檔案。複製的基本方法是使用getResources().openRawResource方法獲得res aw目錄中資源的InputStream物件,然後將該InputStream物件中的資料寫入其他的目錄中相應檔案中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來開啟任意目錄中的SQLite資料庫檔案。


3.如果在AutoCompleteTextView元件中輸入兩個及以上字母時顯示以所輸入字串開頭的所有單詞列表?

解答:AutoCompleteTextView所使用的Adapter是一個自定義的Adapter類,類的結構如下:

  1. public class DictionaryAdapter extends CursorAdapter
  2. {
  3. ... ...
  4. }
複製程式碼 要注意的是,不能將整個資料庫中的單詞都查出,然後生成一個Adapter物件再使用setAdapter方法來設定AutoCompleteTextView元件的Adapter物件。AutoCompleteTextView元件不會為我們篩選以某個字串開頭的單詞。這些工作需要開發人員通過編碼來實現。 基本思路是在AutoCompleteTextView類的afterTextChanged事件中監視AutoCompleteTextView元件中字元的輸入情況,每當輸入一個字元時就生成一個Adapter物件,然後將新生成的Adapter物件與AutoCompleteTextView關聯。顯示以輸入字串開頭的單詞列表的效果如圖2所示。


複製並開啟儲存英文單詞的資料庫檔案

在本文實現的英文詞典中使用openDatabase方法來開啟資料庫檔案(該檔案在SD卡的dictionary目錄中,因此,要想執行本文實現的英文詞典,需要在手機或模擬器中需要安裝SD卡)。如果該檔案不存在,系統會自動建立/sdcard/dictionary目錄,並將res aw目錄中的dictionary.db檔案複製到/sdcard/dictionary目錄中。openDatabase方法的實現程式碼如下:
  1. private SQLiteDatabase openDatabase()
  2.         {
  3.                 try
  4.                 {
  5.                         // 獲得dictionary.db檔案的絕對路徑
  6.                         String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
  7.                         File dir = new File(DATABASE_PATH);
  8.                         // 如果/sdcard/dictionary目錄中存在,建立這個目錄
  9.                         if (!dir.exists())
  10.                                 dir.mkdir();
  11.                         // 如果在/sdcard/dictionary目錄中不存在
  12.                         // dictionary.db檔案,則從res
  13. aw目錄中複製這個檔案到
  14.                         // SD卡的目錄(/sdcard/dictionary)
  15.                         if (!(new File(databaseFilename)).exists())
  16.                         {
  17.                                 // 獲得封裝dictionary.db檔案的InputStream物件
  18.                                 InputStream is = getResources().openRawResource(
  19.                                                 R.raw.dictionary);
  20.                                 FileOutputStream fos = new FileOutputStream(databaseFilename);
  21.                                 byte[] buffer = new byte[8192];
  22.                                 int count = 0;
  23.                                 // 開始複製dictionary.db檔案
  24.                                 while ((count = is.read(buffer)) > 0)
  25.                                 {
  26.                                         fos.write(buffer, 0, count);
  27.                                 }
  28.                                 fos.close();
  29.                                 is.close();
  30.                         }
  31.                         // 開啟/sdcard/dictionary目錄中的dictionary.db檔案
  32.                         SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(
  33.                                         databaseFilename, null);
  34.                         return database;
  35.                 }
  36.                 catch (Exception e)
  37.                 {
  38.                 }
  39.                 return null;
  40.         }
複製程式碼 openDatabase方法中使用了幾個常量,這些常量是在程式的主類(Main)中定義的,程式碼如下:
  1. public class Main extends Activity implements OnClickListener, TextWatcher
  2. {
  3.         private final String DATABASE_PATH = android.os.Environment
  4.                         .getExternalStorageDirectory().getAbsolutePath()
  5.                         + "/dictionary";
  6.         private AutoCompleteTextView actvWord;
  7.         private final String DATABASE_FILENAME = "dictionary.db";
  8.         ...........
  9. }
複製程式碼 查詢單詞 
  英文詞典的核心就是查詢英文單詞的中文意思。在查詢中文意思之前,首先需要使用openDatabase方法在Main類的onCreate方法中開啟SQLite資料庫,程式碼如下:database = openDatabase();其中database是在Main類中定義的SQLiteDatabase型別變數。然後在查詢按鈕的單擊事件中新增如下的程式碼來查詢英文單詞,並顯示中文意思。
  1. public void onClick(View view)
  2.         {
  3.                 String sql = "select chinese from t_words where english=?";                
  4.                 Cursor cursor = database.rawQuery(sql, new String[]
  5.                 { actvWord.getText().toString() });
  6.                 String result = "未找到該單詞.";
  7.                 //  如果查詢單詞,顯示其中文的意思
  8.                 if (cursor.getCount() > 0)
  9.                 {
  10.                         //  必須使用moveToFirst方法將記錄指標移動到第1條記錄的位置
  11.                         cursor.moveToFirst();
  12.                         result = cursor.getString(cursor.getColumnIndex("chinese"));
  13.                 }
  14.                 //  顯示查詢結果對話方塊
  15.                 new AlertDialog.Builder(this).setTitle("查詢結果").setMessage(result)
  16.                                 .setPositiveButton("關閉", null).show();
  17.         }
複製程式碼 講到這裡我們應該瞭解一個dictionary.db中的t_words表的結果,該表只有兩個欄位:englishchinese。分別表示單詞的英文和中文描述。如果要獲得單詞的中文描述,只需要查詢chinese欄位即可。如onClick方法中的程式碼所示。查詢單詞的效果如圖3所示。


如果顯示以輸入字串開頭的單詞列表
雖然到目前為止,我們的英文詞典已經可以正常工作了,但為了方便讀者使用,在本節將新增單詞輸入的自動提示功能。也就是說,如果讀者在AutoCompleteTextView元件中輸入單詞的前幾個字母,該元件就會自動列出資料庫中所有以該字串開頭的單詞。效果如圖2所示。擁有這樣的功能就可以使使用者在只知道單詞的前幾個字母時也可以查詢到相應的單詞。由於AutoCompleteTextView元件使用了自定義的Adapter類,下面先給出這個自定義的Adapter類的完整程式碼。
  1. public class DictionaryAdapter extends CursorAdapter
  2. {
  3. private LayoutInflater layoutInflater;
  4. public CharSequence convertToString(Cursor cursor)
  5. {
  6. return cursor == null ? "" : cursor.getString(cursor.getColumnIndex("_id"));
  7. }
  8. //用於將_id欄位(也就是english欄位)的值設定TextView元件的文字
  9. //view引數表示用於顯示列表項的TextView元件
  10. private void setView(View view, Cursor cursor)
  11. {
  12. TextView tvWordItem = (TextView) view;
  13. tvWordItem.setText(cursor.getString(cursor.getColumnIndex("_id")));
  14. }
  15. public void bindView(View view, Context context, Cursor cursor)
  16. {
  17. setView(view, cursor);
  18. }
  19. public View newView(Context context, Cursor cursor, ViewGroup parent)
  20. {
  21. View view = layoutInflater.inflate(R.layout.word_list_item, null);
  22. setView(view, cursor);
  23. return view;
  24. }
  25. public DictionaryAdapter(Context context, Cursor c, boolean autoRequery)
  26. {
  27. super(context, c, autoRequery);
  28. //通過系統服務獲得LayoutInflater物件
  29. layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  30. }
  31. }
複製程式碼 在編寫DictionaryAdapter類時應注意如下3點:
1. 為了將Cursor物件與AutoCompleteTextView元件繫結, DictionaryAdapter類必須從CursorAdapter類繼承。
2.由於CursorAdapter類中的convertToString方法直接返回了Cursor物件的地址,因此,在DictionaryAdapter類中必須覆蓋convertToString方法,以返回當前選中的單詞。CursorAdapter類中的convertToString方法的原始碼。
  1. public CharSequence convertToString(Cursor cursor)
  2. {
  3. //如果cursor不為null,返回Cursor物件的地址(cursor.toString())
  4. return cursor == null ? "" : cursor.toString();
  5. }
複製程式碼 覆蓋後的convertToToString方法的原始碼如下:
  1. public CharSequence convertToString(Cursor cursor)
  2. {
  3. return cursor == null ? "" : cursor.getString(cursor.getColumnIndex("_id"));
  4. }
複製程式碼 這裡要注意一下,當選中AutoCompleteTextView元件中單詞列表中某一個單詞後,系統會用convertToString方法的返回值來設定AutoCompleteTextView元件中的文字。因此,必須使用CursorgetString來獲得相應的欄位值。 

3.由於將Cursor物件與Adapter繫結時必須要有一個叫“_id”的欄位,因此,在本例中將english欄位名對映成了“_id”欄位。為了監視AutoCompleteTextView元件中的文字輸入情況,需要實現android.text.TextWatcher介面。在該介面中只需要實現afterTextChanged方法即可,程式碼如下:
  1. public void afterTextChanged(Editable s)
  2. {
  3. //必須將english欄位的別名設為_id
  4. Cursor cursor = database.rawQuery(
  5. "select english as _id from t_words where english like ?",
  6. new String[]{ s.toString() + "%" });
  7. DictionaryAdapter dictionaryAdapter = new DictionaryAdapter(this,cursor, true);
  8. //actvWord是在Main類中定義的AutoCompleteTextView型別的變數
  9. actvWord.setAdapter(dictionaryAdapter);
  10. }
複製程式碼 從上面的程式碼中可以看到,在查詢SQL語句中的english欄位名的別名是“_id”。

4.DictionaryAdapter類中需要使用bindViewnewView方法設定每一個列表項。bindView方法負責設定已經存在的列表項,也就是該列表項已經生成了相應的元件物件。而newView方法負責設定新的列表項,在該方法中需要建立一個View物件來顯示當前的列表項。在本例中使用word_list_item.xml佈局檔案來顯示每一個列表項,程式碼如下:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <TextView xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:id="@+id/tvWordItem"
  4.     android:layout_width="fill_parent"
  5.     android:layout_height="wrap_content"
  6.     android:textAppearance="?android:attr/textAppearanceLarge"
  7.     android:gravity="center_vertical"
  8.     android:paddingLeft="6dip"
  9.     android:textColor="#000"
  10.     android:minHeight="?android:attr/listPreferredItemHeight"
  11. />
複製程式碼 本文介紹了實現基於Android的英文詞典的實現方法。

實現英文詞典主要需要解決3個問題:如何將儲存英文單詞的SQLite資料庫檔案隨同apk檔案一起釋出;
如何開啟SD卡中的資料庫檔案;如何在AutoCompleteTextView元件顯示以輸入字串開頭的英文單詞列表。在最後仍然要提一句的是在編寫自定義DictionaryAdapter類時一定要覆蓋contertToString方法,以便在使用者選項某一個列表項時在AutoCompleteTextView元件中顯示選中的單詞,而不是Cursor物件地址。

相關推薦

實現基於Android英文電子詞典

     英文詞典是手機中經常使用的應用。因此,在本文將結合Android來討論如何實現一個Android版的英文詞典。實現英文詞典的方法很多。在本文使用了SQLite資料庫來儲存英文單詞資訊。系統通過SQLite資料庫中儲存的單詞資訊來查詢到與指定英文對應的中文資訊。當然,實現這樣一個英文詞典需要解決一系

基於Android英文電子詞典

一.提要       英文詞典是手機中經常使用的應用。因此,在本文將結合 Android 來討論如何實現一個 Android 版的英文詞典。實現英文詞典的方法很多。在本文使用了 SQLite 資料庫來儲存英文單詞資訊。系統通過 SQLite 資料庫中儲存的單詞資訊來查詢到與

實現基於LNMP的電子商務網站

linux實現基於LNMP的電子商務網站:1. yum方式安裝mariadb、 mariadb-server、 php-mysql、 php、 php-fpm 2.下載小米商城源碼, 解壓縮到/data/web目錄, 修改權限為nobody3.修改nginx配置, 把nginx.conf.default模板復

實現基於小米的電子商務平臺架構

linux在Centos7中實現基於LNMP的電子商務網站一、環境準備:搭建電子商務網站之前首先要準備一個好的安裝環境systemctl status firewalld(查看一下防火墻的狀態)systemctl stop firewalld(關閉防火墻)iptables -F(清空防火墻裏面的規則)gete

實驗——實現基於LNMP的電子商務平臺架構

linux一、 環境準備: centos系統、nginx源碼、 yum源(安裝mysql與php-fpm) 二、 安裝步驟: 1、先確定一下防火墻都清空了2、安裝nginx(推薦源碼編譯安裝)3、yum方式安裝mariadb、mariadb-server、 php-mysql、 php、 php-fpm 4、

實現基於LNMP的電子商務網站的搭建

網站搭建一 環境準備:centos系統 yum源(安裝mysql,nginx,和php-fpm)二:安裝步驟:用yum的方式安裝mariadb,mariadb-server,php-mysql,php-fpm,nginx下載需要搭建網站的源碼,我搭建的是基於小米網站的搭建,然後解壓縮到data/web目錄修

基於jeesite+android開發 電子商務系統免費教程

美工 系統 寶寶 .com 導圖 數據庫設計 微博 完成 and 下載地址: jeesite免費教程 基於jeesite+android開發 電子商務系統免費教程 基於jeesite+android開發 電子商務系統免費教程 這個教程已經錄制完很久了,一直沒有公開,今天公

實現基於lnmp電子商務網站的負載均衡

lvs一、LVS負載均衡NAT工作模式工作流程(a). 當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP為CIP,目標IP為VIP(b). PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈(c). IPVS比

企業實戰(4)-實現基於Haproxy負載均衡集群的電子商務網站架構

haproxy keepalived 企業實戰:逐步實現企業各種情景下的需求企業情景四:隨著公司業務的發展,公司負載均衡服務已經實現四層負載均衡,但業務的復雜程度提升,公司要求把mobile手機站點作為單獨的服務提供,不在和pc站點一起提供服務,此時需要做7層規則負載均衡,運維總監要求,能否用一種服務

Android 音視頻深入 十五 FFmpeg 實現基於Rtmp協議的推流(附源碼下載)

音視頻 FFmpeg Rtmp 推流 源碼地址https://github.com/979451341/Rtmp 1.配置RTMP服務器 這個我不多說貼兩個博客分別是在mac和windows環境上的,大家跟著弄MAC搭建RTMP服務器https://www.jianshu.com/p/6fce

c專案實現(1)實現電子詞典的翻譯

專案實現功能 通過使用者的輸入,在字典檔案中進行 查詢,返回對應的翻譯內容。 字典檔案的樣式,該檔案已經上傳。 #a                       

基於Netty實現Android 訊息推送(即時通訊)的解決方案

根據Netty框架實現訊息推送(即時聊天)功能. Netty框架,TCP長連線,心跳,阻塞訊息佇列,執行緒池處理訊息傳送, 基於Google ProtoBuf自定義的訊息協議, TCP粘包/拆包.... 客戶端通過TCP連線到伺服器,並建立TCP長連線;當伺服器端收到新訊息後通過TCP連線推送給

基於Android的小巫新聞客戶端開發--主介面業務邏輯實現

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

基於Android簡單備忘錄的設計與實現(附git原始碼連結)

前言 課程作業需要,於是忙活兩天寫了一個簡單的備忘錄,使用了ListView,SQLite。 開發環境:Android Studio 原始碼連結:https://gitee.com/zg0212/Memoire 功能截圖 主頁面 新建頁面

基於android的天氣預報的設計與實現

目錄 應用開發技術及開發平臺介紹 應用需求分析 應用功能設計及其描述 應用UI展示 ①開發技術:   本系統是採用面向物件的軟體開發方法,基於Android studio開發平臺,以Android作為本系統的開發語言實現音樂播放器預定的需求功能。   ②平臺介紹 硬體平臺

使用Python實現電子詞典

專案內容: 一、功能說明: 1.使用者可以登入和註冊 登入憑藉使用者名稱密碼即可 註冊要求使用者必須填寫使用者名稱和密碼其他內容可自定 使用者名稱要求不能夠重複 2.使用者資料要求使用資料庫長期儲存 資料表自定 3.能夠滿足多個使用者同時登陸操作的

[原始碼和文件分享]基於Android Studio實現的論壇網站Android客戶端和JAVA EE後臺

第一章 概述 1.1 開發環境 本安卓程式在Windows 10系統下使用Android Studio開發,後臺使用MyEclipse開發,測試環境為安卓系統5.1、4.4、4.3、5.0,螢幕尺寸5.0、5.1、5.5的安卓手機。 1.2 安裝配置 本安卓程式要求安卓SDK為API

C++多執行緒實現電子詞典

// Dictionary.cpp : 定義控制檯應用程式的入口點。 //vs2013編譯 //字典檔案:https://pan.baidu.com/s/1YHtwptaq_V8j034U9_J96A #include "stdafx.h" #include &

基於Android系統的平板電腦電子地圖系統開發

http://www.sbsm.gov.cn/article/gzdt/201204/20120400100590.shtml 4月1日上午,陝西省測繪地理資訊局組織陝西省發展和改革委員會相關專家對“基於android系統的平板電腦電子地圖系統開發”、“陝西省測繪成果目錄匯

基於UDP實現android區域網視訊同步播放

前段時間給公司的專案實現了一個區域網視訊同步播放的功能,最近稍微空閒一些,所以稍微整理下,分享給大家學習下,文末附有下載地址。 一.概述 實現區域網視訊同步播放,首先需要這些裝置都有