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

android 项目练习:自己的词典app——生词本(一) 前言:自学android差不多两个月了,由于本身对英语不感冒,而且记英语单词总是很快忘记,因此学习的过程也是蛮累的,好多类和方法都不知道啥意思,还要去查词典才知道。 后来,就想找一个背单词的app,可以把我不认识的生词添加到一个生词本,可以快速浏览生词本里的单词,也可以仅仅针对生词本里的词出一些帮助记忆的练习题?又想,既然我在学android,为什么不自己做一个那?于是就有了这个项目练习! 阅读详情

本文章转载于李宁的极客世界李

如果你查的很多词典  你会发现 下下来的很多都不好用,一点击就会闪退,又或者把他们的工程烤下来放到自己的工程结果会闪退,这里我说下原因,主要是我们下载的版本都是android低版本,当我们用到高版本的时候需要读写sd卡的权限。当然小白的我是经过李宁大牛指点才发现的,这里先谢谢李宁老师。

下面就是我转载的内容:宁的极客世界

英文词典是手机中经常使用的应用。因此,在本文将结合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 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对象地址。


这里是改好后源文件的下载地址:http://download.youkuaiyun.com/detail/kluing/7491897


基于Android的英文电子词典应用开发 在项目配置向导中,为您的应用程序选择一个适当的名称和包名。在onCreate方法中,我们获取布局文件中的EditText、Button和TextView实例,并为Button设置一个点击事件监听器。在doInBackground方法中,我们使用HTTPURLConnection发送GET请求到字典API,并获取返回的结果。上述XML布局文件定义了一个垂直方向的线性布局,其中包含一个用于输入单词的EditText、一个用于触发搜索操作的Button,以及一个用于显示结果的TextView。 阅读详情

相关推荐

Android实现简单的电子词典

Android入门学习电子词典,词典数据保存在一个简单的sqlite数据库文件,注释明确,学习必备

基于google android平台电子词典的设计与实现

    基于 google android 平台电子词典软件的 设计与实现                     摘   要 本文阐述了在 Android 平台下电子词典软件的设计与实现过程。其目的是让人们能够在基于 Google Android 平台的移动设...

小白 1694

Android studio字典

安卓字典小程序,不支持on-line有off-line sqlite数据库

基于Android的电子词典应用设计与实现(源码+文档)

安卓Android电子词典、单词本、生词本、语音听写、在线翻译、Excel导入资料

swEngineer16的博客 646

Android开发的电子词典源码

一个简单地的Android开发的电子词典源码用SQLite作为数据可,基本单词还是可以查到的,适合初学者练手,真心不错

Android APP 电子词典

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

基于android的电子词典设计_基于Android的电子词典的设计与实现.doc

摘要:随着信息技术的飞速发展,智能手机的普及应用,手机软件的使用也得到了很好的发展。而当下android操作系统的手机是最为常见的手机操作系统之一,加之人们对学习英语的热度不断提高。因此设计一款便捷高效的电子词典以满足人们的学习需求是很有必要的。在本文中,首先介绍了绪论,包括课题研究背景,课题研究现状以及课题研究的意义,而且详述了本系统需要的相关技术工具。接着介绍了需求分析,对该系统的功能进行了详...

weixin_35880151的博客 989

android实战DeMo--英文词典

android实战DeMo--英文词典

基于android的电子词典设计_基于Android平台下的电子词典的设计与实现

摘要:现如今已经是二十一世纪,以计算机为代表的现代科学获得了蓬勃快速的发展并快速和人们的日常行为结合在一起。同时随着英语对人类的生活有着越来越大的影响,计算机信息技术的发展与进步也使电子语言词典的诞生提供了可能性。在此我设计了这个电子词典,主要实现了用户的登录和注册的功能。在初次使用该词典时,用户需要先注册一个账号,然后使用注册过的账号和密码进行登录。还有就是查询生词功能,用户通过输入一个单词,即...

weixin_26711801的博客 835

android小项目之简单词典

一个简单的查词app源码,详细可看: http://krelve.com/android/12.html

Android中英文电子词典源码(so easy).rar

Android中英文电子词典源码(so easy)

个人博客作业第三周--必应词典分析

第一部分: ___用户采访: 采访对象1:Wsy 1.对象介绍: 湘潭大学网络工程大二学生,初次使用PC版必应(之前用过安卓的,这次谈到的都是针对PC版),他使用词典主要是为了查阅外文文献,或者在读论文的时候需要翻译。 2.使用感受: 查询的成功率还比较高,针对UI界面他觉得“功能都整理到了右上角的按键里,不熟悉的时候基本想不起来那里面有什么功能”,此外,“查询比较便捷,...

weixin_30780221的博客 446

生态位宽度计算&可视化展示(R语言)

物种的生态位越宽,该物种的特化程度就越小,倾向于泛化种(generalist species);物种的生态位越窄,倾向于是一个特化种(specialists species)。生态位宽度是指物种(或其它生物单位)在群落中所利用的各种不同资源的总和。本篇所使用为生态位宽度指数即**Levins的生态位宽度指数。

weixin_53705272的博客 4435

长沙红胖子Qt·西安(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...

长沙红胖子 Qt・西安,本人拥有省级科研团队从业背景,研发团队产出所有项目、产品方案和研发无分包、无外包、无AI代笔,长期深耕双一流体系高精尖技术配套研发。博客主动剥离复杂底层工况机理,专注沉淀高端、特种行业领域Qt工程化落地实战经验。所有内容均为个人梳理总结的通用性工程方法论,只输出可公开的普适技术思路。

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 164万+

UG NX 12.0零基础实战:从草图绘制到三维建模全流程解析

本文详细解析UG NX 12.0从草图绘制到三维建模的全流程,适合零基础用户快速掌握这款工业设计软件。内容涵盖界面设置、基础操作、草图技巧、拉伸旋转建模、布尔运算等核心功能,并通过机械零件实战案例演示完整设计流程,帮助读者系统学习UG NX 12.0的工业设计应用。

weixin_29261711的博客 1172

W5500+STM32F103C8T6进行TCP通信(modbus)

一路生花一、w5500资料二、modbus通信三、从机代码四、总结五、参考 一、w5500资料 w5500的资料就放在下面了,单纯的客户端和其他模式上面有教程 https://www.aliyundrive.com/s/enPnnZgNtpE 二、modbus通信 Modbus RTU通信时使用的数据帧结构如下图,而Moubus TCP通信的数据帧和这个稍微不一样,没有crc检验,因为tcp本就是一种可靠传输协议 这里是Modbus TCP数据帧 公共功能码定义 三、从机代码

junseven164的博客 5777

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

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

晚晴小筑 1429

JAVA:Spring Boot 集成 Baidu UID-Generator ID 生成器

百度UID-Generator是一款高性能分布式ID生成器,支持600万QPS,提供Snowflake扩展版和Cache模式两种实现方式。文章详细介绍了如何在Spring Boot项目中集成该组件,包括Maven依赖配置、MySQL表结构初始化、Spring Boot数据源配置、WorkerId分配策略实现以及UID生成器的核心配置。该方案具有无中心依赖、ID单调递增、支持集群部署等特点,适用于订单号、用户ID等分布式场景。通过缓存模式(Cache-Buffer)可进一步提升性能,满足高并发业务需求。

木头 487

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

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

dongsheng186的专栏 5187

「深度学习之优化算法」笔记(二)优化算法的分类

但是由于生物的局限性,人们所创造出的算法也会有局限性:我们所熟知的生物都生存在三维空间,在这些环境中,影响生物生存的条件比较有限,反应到算法中就是这些算法在解决较低维度的问题时效果很好,当遇到超高维(维度>500)问题时,结果可能不容乐观,没做过实验,我也不敢乱说。当然,他们的目的不是在最佳狩猎位置集合,他们的目的是在过去的途中看是否能发现更加好的狩猎位置,去往已经到过的狩猎地点再次狩猎是没有意义的,因为每个位置获取食物的难易程度是固定的。如果他们的策略是“不跟随最优解”,那么他们的策略是什么呢?

quanzhan_King的博客 1371

时间加强控制图,累计和控制图详细介绍,公式,计算 UCL,LCL,CL, sigma,C#实现

\(k\):参考值(通常取为检测偏移量的一半,例如 \(k = \frac{\delta \sigma}{2}\),\(\delta\)是希望检测的偏移量,\(\sigma\)是过程标准差)。- 示例中假设目标均值 \(\mu_0 = 10.0\),标准差 \(\sigma = 0.5\),参考值 \(k = 0.25\)(检测1σ偏移),控制限常数 \(h = 4\)。例如,若希望检测1个标准差的偏移(\(\delta = 1\)),则 \(k = 0.5\sigma\)。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 812

android英语字典(内含源码哦)

简单仿QQ涂鸦和GO短信涂鸦与手写功能代码和演示(带源码)http://www.eoeandroid.com/thread-194053-1-1.html   Android 4.0 Switch 控件实现http://www.eoeandroid.com/thread-194563-1-1.html   Android数独游戏源码 很炫的启动页http://www.eoeandroid....

weixin_33691817的博客 1008

自然语言处理之话题建模:BERTopic模型详解

BERTopic是一种基于BERT的先进话题建模技术,它结合了BERT的语义理解能力和非参数聚类算法HDBSCAN的灵活性,能够生成高质量、语义丰富的话题。与传统的LDA(Latent Dirichlet Allocation)话题模型相比,BERTopic能够更好地捕捉文本的复杂语义结构,因为它利用了预训练的BERT模型来嵌入文本,从而在话题建模中引入了深度学习的力量。聚类是无监督学习的一种,其目标是将数据集中的样本按照相似性进行分组,每个组称为一个“簇”。

zhubeibei168的博客 4538
上一篇: Fragment简单介绍及其类似与tabhost的底部实现例子
下一篇: Arrays.sort 按字母书序排序
谁是谁的学渣
博客等级 码龄13年 21粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值