`
nokiaguy
  • 浏览: 6143 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

实现基于Android的英文电子词典

阅读更多

    英文词典是手机中经常使用的应用。因此,在本文将结合 Android来讨论如何实现一个 Android版的英文词典。实现英文词典的方法很多。在本文使用了 SQLite数据库来保存英文单词信息。系统通过 SQLite数据库中保存的单词信息来查找到与指定英文对应的中文信息。当然,实现这样一个英文词典需要解决一系列技术问题。例如,如何将保存英文单词信息的数据库文件随程序( apk文件)一起发布;发布后如何打开数据库;如何在输入前几个字母后,在 AutoCompleteTextView组件提示列表中显示以所输入字符串开头的所有单词。在本章将逐渐给出这些问题的详细答案。

实现电子词典要解决的技术问题及初步的解答

    在这里将给出实现电子词典需要解决的主要技术问题,并给出这些技术问题的初步答案或提示。关于详细的答案和代码请读者参阅本文后面的内容。
    主要技术问题及解答如下:
    1. 如何将SQLite数据库(dictionary.db文件)与apk文件一起发布?
解答:可以将dictionary.db文件复制到Eclipse Android工程中的res\raw目录中,如图1所示。所有在res\raw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。

                    
  图1
  将 dictionary.db 文件复制到 res\raw 目录中


2. 如何将打开 res\raw目录中的数据库文件?
解答:在Android 中不能直接打开 res\raw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或 SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用 getResources().openRawResource方法获得 res\raw目录中资源的 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所示。



                            图2  
显示以输入字符串开头的单词列表

复制并打开保存英文单词的数据库文件

    在本文实现的英文词典中使用openDatabase方法来打开数据库文件(该文件在SD卡的dictionary目录中,因此,要想运行本文实现的英文 词典,需要在手机或模拟器中需要安装SD卡)。如果该文件不存在,系统会自动创建/sdcard/dictionary目录,并将res\raw目录中的 dictionary.db文件复制到/sdcard/dictionary目录中。openDatabase方法的实现代码如下:


01     private SQLiteDatabase openDatabase()
02     {
03          try
04          {
05              // 获得dictionary.db文件的绝对路径
06              String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
07              File dir = new File(DATABASE_PATH);
08              // 如果/sdcard/dictionary目录中存在,创建这个目录
09              if (!dir.exists())
10                 dir.mkdir();
11              // 如果在/sdcard/dictionary目录中不存在
12              // dictionary.db文件,则从res\raw目录中复制这个文件到
13              // SD卡的目录(/sdcard/dictionary)
14              if (!( new File(databaseFilename)).exists())
15              {
16                 // 获得封装dictionary.db文件的InputStream对象
17                 InputStream is = getResources().openRawResource(R.raw.dictionary);
18                 FileOutputStream fos = new FileOutputStream(databaseFilename);
19                 byte [] buffer = new byte [ 8192 ];
20                 int count = 0 ;
21                 // 开始复制dictionary.db文件
22                 while ((count = is.read(buffer)) > 0 )
23                 {
24                      fos.write(buffer, 0 , count);
25                 }
26
27                 fos.close();
28                 is.close();
29              }
30              // 打开/sdcard/dictionary目录中的dictionary.db文件
31              SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(
32                      databaseFilename, null );
33              return database;
34          }
35          catch (Exception e)
36          {
37          }
38          return null ;
39     }

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 final String DATABASE_FILENAME = "dictionary.db" ;
7    
8 }

查询单词

    英文词典的核心就是查找英文单词的中文意思。在查找中文意思之前,首先需要使用openDatabase方法在Main类的onCreate方法中打开SQLite数据库,代码如下:

database = openDatabase();

    其中database是在Main类中定义的SQLiteDatabase类型变量。
然后在查找按钮的单击事件中添加如下的代码来查找英文单词,并显示中文意思。


01     public void onClick(View view)
02     {
03          String sql = "select chinese from t_words where english=?" ;   
04          Cursor cursor = database.rawQuery(sql, new String[]
05          { actvWord.getText().toString() });
06          String result = "未找到该单词." ;
07          //  如果查找单词,显示其中文信息
08          if (cursor.getCount() > 0 )
09          {
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
18     }

    讲到这里我们应该了解一个 dictionary.db中的 t_words表的结果,该表只有两个字段: english chinese。分别表示单词的英文和中文描述。如果要获得单词的中文描述,只需要查找 chinese字段即可。如 onClick方法中的代码所示。
查询单词的效果如图 3所示。


                                       图 3
查询英文单词

如果显示以输入字符串开头的单词列表

      虽然到目前为止,我们的英文词典已经可以正常工作了,但为了方便读者使用,在本节将添加单词输入的自动提示功能。也就是说,如果读者在 AutoCompleteTextView组件中输入单词的前几个字母,该组件就会自动列出数据库中所有以该字符串开头的单词。效果如图2所示。拥有这样 的功能就可以使用户在只知道单词的前几个字母时也可以查找到相应的单词。
       由于AutoCompleteTextView组件使用了自定义的Adapter类,下面先给出这个自定义的Adapter类的完整代码。


01     public class DictionaryAdapter extends CursorAdapter
02     {
03          private LayoutInflater layoutInflater;
04          @Override
05          public CharSequence convertToString(Cursor cursor)
06          {
07              return cursor == null ? "" : cursor.getString(cursor
08                      .getColumnIndex( "_id" ));
09          }
10          //  用于将_id字段(也就是english字段)的值设置TextView组件的文本
11          //  view参数表示用于显示列表项的TextView组件
12          private void setView(View view, Cursor cursor)
13          {
14              TextView tvWordItem = (TextView) view;
15     tvWordItem.setText(cursor.getString(cursor.getColumnIndex( "_id" )));
16          }
17
18          @Override
19          public void bindView(View view, Context context, Cursor cursor)
20          {
21              setView(view, cursor);
22          }
23
24          @Override
25          public View newView(Context context, Cursor cursor, ViewGroup parent)
26          {
27              View view = layoutInflater.inflate(R.layout.word_list_item, null );
28              setView(view, cursor);
29              return view;
30          }
31          public DictionaryAdapter(Context context, Cursor c, boolean autoRequery)
32          {
33              super (context, c, autoRequery);
34              //  通过系统服务获得LayoutInflater对象
35      
36              layoutInflater = (LayoutInflater) context
37                      .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
38          }
39     }

在编写 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
4                      .getColumnIndex( "_id" ));
5 }

    在这里要注意一下,当选中 AutoCompleteTextView 组件中单词列表中某一个单词后,系统会用 convertToString 方法的返回值来设置 AutoCompleteTextView 组件中的文本。因此,必须使用 Cursor getString 来获得相应的字段值。
3. 由于将 Cursor 对象与 Adapter 绑定时必须要有一个叫“ _id ”的字段,因此,在本例中将 english 字段名映射成了“ _id ”字段。
为了监视 AutoCompleteTextView 组件中的文本输入情况,需要实现 android.text.TextWatcher 接口。在该接口中只需要实现 afterTextChanged 方法即可,代码如下:


01     public void afterTextChanged(Editable s)
02     {
03          //  必须将english字段的别名设为_id
04          Cursor cursor = database.rawQuery(
05                 "select english as _id from t_words where english like ?" ,
06                 new String[]{ s.toString() + "%" });
07          DictionaryAdapter dictionaryAdapter = new DictionaryAdapter( this ,cursor, true );
08          //  actvWord是在Main类中定义的AutoCompleteTextView类型的变量
09          actvWord.setAdapter(dictionaryAdapter);
10     }

从上面的代码中可以看到,在查询 SQL 语句中的 english 字段名的别名是“ _id ”。


4. DictionaryAdapter 类中需要使用 bindView newView 方法设置每一个列表项。 bindView 方法负责设置已经存在的列表项,也就是该列表项已经生成了相应的组件对象。而 newView 方法负责设置新的列表项,在该方法中需要创建一个 View 对象来显示当前的列表项。在本例中使用 word_list_item.xml 布局文件来显示每一个列表项,代码如下:


01 <? xml version = "1.0" encoding = "utf-8" ?>
02 < TextView xmlns:android = "http://schemas.android.com/apk/res/android "
03     android:id = "@+id/tvWordItem"
04     android:layout_width = "fill_parent"
05     android:layout_height = "wrap_content"
06     android:textAppearance = "?android:attr/textAppearanceLarge"
07     android:gravity = "center_vertical"
08     android:paddingLeft = "6dip"
09     android:textColor = "#000"    
10     android:minHeight = "?android:attr/listPreferredItemHeight"
11 />

    本文介绍了实现基于 Android的英文词典的实现方法。实现英文词典主要需要解决 3个问题:如何将保存英文单词的 SQLite数据库文件随同 apk文件一起发布;如何打开 SD卡中的数据库文件;如何在 AutoCompleteTextView组件显示以输入字符串开头的英文单词列表。在最后仍然要提一句的是在编写自定义 DictionaryAdapter类时一定要覆盖 contertToString方法,以便在用户选项某一个列表项时在 AutoCompleteTextView组件中显示选中的单词,而不是 Cursor对象地址。





《Android/OPhone开发完全讲义》(本书版权已输出到台湾)

 样章和目录下载
 
互动网   当当网  卓越亚马逊

《人人都玩开心网:Ext JS+Android+SSH整合开发Web与移动SNS》
 样章下载
 互动网

 乐博Android手机客户端(新浪微博) 发布

分享到:
评论

相关推荐

    基于Android系统电子词典的设计与开发

    本项目旨在设计并开发一款基于Android系统的电子词典软件,旨在帮助用户更方便、高效地进行英语学习。 #### 一、背景介绍 21世纪初,Andy Rubin创立了Android操作系统。2005年,Google收购了Android公司,自此...

    基于Android的电子词典手机客户端的设计与实现

    基于Android的电子词典手机客户端的设计与实现,硕士论文,供写作参考

    基于安卓的电子词典

    在当前的数字化时代,基于安卓系统的电子词典已经成为学习者不可或缺的工具,尤其对于英语学习者来说更是如此。本文将深入探讨基于安卓的电子词典的设计、功能以及它如何利用数据库技术来提供高效且详尽的英语注解。...

    基于android的电子词典设计与实现.doc

    基于Android平台的电子词典设计与实现是移动开发领域的一项重要任务,它结合了先进的移动技术与语言学习的需求,为用户提供了一个高效、全面的英语学习环境。 首先,Android平台的普及率高,市场份额大,这为电子...

    毕业设计--基于Android的电子词典软件的设计与实现 (含外文翻译).docx

    ### 基于Android的电子词典软件设计与实现的关键知识点 #### 1. Android平台电子词典软件概述 - **研究背景与意义**:随着全球化的发展,英语作为国际通用语言的重要性日益凸显。同时,移动互联网技术的进步为英语...

    Android代码-英文电子词典源码.zip

    《Android英文电子词典源码解析》 在移动设备领域,Android系统因其开源特性而备受开发者喜爱。本篇文章将深入探讨一个特别的项目——“英文电子词典源码”,这是一份基于Android平台的开发实践,它展示了如何利用...

    Android 英文电子词典源码.zip源码资源下载

    本篇将深度探讨一款基于Android平台的英文电子词典的源码,通过分析源码,我们可以深入理解Android应用程序的架构设计、数据存储、网络请求以及用户界面的实现方式。 首先,我们要了解的是Android应用的基础结构。...

    Android电子词典_大作业版

    本文将深入探讨一个特别的项目——“Android电子词典_大作业版”,这是一个基于Android平台的简易版电子词典应用,由SQLite数据库和Android ADT工具链共同构建,提供英文单词查询中文含义以及第三方API支持的单词...

    Android中英文电子词典源码(so easy)-IT计算机-毕业设计.zip

    总之,《Android中英文电子词典源码(so easy)》是一个实用的毕业设计项目,不仅能够帮助学生掌握Android应用开发的基本技术,还能够锻炼其解决实际问题的能力,对于提升移动开发App的设计与实现能力具有显著价值。...

    android 电子词典实现

    ### Android电子词典实现 #### 一、软件功能概述 本项目主要介绍了一款基于Android平台的英语移动学习软件的设计与实现。该软件不仅具备基本的词汇查询功能,还融入了语音读取、天气预报以及英语文章阅读等功能,...

    基于Android的藏汉英三语电子词典的设计与实现.pdf

    《基于Android的藏汉英三语电子词典的设计与实现》这一成果,正是在这样的背景下应运而生,旨在提供一个全新的语言学习解决方案。 这款电子词典在设计之初就明确了其服务对象——即那些需要学习藏语、汉语以及英语...

    Android 英文电子词典源码.rar

    【Android 英文电子词典源码】是一个用于学习和参考的开源项目,主要目标是为Android设备用户提供一个便捷的英文词汇查询应用。这个源码提供了实现一个功能完备的电子词典所需的基本框架和功能模块,对于Android...

    基于安卓平台电子词典的设计和实现(完整资料).doc

    《基于安卓平台电子词典的设计和实现》 随着21世纪科技的快速发展,电子行业特别是智能手机领域取得了显著进步。智能手机的普及使得手机应用程序(APP)成为电子行业的新宠。其中,电子词典作为学习和认知世界的...

    基于android的移动应用中英文电子词典源码(so easy).zip

    本项目"基于Android的移动应用中英文电子词典源码(so easy)"提供了一个简单易懂的源码示例,帮助开发者快速理解和实践Android应用开发。 首先,这个应用的核心功能是词典查询。它可能包含以下几个关键组件: 1. ...

    基于安卓平台电子词典的设计和实现.doc

    总的来说,这篇论文全面阐述了基于Android平台的电子词典设计与实现的全过程,从需求分析、数据库设计、环境配置、功能实现到测试优化,为同类应用的开发提供了参考。同时,它突显了移动技术在教育领域的应用潜力,...

    安卓电子词典

    4. **Android平台**:作为一款基于Android平台的应用,安卓电子词典兼容各种Android设备,无论是智能手机还是平板电脑,都能提供一致的用户体验。此外,Android平台的开放性和可定制性使得开发者可以充分利用其API和...

    毕业设计(论文)--基于android的信息专业英语词典的设计与开发.doc

    第三,设计和开发基于 Android 平台的信息专业英语词典,实现基本功能和需求;第四,测试和评价基于 Android 平台的信息专业英语词典,确保其满足信息专业学生和从业人员的需求。 在本设计中,我们将使用 Java 语言...

    Android源码——英文电子词典源码.zip

    在本项目中,我们主要探讨的是一个基于Android平台的英文电子词典的源代码实现。这个开源项目为开发者提供了一个了解Android应用开发,尤其是词典类应用开发的实践平台。通过对源码的学习和分析,我们可以深入理解...

    Android中英文电子词典源码(so easy).zip

    标题中的“Android中英文电子词典源码(so easy)”表明这是一款基于Android平台的电子词典应用的源代码,其特色在于简洁易用,可能是开发者为了方便其他程序员学习和参考而分享的。该应用可能包含中英文互译功能,...

    基于Android的藏汉英三语电子词典开发技术研究.pdf

    本篇研究论文的核心内容是对基于Android平台的藏汉英三语电子词典开发技术的研究。这项研究针对的是目前市场上关于藏文电子词典应用软件数量稀少,无法满足语言工作者和学习者需求的现状。随着智能手机和移动互联网...

Global site tag (gtag.js) - Google Analytics