基于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软件编程有所帮助。

(0)

相关推荐

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

    首先看程序界面如下! 1.布局文件: 复制代码 代码如下: <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >

  • Android网易有道词典案例源码分享

    一.相关知识 SearchView控件: 以下是几个简单网址:SearchView简单用法: Android搜索框(SearchView)的功能和用法详解 Android搜索框SearchView属性和用法详解 关于各种搜素: http://android.xsoftlab.net/guide/topics/search/index.html SearchBar控件:大家还可以尝试使用SearchBar控件 WebView控件: (巧妙使用该控件可以开发出很多有创意的应用,而且特别简单) 二.实

  • Android组件WebView编写有道词典小案例分享

    最近学习了WebView组件,写了一个有道词典的小案例,分享给大家,供大家参考,具体内容如下 效果图: 源码下载:https://coding.net/u/gxs1225/p/YouDaoDictionary/git 代码如下: 布局 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schema

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

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

  • php+xml实现在线英文词典查询的方法

    本文实例讲述了php+xml实现在线英文词典查询的方法.分享给大家供大家参考.具体如下: 这里的xml相当于一个数据库.实现:查询某个英文单词,输出它的中文意思. xml文件(数据库):words.xml如下: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <words> <word>  <en>boy</en>  <ch>男孩</ch

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

    闲来无事,琢磨琢磨Android中的手势交互,发现网上在手势方面的文章并不是很多,而且很多的参考价值并不大.于是出此博文,与大家共勉.鉴于我写此博文时对手势交互的研究也不是特深,如果有不正确的地方,还请各位博友批评指正. 首先,在Android系统中,每一次手势交互都会依照以下顺序执行. 1. 接触接触屏一刹那,触发一个MotionEvent事件. 2. 该事件被OnTouchListener监听,在其onTouch()方法里获得该MotionEvent对象. 3. 通过GestureDetec

  • php+xml实现在线英文词典之添加词条的方法

    本文实例讲述了php+xml实现在线英文词典之添加词条的方法.分享给大家供大家参考.具体如下: 接着上一篇<php+xml实现在线英文词典查询的方法>,这里要添加一个功能,提交英文单词和中文意思,将这些信息添加到xml文档中. xml文件(数据库):words.xml 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <words> <word>  <en>

  • Android编程解析XML文件的方法详解【基于XmlPullParser】

    本文实例讲述了Android编程解析XML文件的方法.分享给大家供大家参考,具体如下: 前言 在学习Android的Framework层源码时,Android大量的使用XmlPullParser来解析xml文件的源码.因此,这里也顺道介绍一下XmlPullParser的使用. XML XML(eXtensible Markup Language)中文名为可扩展标记语言.标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等. 用途 XML设计用了传送及携带数据信息,

  • Android编程实现基于BitMap获得图片像素数据的方法

    本文实例讲述了Android编程实现基于BitMap获得图片像素数据的方法.分享给大家供大家参考,具体如下: 网上看到的参考是: int[] pixels = new int[bit.getWidth()*bit.getHeight()];//保存所有的像素的数组,图片宽×高 bit.getPixels(pixels,0,bit.getWidth(),0,0,bit.getWidth(),bit.getHeight()); for(int i = 0; i < pixels.length; i+

  • 基于Android在布局中动态添加view的两种方法(总结)

    一.说明 添加视图文件的时候有两种方式:1.通过在xml文件定义layout:2.java代码编写 二.前言说明 1.构造xml文件 2.LayoutInflater 提到addview,首先要了解一下LayoutInflater类.这个类最主要的功能就是实现将xml表述的layout转化为View的功能.为了便于理解,我们可以将它与findViewById()作一比较,二者都是实例化某一对象,不同的是findViewById()是找xml布局文件下的具体widget控件实例化,而LayoutI

  • Android编程基于距离传感器控制手机屏幕熄灭的方法详解

    本文实例讲述了Android编程基于距离传感器控制手机屏幕熄灭的方法.分享给大家供大家参考,具体如下: 在现实生活中,打电话的时候手机挨着自己的头,屏幕会熄灭,这是为了不让自己的头按到什么手机键~ 这个功能可以使用距离传感器来实现 P-Sensor距离感应器,可以感应手机和人体距离.具体使用用途是在通话过程中打开P-Sensor,那么当手机屏幕贴近用户脸部时,就会自动感应出手机和人体距离是多少.当小于某一个值时,就会熄灭屏幕,不再接收用户触摸屏幕事件,从而有效的防止通话过程中误触摸事件的出现.

  • 基于Android RxCache使用方法详解

    前言 我为什么使用这个库? 事实上Android开发中缓存功能的实现选择有很多种,File缓存,SP缓存,或者数据库缓存,当然还有一些简单的库/工具类,比如github上的这个: [ASimpleCache]:a simple cache for android and java 但是都不是很好用(虽然可能学习成本比较低,因为它使用起来相对简单),我可能需要很多的静态常量来作为key存储缓存数据value,并设置缓存的有效期,这可能需要很多Java代码去实现,并且过程繁琐. 如果您使用的网络请求

  • 基于Android中获取资源的id和url方法总结

    一.获取android工程里面的各种资源的id; 1.1 string型 比如下面: << string name="OK">> 客户端请求成功 << / string>> //string资源中 名称为OK的 id 获取方式 int strId = getResources().getIdentifier("OK", "string", getPackageName()); 1.2 color型

随机推荐