英文词典是手机中经常使用的应用。因此,在本文将结合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类,类的结构如下:

public class DictionaryAdapter extends CursorAdapter

{

}

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

private SQLiteDatabase openDatabase()

{

try

{

// 获得dictionary.db文件的绝对路径

String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;

File dir = new File(DATABASE_PATH);

// 如果/sdcard/dictionary目录中存在,创建这个目录

if (!dir.exists())

dir.mkdir();

// 如果在/sdcard/dictionary目录中不存在

// dictionary.db文件,则从res\raw目录中复制这个文件到

// SD卡的目录(/sdcard/dictionary)

if (!(new File(databaseFilename)).exists())

{

// 获得封装dictionary.db文件的InputStream对象

InputStream is = getResources().openRawResource(R.raw.dictionary);

FileOutputStream fos = new FileOutputStream(databaseFilename);

byte[] buffer = new byte[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);

return database;

}

catch (Exception e)

{

}

return null;

}

在openDatabase方法中使用了几个常量,这些常量是在程序的主类(Main)中定义的,代码如下:

public class Main extends Activity implements OnClickListener, TextWatcher

{

private final String DATABASE_PATH = android.os.Environment

.getExternalStorageDirectory().getAbsolutePath()

+ "/dictionary";

private final String DATABASE_FILENAME = "dictionary.db";

}

查询单词

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

database = openDatabase();

其中database是在Main类中定义的SQLiteDatabase类型变量。

然后在查找按钮的单击事件中添加如下的代码来查找英文单词,并显示中文意思。

public void onClick(View view)

{

String sql = "select chinese from t_words where english=?";

Cursor cursor = database.rawQuery(sql, new String[]

{ 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所示。

图3 查询英文单词

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

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

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

public class DictionaryAdapter extends CursorAdapter

{

private LayoutInflater layoutInflater;

@Override

public CharSequence convertToString(Cursor cursor)

{

return cursor == null ? "" : cursor.getString(cursor

.getColumnIndex("_id"));

}

// 用于将_id字段(也就是english字段)的值设置TextView组件的文本

// view参数表示用于显示列表项的TextView组件

private void setView(View view, Cursor cursor)

{

TextView tvWordItem = (TextView) view;

tvWordItem.setText(cursor.getString(cursor.getColumnIndex("_id")));

}

@Override

public void bindView(View view, Context context, Cursor cursor)

{

setView(view, cursor);

}

@Override

public View newView(Context context, Cursor cursor, ViewGroup parent)

{

View view = layoutInflater.inflate(R.layout.word_list_item, null);

setView(view, cursor);

return view;

}

public DictionaryAdapter(Context context, Cursor c, boolean autoRequery)

{

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 void afterTextChanged(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:id="@+id/tvWordItem"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:textAppearance="?android:attr/textAppearanceLarge"

android:gravity="center_vertical"

android:paddingLeft="6dip"

android:textColor="#000"

android:minHeight="?android:attr/listPreferredItemHeight"

/>

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

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。

android 编程词典,基于Android的英文词典的实现方法相关推荐

  1. android 图片绑定按钮,Android编程实现给Button添加图片和文字的方法

    本文实例讲述了Android编程实现给Button添加图片和文字的方法.分享给大家供大家参考,具体如下: //为按钮添加图片和文字的方法 public Spanned getSpan(int id, ...

  2. android 提供的方法,Android编程之创建自己的内容提供器实现方法

    本文实例讲述了Android编程之创建自己的内容提供器实现方法.分享给大家供大家参考,具体如下: 我们学习了如何在自己的程序中访问其他应用程序的数据.总体来说思 路还是非常简单的,只需要获取到该应用程 ...

  3. android中计算日期差,Android编程实现根据不同日期计算天数差的方法

    本文实例讲述了Android编程实现根据不同日期计算天数差的方法.分享给大家供大家参考,具体如下: Calendar cal1 = getCalendarFromDate(mStartDate); l ...

  4. android点击展开内容,Android编程实现Listview点击展开和隐藏的方法

    在android的开发中,listview是应用最广泛的组件之一.虽然已经启动了recycleview,但许多项目仍在使用listview,爱站技术频道小编给大家带来了Android编程实现Listv ...

  5. android支付宝余额怎么做,android编程实现类似于支付宝余额快速闪动效果的方法...

    本文实例讲述了android编程实现类似于支付宝余额快速闪动效果的方法.分享给大家供大家参考,具体如下: 效果如下: 此图片不会动,但实际上是会快速跳动的. 之前看到有支付宝的效果非常牛逼.就是进去看 ...

  6. android编程:调节视频画面分辨率,Android编程实现屏幕自适应方向尺寸与分辨率的方法...

    本文实例讲述了Android编程实现屏幕自适应方向尺寸与分辨率的方法.分享给大家供大家参考,具体如下: Android 屏幕自适应方向尺寸与分辨率,包括屏幕界面布局.多分辨率支持.获取屏幕尺寸.屏幕横 ...

  7. php网站怎么打包成apk,Android编程实现webview将网页打包成apk的方法

    本文实例讲述了Android编程实现webview将网页打包成apk的方法.分享给大家供大家参考,具体如下: 功能非常简单,而且乍一看没什么特别大的用处,因为实际上就是浏览器而已...但如果说网页一开 ...

  8. Android本科毕业设计基于Android的天气预报APP系统(附带源码)

    Android本科毕业设计基于Android的天气预报开发APP系统源码.显示城市当前的实时天气状况,包括城市名称.城市名片.天气情况.温度高低.星期等信息.界面左边有一列城市列表,显示中国各个城市名 ...

  9. android画板需求分析,基于Android的画板的设计与实现论文.doc

    基于Android的画板的设计与实现论文.doc 职场大变样社区( . zcdby. com):下载毕业设计成品全套资料,全部50元以下 毕业设计(论文)任务书 毕业设计(论文)题目: 基于Andro ...

最新文章

  1. ssh终端远程登陆主机命令--笔记
  2. 系统蓝屏的几种姿势,确定不了解下么?
  3. 【Linux】学习历程
  4. 2014年07月21日
  5. Java第十二次作业:继承与抽象类解决工人与学生的问题,抽象类实例。抽象类作用——为多态创造了可能。抽象类的作用总结...
  6. Mouse Without Borders 使用经验
  7. vue项目如何集成良田高拍仪(二次开发)
  8. Python数据分析-绘图-2-Seaborn进阶绘图-4-分类图
  9. 导教班,我的职业续航加油站
  10. java 对齐文本框_如何对齐文本框和旁边的图像按钮
  11. Ubuntu 18.04.1 LTS 安装网易云音乐,告别图标无法点击
  12. 消除span之间的空隙
  13. RabbitMQ开发工具包
  14. 关于“IT学子成长指导”专栏及文章目录
  15. 仓储货架钢结构平台使用的八大原则你知道多少?
  16. 运动会方阵计算机学院,大学运动会方阵入场词
  17. java模拟定位,Android模拟定位
  18. JDBC和数据库事务详解
  19. org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be re
  20. Java二代身份证正则表达式分析

热门文章

  1. 微信二维码扫描下载APK
  2. 【iOS】苹果开发者账号续费问题
  3. 语c语言描写,【萌°语c】『语c』语c基本知识的简单介绍
  4. 2022广东省安全员B证第四批(项目负责人)上岗证题目及在线模拟考试
  5. 最近打算更新一篇图片上传的文档!(一直更新得比较缓慢)
  6. Spring AOP 日志管理
  7. 什么是BI、数据仓库、数据湖和数据中台,他们有什么差异?
  8. firewall添加白名单_详解firewall的规则设置与命令(白名单设置)
  9. 什么是linux云计算?用来做什么?
  10. 基于Nginx以及web服务器搭建在线视频播放