我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于Android的英文词典的实现方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于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类,类的结构如下:


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布局文件来显示每一个列表项,代码如下: 


<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
 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组件WebView编写有道词典小案例分享Android 有道词典的简单实现方法介绍Android网易有道词典案例源码分享


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

基于Android的英文词典的实现方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

基于Android的英文词典的实现方法

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

Android 有道词典的简单实现方法介绍

首先看程序界面如下!1、布局文件: 代码如下:
2022-06-06

Java实现英文句子中的单词顺序逆序输出的方法

本文实例讲述了Java实现英文句子中的单词顺序逆序输出的方法。分享给大家供大家参考,具体如下:题目要求:给定n行的英文句子,要求输出句子中逆序单词后的句子,如:输入:n=3I love youHow are youMy name is Li
2023-05-30

Android基于Http协议实现文件上传功能的方法

本文实例讲述了Android基于Http协议实现文件上传功能的方法。分享给大家供大家参考,具体如下: 注意一般使用Http协议上传的文件都比较小,一般是小于2M 这里示例是上传一个小的MP3文件 1.主Activity:MainActivi
2022-06-06

基于Android中手势交互的实现方法

闲来无事,琢磨琢磨Android中的手势交互,发现网上在手势方面的文章并不是很多,而且很多的参考价值并不大。于是出此博文,与大家共勉。鉴于我写此博文时对手势交互的研究也不是特深,如果有不正确的地方,还请各位博友批评指正。 首先,在Andro
2022-06-06

基于Python实现抢注大词的提词工具

这篇文章主要为大家详细介绍了如何利用Python语言实现抢注大词的提词工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
2023-02-28

基于Java怎样实现一个简单的单词本Android App

这篇文章跟大家分析一下“基于Java怎样实现一个简单的单词本Android App”。内容详细易懂,对“基于Java怎样实现一个简单的单词本Android App”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮
2023-06-29

基于Python如何实现抢注大词的提词工具

本篇内容主要讲解“基于Python如何实现抢注大词的提词工具”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Python如何实现抢注大词的提词工具”吧!假设通过爬虫获得了一个自媒体.txt想要
2023-07-05

Javabean基于xstream包实现转XML文档的方法

本文实例讲述了Javabean基于xstream包实现转XML文档的方法。分享给大家供大家参考,具体如下:1. 所需Jar包:xpp3_min.jarxstream.jar本站下载地址。把这两个jar所添加到项目中2. 添加两个用于测试的j
2023-05-31

Android基于OpenGL的GLSurfaceView创建一个Activity实现方法

本文实例讲述了Android基于OpenGL的GLSurfaceView创建一个Activity实现方法。分享给大家供大家参考,具体如下: Android提供了两个基本的类让我们使用OpenGL ES API来创建和操纵图形:GLSurfa
2022-06-06

利用python实现命令行有道词典的方法示例

前言 由于一直用Linux系统,对于词典的支持特别不好,对于我这英语渣渣的人来说,当看英文文档就一直卡壳,之前用惯了有道词典,感觉很不错,虽然有网页版的但是对于全站英文的网页来说并不支持。索性自己实现一个,基于Python编写的小工具实现有
2022-06-04

基于Android中实现定时器的3种解决方法

在Android开发中,定时器一般有以下3种实现方法:一、采用Handler与线程的sleep(long)方法二、采用Handler的postDelayed(Runnable, long)方法三、采用Handler与timer及TimerT
2022-06-06

Android仿英语流利说取词放大控件的实现方法(附demo源码下载)

本文实例讲述了Android仿英语流利说取词放大控件的实现方法。分享给大家供大家参考,具体如下: 1 取词放大控件 英语流利说是一款非常帮的口语学习app,在app的修炼页面长按屏幕,会弹出一个放大镜,当手指移到某个单词的附近,可以看到该英
2022-06-06

Android基于Intent实现Activity之间数据传递的方法

本文实例讲述了Android基于Intent实现Activity之间数据传递的方法。分享给大家供大家参考,具体如下: MainActivity:package com.test.intentdemo; import android.app.
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录