本文为原创,如需转载,请注明作者和出处,谢谢!

英文词典是手机中经常使用的应用。因此,在本文将结合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对象中的数据写入其他的目录中相应文件中。在AndroidSDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。

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

解答:AutoCompleteTextView所使用的Adapter是一个自定义的Adapter类,类的结构如下:

publicclassDictionaryAdapterextendsCursorAdapter

{

}

要注意的是,不能将整个数据库中的单词都查出,然后生成一个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方法的实现代码如下:

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文件,则从res\raw目录中复制这个文件到//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];intcount=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)中定义的,代码如下:

publicclassMainextendsActivityimplementsOnClickListener, TextWatcher

{privatefinalString DATABASE_PATH=android.os.Environment

.getExternalStorageDirectory().getAbsolutePath()+"/dictionary";privatefinalString 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"));

}//显示查询结果对话框newAlertDialog.Builder(this).setTitle("查询结果").setMessage(result)

.setPositiveButton("关闭",null).show();

}

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

查询单词的效果如图3所示。

图3查询英文单词

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

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

由于AutoCompleteTextView组件使用了自定义的Adapter类,下面先给出这个自定义的Adapter类的完整代码。

publicclassDictionaryAdapterextendsCursorAdapter

{privateLayoutInflater layoutInflater;

@OverridepublicCharSequence convertToString(Cursor cursor)

{returncursor==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;

}publicDictionaryAdapter(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方法的源代码。

publicCharSequence convertToString(Cursor cursor)

{//如果cursor不为null,返回Cursor对象的地址(cursor.toString())returncursor==null?"": cursor.toString();

}

覆盖后的convertToToString方法的源代码如下:

publicCharSequence convertToString(Cursor cursor)

{returncursor==null?"": cursor.getString(cursor

.getColumnIndex("_id"));

}

在这里要注意一下,当选中AutoCompleteTextView组件中单词列表中某一个单词后,系统会用convertToString方法的返回值来设置AutoCompleteTextView组件中的文本。因此,必须使用Cursor的getString来获得相应的字段值。

3.由于将Cursor对象与Adapter绑定时必须要有一个叫“_id”的字段,因此,在本例中将english字段名映射成了“_id”字段。

为了监视AutoCompleteTextView组件中的文本输入情况,需要实现android.text.TextWatcher接口。在该接口中只需要实现afterTextChanged方法即可,代码如下:

publicvoidafterTextChanged(Editable s)

{//必须将english字段的别名设为_idCursor cursor=database.rawQuery("select english as _id from t_words where english like ?",newString[]{ s.toString()+"%"});

DictionaryAdapter dictionaryAdapter=newDictionaryAdapter(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开发 wifi功率,一种基于Android系统的功耗计算方法与流程

    本发明涉及系统功耗 技术领域: ,尤其涉及一种基于Android系统的功耗计算方法. 背景技术: :为了细粒度实时分析系统各部件以及应用程序的功耗特性,并且进一步挖掘用户的日常行为,我们需要建立功耗模 ...

  2. android设备安装kali,在Android设备上安装Kali Linux基于Android设备的Kali Linux渗透测试教程大学霸...

    在Android设备上安装Kali Linux基于Android设备的Kali Linux渗透测试教程大学霸 基于Android设备的Kali Linux渗透测试教程2 Android是一种基于Lin ...

  3. 基于android的电子词典设计_基于Android的电子词典软件的设计与实现 (含外文翻译).doc...

    基于Android的电子词典软件的设计与实现 (含外文翻译) LANZHOU UNIVERSITY OF TECHNOLOGY 毕业设计 题 目 基于Android的电子词典软件的设计与实现 学生姓名 ...

  4. android 恢复出厂设置流程分析,基于Android系统快速恢复出厂设置方法实现.doc

    基于Android系统快速恢复出厂设置方法实现 基于Android系统快速恢复出厂设置方法实现 摘 要:针对使用Android系统的智能电视进行恢复出厂设置时重置速度慢的情况进行了研究和分析,从其重置 ...

  5. android学生信息管理系统PPT讲解,基于Android的学生信息管理及沟通系统的设计与实现毕业论文+选题表+开题报告+设计源码+答辩PPT...

    摘   要 近年来,随着移动互联网和电子信息技术的迅猛发展,使用Android技术开发的手机软件越来越多.人们已经从电脑中解放出来,可以采用更简巧的设备--手机,进行娱乐,工作. 本文通过对Andro ...

  6. android显示温湿度设计与实现,基于Android平台蝴蝶兰大棚温湿度测控系统的设计与实现...

    摘要: 随着物联网技术在农业设施智能化控制方面的广泛应用,温室大棚环境因子的监测与设施的控制也得到了长足的进步.从经济效益角度来说,专业化人才需求的不断增加与劳动力成本的不断提高之间的矛盾,从农业产业 ...

  7. 基于Android的红外测温设计,基于Android的红外三维重构移动APP设计与实现

    摘要: 物体的冷热程度主要依据温度来衡量,在科学进步的过程中也研制出很多测量物体温度的设备,非制冷型红外热成像仪就是应用最为广泛的一种.非制冷型红外热像仪是一种快速测量,非接触式的测温方法,而且成本非 ...

  8. 基于android的水稻叶片特征测量系统,基于Android的水稻叶片特征参数测量系统

    摘要: [目的]提供基于Android的水稻叶片特征参数测量系统,为农学研究提供精准数据.[方法]系统设计主要分为图像获取,图像预处理和特征参数计算3部分:采用智能手机相机获取水稻叶片图像;通过灰度化 ...

  9. android企业手机安全软件开发,基于Android的手机安全管理软件的设计与实现毕业论文.doc...

    本资源来源于互联网,版权为原作者所有.若侵犯到您的版权,请提出指正,我们将立即删除. PAGE 2 年年青岛农业大学 毕 业 论 文(设计) 题 目: 基于Android的手机安全管理软件的 设计与实 ...

最新文章

  1. ImageNet训练再创纪录!谷歌提出1个小时训练EfficientNet,准确率高达83%!
  2. 推荐 查公司信息的一个网站
  3. LumaQQ.NET操作指令制作(3)
  4. c语言解一维波动方程,python绘制一维波动方程(初学者)
  5. python安装mysqlclient报错_Centos 6 – sudo在为Python 3.4安装mysqlclient时...
  6. Redis进阶- Redisson分布式锁实现原理及源码解析
  7. Vue中使用js-cookie插件实现登录时记住密码后存取到Cookie中
  8. Coin-row problem(1139)
  9. centOS6.9下安装Redis
  10. 数学分析教程(科大)——2.5笔记+习题
  11. arcmap10.7打开tif文件一片空白 | 解决方法
  12. python 读bin文件_Python学习 | Python 读写文件-bin文件打开
  13. 生活如此美好 我却如此暴躁
  14. NOIP2021题解~持续更新
  15. 计算机主板有哪些接口,主板硬盘一般有哪些接口
  16. 操作系统Topic推荐-AMiner
  17. 为什么程序员找不到工作:4 个恐怖故事
  18. git与ssh配置方法及注意事项
  19. 第一章 认清机运的本质
  20. python追踪屏幕的移动目标_利用树莓派和Python建立一个简单、便宜的移动目标探测器...

热门文章

  1. 宜信:提升与反思——实习的意义并不止于其本身
  2. 电脑唯独搜不到自己的wifi信号,怎么办
  3. 使用Guardium和WebSphere Application Server监视应用程序用户的数据库活动
  4. 小米路由器linux界面,小米路由器配置ssh登录方法 | 192.168.1.1登陆页面
  5. Picovoice离线语音识别在Linux系统的部署
  6. vue封装上拉菜单组件_Vue的灵活的lil上下文菜单组件
  7. Python爬虫实战 爬取同城艺龙酒店信息
  8. 【经验分享】Web前端开发测试常见问题总结
  9. AGC 012 E Camel and Oases - 状压dp
  10. pt100专用芯片_有没有PT100测温芯片推荐