英文词典是手机中经常使用的应用。因此,在本文将结合Android来讨论如何实现一个Android版的英文词典。实现英文词典的方法很多。在本文使用了SQLite数据库来保存英文单词信息。系统通过SQLite数据库中保存的单词信息来查找到与指定英文对应的中文信息。

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

在本节将给出实现电子词典需要解决的主要技术问题,并给出这些技术问题的初步答案或提示。关于详细的答案和代码请读者参阅本文后面的内容。

主要技术问题及解答如下:

1.如何将SQLite数据库(dictionary.db文件)与apk文件一起发布?

解答:可以将dictionary.db文件复制到Eclipse Android工程中的resraw目录中,

2. 如何将打开resraw目录中的数据库文件?

解答:在Android中不能直接打开resraw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得resraw目录中资源的InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。

3.如果在AutoCompleteTextView组件中输入两个及以上字母时显示以所输入字符串开头的所有单词列表?

解答:AutoCompleteTextView所使用的Adapter是一个自定义的Adapter类,要注意的是,不能将整个数据库中的单词都查出,然后生成一个Adapter对象再使用setAdapter方法来设置AutoCompleteTextView组件的Adapter对象。AutoCompleteTextView组件不会为我们筛选以某个字符串开头的单词。这些工作需要开发人员通过编码来实现。基本思路是在AutoCompleteTextView类的afterTextChanged事件中监视AutoCompleteTextView组件中字符的输入情况,每当输入一个字符时就生成一个Adapter对象,然后将新生成的Adapter对象与AutoCompleteTextView关联。显示以输入字符串开头的单词列表的效果.

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

privateSQLiteDatabase openDatabase() {try{//获得dictionary.db文件的绝对路径String databaseFilename= DATABASE_PATH + "/" +DATABASE_FILENAME; File dir= newFile(DATABASE_PATH);//如果/sdcard/dictionary目录中存在,创建这个目录 if (!dir.exists()) dir.mkdir();//如果在/sdcard/dictionary目录中不存在//dictionary.db文件,则从resraw目录中复制这个文件到//SD卡的目录(/sdcard/dictionary) if (!(newFile(databaseFilename)).exists()) {//获得封装dictionary.db文件的InputStream对象InputStream is=getResources().openRawResource(R.raw.dictionary); FileOutputStream fos= newFileOutputStream(databaseFilename);byte[] buffer = newbyte[8192];int count = 0;//开始复制dictionary.db文件 while ((count = is.read(buffer)) > 0) { fos.write(buffer,0, count); } fos.close(); is.close(); }//打开/sdcard/dictionary目录中的dictionary.db文件SQLiteDatabase database=SQLiteDatabase.openOrCreateDatabase( databaseFilename,null);returndatabase; }catch(Exception e) { }returnnull; }在openDatabase方法中使用了几个常量,这些常量是在程序的主类(Main)中定义的,代码如下:publicclass Main extends Activity implementsOnClickListener, TextWatcher{privatefinal String DATABASE_PATH =android.os.Environment .getExternalStorageDirectory().getAbsolutePath()+ "/dictionary";privatefinal String DATABASE_FILENAME = "dictionary.db";... ...}

查询单词

英文词典的核心就是查找英文单词的中文意思。在查找中文意思之前,首先需要使用openDatabase方法在Main类的onCreate方法中打开SQLite数据库,代码如下:database = openDatabase();其中database是在Main类中定义的SQLiteDatabase类型变量。然后在查找按钮的单击事件中添加如下的代码来查找英文单词,并显示中文意思。

publicvoidonClick(View view) { String sql= "select chinese from t_words where english=?"; Cursor cursor= database.rawQuery(sql, newString[] { actvWord.getText().toString() }); String result= "未找到该单词.";//如果查找单词,显示其中文信息if (cursor.getCount() > 0) {//必须使用moveToFirst方法将记录指针移动到第1条记录的位置 cursor.moveToFirst(); result= cursor.getString(cursor.getColumnIndex("chinese")); }//显示查询结果对话框 new AlertDialog.Builder(this).setTitle("查询结果").setMessage(result) .setPositiveButton("关闭", null).show(); }

讲到这里我们应该了解一个dictionary.db中的t_words表的结果,该表只有两个字段:english和chinese。分别表示单词的英文和中文描述。如果要获得单词的中文描述,只需要查找chinese字段即可。如onClick方法中的代码所示。查询单词的效果如图3所示。如果显示以输入字符串开头的单词列表虽然到目前为止,我们的英文词典已经可以正常工作了,但为了方便读者使用,在本节将添加单词输入的自动提示功能。也就是说,如果读者在AutoCompleteTextView组件中输入单词的前几个字母,该组件就会自动列出数据库中所有以该字符串开头的单词。效果如图2所示。拥有这样的功能就可以使用户在只知道单词的前几个字母时也可以查找到相应的单词。由于AutoCompleteTextView组件使用了自定义的Adapter类,下面先给出这个自定义的Adapter类的完整代码。

publicclass DictionaryAdapter extendsCursorAdapter {privateLayoutInflater layoutInflater; @OverridepublicCharSequence convertToString(Cursor cursor) {return cursor == null ? "": cursor.getString(cursor .getColumnIndex("_id")); }//用于将_id字段(也就是english字段)的值设置TextView组件的文本//view参数表示用于显示列表项的TextView组件privatevoidsetView(View view, Cursor cursor) { TextView tvWordItem=(TextView) view; tvWordItem.setText(cursor.getString(cursor.getColumnIndex("_id"))); } @OverridepublicvoidbindView(View view, Context context, Cursor cursor) { setView(view, cursor); } @OverridepublicView newView(Context context, Cursor cursor, ViewGroup parent) { View view= layoutInflater.inflate(R.layout.word_list_item, null); setView(view, cursor);returnview; }public DictionaryAdapter(Context context, Cursor c, booleanautoRequery) {super(context, c, autoRequery);//通过系统服务获得LayoutInflater对象layoutInflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } }

在编写DictionaryAdapter类时应注意如下3点:1. 为了将Cursor对象与AutoCompleteTextView组件绑定,DictionaryAdapter类必须从CursorAdapter类继承。2.由于CursorAdapter类中的convertToString方法直接返回了Cursor对象的地址,因此,在DictionaryAdapter类中必须覆盖convertToString方法,以返回当前选中的单词。CursorAdapter类中的convertToString方法的源代码。

public CharSequence convertToString(Cursor cursor)

{

//如果cursor不为null,返回Cursor对象的地址(cursor.toString())

return cursor == null ? “” : cursor.toString();}覆盖后的convertToToString方法的源代码如下:public CharSequence convertToString(Cursor cursor){

return cursor == null ? “” : cursor.getString(cursor

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

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

从上面的代码中可以看到,在查询SQL语句中的english字段名的别名是“_id”。4.在DictionaryAdapter类中需要使用bindView和newView方法设置每一个列表项。bindView方法负责设置已经存在的列表项,也就是该列表项已经生成了相应的组件对象。而newView方法负责设置新的列表项,在该方法中需要创建一个View对象来显示当前的列表项。

在本例中使用word_list_item.xml布局文件来显示每一个列表项,代码如下:

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

android英语字典(源代码),android英语字典(内含源码哦)相关推荐

  1. android 随手记 170多个示例demo源码

    下载地址:http://pan.baidu.com/s/101PEN 2012-10-1513:03   2,098,836     AdXmpp(Openfire+asmack+spark) .zi ...

  2. Android 经典示例,初学者的绝好源码资料

    2019独角兽企业重金招聘Python工程师标准>>> Android 经典示例,初学者的绝好源码资料 附上源码: 转载:http://www.adobex.com/android/ ...

  3. Android图片爬虫,看妹纸神器项目源码,ListView单张图片查看

    Android图片爬虫,看妹纸神器项目源码 刚自学完安卓,国庆7七天花了6天纯手写入门级app,从集成图片爬虫到整个项目结束真是一步一个坑. 整个项目没有用框架,都是手写纯属练手,项目中主要用到的技术 ...

  4. (仿微信Android)IM聊天+抢红包+直播+朋友圈源码发布了

    (仿微信Android)IM聊天+抢红包+直播+朋友圈源码发布了 功能概览: IM聊天 单聊/群聊/聊天室--基于环信sdk 红包功能: 1.一对一红包 2.群红包(抢红包.答题红包.专属红包) 3. ...

  5. 安卓Android与H5双向交互MathJax展示数学公式(源码+解析)

    安卓Android与H5双向交互MathJax展示数学公式(源码+解析) 博主就今天周五又做了个需求(安卓Android与H5交互),原来上线的功能是服务器配置过来的学习报告(一个H5页面)并提供原始 ...

  6. 超级应用 - 免费应用内测托管平台|APP应用分发平台|iOS应用分发|Android应用分发|免费应用内测托管平台 源码下载

    网站标题:超级应用 - 免费应用内测托管平台|APP应用分发平台|iOS应用分发|Android应用分发|免费应用内测托管平台源码下载 网站关键词:超级应用(www.awwjd.com) 为您提供测试 ...

  7. Android开发应用案例——简易计算器(附完整源码)

    Android开发-AS学习(一) Android开发-AS学习(二) 使用android studio开发简易计算器app(完整源码可在博主资源中自行下载) 最终效果: 开发步骤: 创建一个名为ca ...

  8. 【Android项目】本地FM收音机开发及源码简析

    [Android项目]本地FM收音机开发及源码简析 目录 1.概述 2.收音机的基本原理 3.收音机其他信息 RDS功能 4.Android开发FM收音机源码解析 5.App层如何设计本地FM应用 6 ...

  9. [附源码]计算机毕业设计Python+uniapp基于Android的移动端校友通 zv2j0(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp基于Android的移动端校友通 zv2j0(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环 ...

  10. JAVA毕业设计英语学习网站设计与实现计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计英语学习网站设计与实现计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计英语学习网站设计与实现计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B/S ...

最新文章

  1. 读书方法(如果努力有用的话,那还要天才干什么!)
  2. 分布式锁的3种实现(数据库、缓存[redis]、Zookeeper)
  3. 单片机最小系统制作记录
  4. Spring组件扫描context:component-scan/使用详解
  5. Java学习笔记12——JVM入门
  6. hadoop--集群崩溃处理方法
  7. linux shell调用c 程序设计,linux – 在bash -c中设置变量
  8. python中list的切片和range函数
  9. python如何运行程序_01
  10. qt qml fuzzyPanel 毛玻璃效果
  11. centos出现“FirewallD is not running”
  12. Java 实现图书管理系统
  13. 问道手游服务器修改,分享一下自己架设问道手游经验和教程【图文篇】
  14. 为什么我偏爱用GitHub来写书?
  15. office2010卸载不掉解决办法
  16. 2020/03/11美版iPhone卡贴ICCID完美激活!
  17. java个人银行账户管理程序代码改写
  18. 两大「宇宙中心」之争:未来科技城如何一步步落后奥体?
  19. 申请加精—ERP实施方法论的比较(SAP、 Oracle、J.D.E、BANN、用友等实施方法论)...
  20. vscode终端无输出

热门文章

  1. codeforces1395D 贪心
  2. 计算机网络————IP地址分类以及网络地址的计算
  3. 干支纪年法简便算法_高中化学分类学法指导,附高考化学必记知识点及规律
  4. CF85D Sum of Medians
  5. MeterSphere案例分享丨易盛信息MeterSphere接口测试使用经验
  6. 容联云短信验证--java后台
  7. python贷款_python算账,贷款表
  8. 水晶苍蝇拍(14):战胜人性,值得珍藏的投资感悟!
  9. 电报注册_更秘密的电报
  10. 查看CUDA,GPU对应计算能力