实现基于Android的英文词典

jswqx文曲星模拟器:从废弃仓库到开源项目的演变 在电子词典模拟器的开发初期,需求收集和功能定义是至关重要的步骤。需求收集涉及与潜在用户群体的互动,理解他们对于词典应用的期望和需求,包括但不限于:用户词典功能(单语或双语)词汇量及词库深度搜索性能和准确性用户界面的易用性移动端或桌面端的支持多语言支持用户账户与定制化内容通过访谈、问卷调查、论坛、社交媒体等渠道搜集需求后,开发者需要对需求进行整理,筛选出核心需求,以便进行下一步的功能定义。功能定义时需考虑:应用的主要使用场景。 阅读详情

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

  英文词典是手机中经常使用的应用。因此,在本文将结合 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/OPhone开发完全讲义》(本书版权已输出到台湾)

  样章和目录下载
 
互动网   当当网  卓越亚马逊

《人人都玩开心网:Ext JS+Android+SSH整合开发Web与移动SNS》
  样章下载
  互动网

  乐博Android手机客户端(新浪微博) 发布
android小项目之简单词典 一个简单的查词app源码,详细可看: http://krelve.com/android/12.html 立即下载

相关推荐

Android代码-英汉词典

Eng-Chi-Dictionary Englist to Chinese dictionary Android app. This project is released under GNU GPL v2 You could find the review about this app here!

实现基于Android的英文电子词典

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

一个被知识诅咒的人 2157

步步高电子辞典,朗文4988下载软件V1.2.rar

步步高电子辞典,朗文4988下载软件V1.2.rar,解压就能直接使用。绿色版。

AndroidStudio中添加翻译插件:Translation

开发中经常要阅读源码等,就会涉及翻译(特别是英语不好的在下),之前一直是复制到百度或者谷歌进行翻译。终于,偶然找到了一款好用的as内直接用的翻译插件。

set_one_name的博客 4037

Android APP 电子词典

电子词典-注册,登录,生词本,翻译,单词查询,历史记录模块

文曲星电子词典转换器

可以自己制作文曲星中的字典,可以把本专业的词汇放进文曲星中方便查询

android电子英语词典背景介绍,实现基于Android的英文电子词典

本文为原创,如需转载,请注明作者和出处,谢谢!英文词典是手机中经常使用的应用。因此,在本文将结合Android来讨论如何实现一个Android版的英文词典。实现英文词典的方法很多。在本文使用了SQLite数据库来保存英文单词信息。系统通过SQLite数据库中保存的单词信息来查找到与指定英文对应的中文信息。当然,实现这样一个英文词典需要解决一系列技术问题。例如,如何将保存英文单词信息的数据库文件随程...

weixin_33764387的博客 548

解决若依Vue3前后端分离---路由切换时显示白屏

解决基于Vue3若依前后端分离项目中出现的路由正常切换但是就是不显示数据的问题,也就是不发起网络请求的问题。

简单点的博客 1604

使用Android简单实现有道电子词典

前言: 毕业设计的内容,只有Java基础,没学过Android。 本着用到什么学什么,花费了10多个晚上完成毕业设计。 当然,只是简单的实线了电子词典功能,自始至终没有考虑过性能等问题。 本电子词典的数据文件是不错的,有道的API是分析有道电子词典的日志文件得到的,离线的柯林斯词典是Mdict词典的MDX文件转换(https://bitbucket.org/xwang/mdict-anal...

晚晴小筑 1429

CVPR 2027 投稿规划:基于近3年录用率与截稿周期的5步时间管理法

本文为计算机视觉研究者提供CVPR 2027投稿的完整规划指南,基于近三年录用率与截稿周期数据,提出五步时间管理法。涵盖选题策略、实验设计、论文写作、同行评审到最终提交的全流程优化,特别针对CVPR日益激烈的竞争环境(2024年投稿量达11532篇,录取率仅23.6%)提供实用解决方案,帮助研究者提升投稿成功率。

weixin_34079177的博客 1141

31、工程中不确定性量化与优化的全面解析

本文全面解析了工程中不确定性量化与优化的关键方法。针对数据充足与不足两种情况,分别介绍了概率理论和非概率方法在不确定性建模中的应用;系统阐述了采样方法、FORM/SORM、泰勒级数近似等不确定性传播技术;深入比较了RBDO与RDO两种主流优化框架的原理、步骤及适用场景,并通过两杆桁架案例展示了具体实现过程。文章旨在为工程师提供一套完整的从不确定性分析到优化设计的方法论,提升工程系统的可靠性与稳健性。

php55的博客 121

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

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

weixin_42651748的博客 1128

MATLAB 车牌识别系统

车牌识别系统利用计算机视觉和图像处理技术,自动识别车辆牌照上的字符信息。本系统基于 MATLAB 实现车牌识别,包括图像预处理、车牌定位、字符分割、字符识别等模块。车牌识别系统是实现智能交通和公共安全的重要手段,具有广泛的应用前景。MATLAB 提供了丰富的工具和函数,可以方便地进行算法仿真和系统开发。

走向CTO的路上... 701

实现基于Android的英文电子词典使用cursorAdapter

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

lzhang616的专栏 1452

芒果YOLOv12改进13:独家原创改进最新 CFNet 核心结构|即插即用 | 首发改进显著提升检测性能,小目标检测涨点必备

芒果YOLOv12改进13:独家原创改进最新 CFNet 核心结构|即插即用 | 首发改进显著提升检测性能,小目标检测涨点必备

包括YOLOv5、YOLOv7、YOLOv8等模型改进 285

unitree-G1外接 USB 麦克风完整配置指南

首先,将type-c麦克风插入G1机器人的USB口后,记录下USB麦克风的卡号(card)和设备号(device),通常显示为 card 1: Device [USB Audio Device]

m0_47999117的博客 589

实现实现基于Android的英文电子词典修改原先bug

本文章转载于 英文词典是手机中经常使用的应用。因此,在本文将结合Android来讨论如何实现一个Android版的英文词典。实现英文词典的方法很多。在本文使用了SQLite数据库来保存英文单词信息。系统通过SQLite数据库中保存的单词信息来查找到与指定英文对应的中文信息。当然,实现这样一个英文词典需要解决一系列技术问题。例如,如何将保存英文单词信息的数据库文件随程序(apk文件)一起发布;发布

kluing的专栏 2374

032、准谐振反激变换器(QR-Flyback)原理

文章摘要: 本文以65W PD快充炸管案例切入,解析准谐振反激变换器(QR-Flyback)原理。通过主动利用漏感与MOS结电容的谐振,在Vds波谷开通实现近似ZVS,显著降低开关损耗与电压应力。对比传统反激,QR模式轻载效率提升8%,Vds尖峰减少23%。关键设计要点包括:变压器漏感需<3%、谷底检测电路需抗干扰、启动阶段需防过冲。推荐NCP1340等专用控制芯片,并强调VCC电容优选低ESR陶瓷材质。QR适用于30W-150W场景,其核心优势在于轻载效率优化,但需平衡漏感控制与可靠性。作者结合实测数据与

Jack010169的博客 112
上一篇: 内存管理 要精打细算
下一篇: 工厂模式总述
QGJava
博客等级 码龄16年 14粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值