基于Android系统英语学习助手APP设计开发

发布时间:2024-12-02 05:50

使用英语学习APP进行系统学习 #生活技巧# #英语学习#

设计思路

1.1设计目标 

当代大部分学生都致力于通过大学英语四、六级考试,社会对应英语的应用也是越来越广泛,结合实际情况。众所周知,单词量的积累直接影响到英语考试成绩和工作需要。随着智能手机的普及,基于手机一类的移动终端软件越来越多。建立在Android操作系统上的一系列英语学习软件也都举不胜举。但是随手的应用英语小助手较难找到,结合实际使用和应用的情况需要有一款符合大众使用的Android 英语应用助手。

本软件是一个基于Android技术的学习软件,是在Windows8.1操作系统、Android studio 3.0编译环境下,使用Java编程语言,结合Android中自带的微小但功能强大的SQLite3.0数据库,实现了词库管理、学习模式、复习模式、测试模式、生疏词汇库、以及电子词典等功能。简洁清晰的操作界面,使用起来更加舒适、便捷。全新的拼读功能,发音更加标准。这款大学生英语四、六级学习软件非常有针对性的满足了即将参加大学英语四、六级考试的用户对单词记忆的需求;

很多人在学习英语的时候总是找不到合适的方法,而我自己也是处在漫游学英语的过程当中。有人曾经告诉过我,英语不是死学就能学好的,尤其对于脱离英语这么多年的情况下。要想有效学好英语,用对英语学习工具才是关键。很多人不知道我说的是什么意思,需要选择合适的学习工具,开发了这款应用英语学习助手软件,本程序是通过Android studio 开发,对于平时移动应用课程学习的实践展示。

[1,为什么要做这个项目,描述一下现状;  2,项目要完成的功能]

1.2设计思路

学习英语是非常常态化的一种以前的模式都是过分依赖人或者是通过授课的方式学习英语,那样对时间和学习的成本有很高的要求,如今信息化覆盖几乎是百分之80/90的情况下,大部分都会通过智能设备的方式获取有效资料或者学习有,通过信息化手段快速、精准的安排时间,随时随地都可以学习的英语辅助软件。

第一步:通过应用市场查找和身边学习的状态观察,常见需求:

难于安排琐碎的时间,需要利用琐碎的时间去学习;书本知识太不集中,需要便携式的工具;很难了解自己的学习情况;缺少英语学习的生词本,用笔记录太麻烦。

第二步:学习是记录自己的学习情况,需要通过数据库记录学习单词情况,另外需要了解一些学习的资讯信息:

首页Tab页面 菜单列表和资讯列表 菜单选项包含外刊阅读、高中听力、英语写作、情景对话,语法讲练、每日一句、背单词。单词Tab页面。我的Tab页面 单词书、我的词库、打卡时间、单词进度、设置

图1-1  思维导图

1.3设计内容

1.3.1界面设计

界面主要为主页面,页面设计简洁大方。页面有搜索页面,首页,菜单详情页面,背单词查看页面,生词本介绍页面,词汇页面,个人信息展示页面等。

1.3.2功能模块设计 欢迎页面(启动页面):可以展示广告或者宣传图片。首页功能:首页是搜索、菜单功能和资讯列表,以及跳转页面。单词页面:背单词页面的词汇不熟悉或者不认识的记录在数据库。我的页面:展示打卡时间,学习的英语词汇。学习记录以及尽量学习词汇信息。

系统功能结构图如图1-3所示。

图1-3  功能结构图

1.3.3功能流程图

App功能流程如图1-4示。

图1-4 启动流程图

1.3.4数据库设计(如果没有数据库这部分删除

本系统涉及到3张表,分别是单词信息表、生词表(stuinfo)、学习进度表(tinfo)、各表的表结构如下。

表名称:单词表

字段名称

字段类型(长度)

字段说明

Id

Int

主键

content

String

单词

Day

String

日期

definition

String

中文意思

pron

string

发音

Isflag

String

是否记住

Ext

String

扩展字段

表名称:发布跑腿

字段名称

字段类型(长度)

字段说明

Id

Int

主键

Content

String

单词

definition

String

中文意思

Type

String

类型

Pron

string

发音

Isflag

String

是否生词本

Ext

String

扩展字段

1.4工具设备要求

开发工具:Android studio;

操作系统:Windows10操作系统;

1.5技术方案

界面美观、易用、友好,使用流畅,布局合理;注意编码规范,命名规范,合理添加注释;MVP 模式 Sqlite数据库;技术要求,主要使用sqlite数据库,recycleview  adapter  webview框架等实现。

二、设计过程与说明

2.1技术路线

首页,主要是三个部分,头部是搜索入口,可以查询英文信息,跳转到新的界面,展示查询的单词信息;接下来是展示功能菜单,外刊阅读、高中听力、英语写作、情景对话、语法讲练、每日一句、背单词等菜单功能,根据不同的菜单功能实现不同的功能作用,然后展示资讯列表,展示资讯信息;

2,单词 单词和生词本,记录背单词的不认识的单词信息

3,我的页面主要对单词学习掌握的记录,单词书,我的词库,单词进度等

4,数据库的应用主要是缓存单词数据

2.2实现方案

首页主要是展示两块,一是gridview的展示菜单的方式,外刊阅读、高中听力、英语写作、情景对话、语法讲练、每日一句、背单词。

二是资讯列表,展示学习一些英语的案例,激发学习热情,点燃学习的薪火,坚持学习的动力。

1,首页主要是导航 tab切换 首页,单词,我的页面等其他二级页面

2,首页菜单是通过recycleview 设置GridLayout的方式展示出来的两行四列

3,底部tab按钮切换不同页面的信息

4,首页资讯列表是通过列表的形式,recycleview展示每个item

5,展示查找英文和生词本都是查找数据,然后通过adapter适配器加载到列表中

6,我的页面部分用实验表格的方式展示。

2.3实现原理

2.3.1 欢迎页面功能 使用viewpage进行页面布局;通过viewpage加载多种图片 可以滑动的方式;停留一会让用户看见启动页面广告。 2.3.2首页功能 页面上方使用了Mui轮播图;轮播图上添加搜索框,点击后可进行运动场馆、价格搜索;页面有最新咨询,场馆推荐等功能,使用了Mui页面跳转功能;首页有场馆预定,订单查看等功能,都用了Mui矿建进行页面跳转。 2.3.3搜索 检索输入信息,根据输入信息查找单词对应的中文信息;监听按键完成进行搜索;通过查找的模糊信息可能返回列表,通过recycleview展示词汇;搜索失败则不展示信息。 2.3.4单词生词本查看 背诵的单词不认识默认加入生词本中;查看生词本信息;生词本单词复习,记住之后可以删除改单词;Recycleview的形式展示。 2.3.5我的页面 主要是对应的学习单词汇总信息,单词库,词汇,学习进度等等显示打卡信息,学习多少天,展示打卡信息;词汇信息展示;记录每周的学习情况。

2.4功能描述 

1, 首页主要是导航 tab切换 首页,单词,我的页面等其他二级页面,首页菜单是通过recycleview 设置GridLayout的方式展示出来的两行四列,底部tab按钮切换不同页面的信息

首页资讯列表是通过列表的形式,recycleview展示每个item,展示查找英文和生词本都是查找数据,然后通过adapter适配器加载到列表中,我的页面部分用实验表格的方式展示;

首页,主要是三个部分,头部是搜索入口,可以查询英文信息,跳转到新的界面,展示查询的单词信息;接下来是展示功能菜单,外刊阅读、高中听力、英语写作、情景对话、语法讲练、每日一句、背单词等菜单功能,根据不同的菜单功能实现不同的功能作用,然后展示资讯列表,展示资讯信息;

2,单词 单词和生词本,记录背单词的不认识的单词信息

3,我的页面主要对单词学习掌握的记录,单词书,我的词库,单词进度等

4,数据库的应用主要是缓存单词数据

2.5系统测试方案

测试方案如下表2-1所示。

表2-1  测试方案

测试模式

测试功能

测试步骤

期望效果

功能测试

首页菜单

单击菜单选项进入详情

实现跳转

页面能否跳转

单击页面

页面实现跳转

背诵单词

点击背诵单词,是否进入正常

是否展示单词

单词不认识  是否显示中文和发音

显示正常

生词本

不认识的单词是否进入生词本中,生词本是否显示正常

有生词本并展示正常

2.6遇到的问题及解决措施

问题1:webview加载白屏问题。

解决措施:本地连接判断是否安全证书链接即可。

问题2:存sqlite数据库主键唯一性判断。

解决措施:自增或者唯一值。

问题3:解决权限问题 否则奔溃。

解决措施:需要申请权限。

三、设计成果简介

3.1作品特点

3.1.1技术指标 3.1.2性能特点 单词背诵,对单词的中文和发音并进行校验,有相关的信息提示;兼容性比较好,Android系统都支持安装;该APP界面友好,用户操作起来无难度,易于掌握,便捷用户的使用体验;该APP兼容性强,模块功能明确,模块化程度高。 3.1.3创新之处 兼容性强,占用空间较小,且操作简单明了,容易上手;维护方便、快速,页面功能设计明确。

3.2毕业设计总结

3.2.1归纳总结

首页感谢老师的培养和教导,此项目得与开发还是离不开老师的教导,在开发过程遇到不少问题也是在老师的帮助下完成,主要体现在sqlite数据库的应用,解决疑难问题,调式过程中经常卡克,另外需要感谢同学的鼓励和帮助,是他们一起学习生活中渡过一段时光,在枯燥乏味的日子,同学们的欢声笑语滋润了心田,是他们的一起前行中学习到了每个知识点,课外经常讨论不明白的问题,梳理了不少疑惑。

    此项目离使用还存在很多的不足,希望能在积累知识点的同时继续完善功能,尽量满足每一个功能,能够达到投入使用的状态,解决用户学习英语的需求,主要问题是云交互阶段和跨端的调式,也是我需要继续挖掘和学习的地方;

此项目虽然不是很完美,但是从中学习到了一个项目的整体设计和实现过程,把理论知识应用到实践中,提升实践能力。

3.2.2待解决的问题 数据使用的时sqlite静态数据,并没有实时连接到远程数据库;目前词汇量并不是很大;页面中,打卡计算问题还是对词汇量的统计等;并未部署到云服务器中去。 3.2.3改进意见 查询英文不仅仅是本地,需要远程查询;词汇量信息不够全;资讯列表没有维护,基本上都是假数据;将项目部署到Tomcat服务器中去,有条件可以购买一个云服务器进行部署。

3.3详细设计成果

3.3.1欢迎页面

欢迎页面如图3-1所示。

图3-1  欢迎页面

核心代码:

//欢迎页面

package com.yunus.remember.activity.begin;

import android.content.Intent;

import android.os.Build;

import android.os.Bundle;

import android.view.View;

import com.example.yunus.activity.BaseActivity;

import com.yunus.remember.R;

import com.yunus.remember.activity.chief.MainActivity;

import com.yunus.remember.entity.SevenDaysReview;

import com.yunus.remember.utils.StorageUtil;

import org.litepal.crud.DataSupport;

import java.util.ArrayList;

import java.util.List;

public class WelcomeActivity extends BaseActivity implements Runnable {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_welcome);

        new Thread(this).start();

    }

    @Override

    public void onWindowFocusChanged(boolean hasFocus) {

        super.onWindowFocusChanged(hasFocus);

        if (hasFocus && Build.VERSION.SDK_INT >= 19) {

            View decorView = getWindow().getDecorView();

            decorView.setSystemUiVisibility(

                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE

                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION

                            | View.SYSTEM_UI_FLAG_FULLSCREEN

                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

        }

    }

    @Override

    public void run() {

        try {

            Thread.sleep(3000);

            //todo 添加引导页

            String email = StorageUtil.getString(WelcomeActivity.this, StorageUtil.EMAIL, "qxf323 ");

            if (" ".equals(email)) {

                Intent intent = new Intent(WelcomeActivity.this, LoginActivity.class);

                startActivity(intent);

                finish();

            } else {

                Intent intent = new Intent(WelcomeActivity.this, MainActivity.class);

                startActivity(intent);

                finish();

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

        DataSupport.deleteAll(SevenDaysReview.class);

            List<SevenDaysReview> reviews = new ArrayList<>();

            for (int i = 0; i < 7; i++) {

                SevenDaysReview review = new SevenDaysReview();

                review.setTheDate("2018.05." + (23 + i));

                review.setAllWordsCount(200 + i * 20);

                review.setAllHadCount(100 + i * 20);

                review.setStudiedTime((int) (20 + Math.random() * (60 - 20 + 1)));

                review.setTodayStudiedCount((int) (60 + Math.random() * (100 - 60 + 1)));

                reviews.add(review);

            }

            DataSupport.saveAll(reviews);

    }

}

3.3.2首页

英语助手APP首页如图3-2所示。

图3-2  APP首页

核心代码:

//首页

package com.yunus.remember.adapter;

import android.content.Intent;

import android.os.AsyncTask;

import android.os.Bundle;

import android.support.annotation.Nullable;

import android.support.v4.app.Fragment;

import android.support.v7.view.menu.MenuAdapter;

import android.support.v7.widget.GridLayoutManager;

import android.support.v7.widget.LinearLayoutManager;

import android.support.v7.widget.RecyclerView;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.Button;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.ProgressBar;

import android.widget.TextView;

import com.example.yunus.utils.LogUtil;

import com.google.gson.Gson;

import com.google.gson.reflect.TypeToken;

import com.yunus.remember.R;

import com.yunus.remember.activity.home.DiariesActivity;

import com.yunus.remember.activity.home.TestActivity;

import com.yunus.remember.activity.home.WordsDetailActivity;

import com.yunus.remember.activity.mine.BooksActivity;

import com.yunus.remember.activity.mine.ProgressActivity;

import com.yunus.remember.bean.Menu;

import com.yunus.remember.entity.Book;

import com.yunus.remember.entity.SevenDaysReview;

import com.yunus.remember.entity.TodayWord;

import com.yunus.remember.entity.Word;

import com.yunus.remember.utils.HttpUtil;

import com.yunus.remember.utils.StorageUtil;

import org.litepal.crud.DataSupport;

import java.io.IOException;

import java.sql.Date;

import java.util.ArrayList;

import java.util.List;

import okhttp3.Call;

import okhttp3.Callback;

import okhttp3.FormBody;

import okhttp3.RequestBody;

import okhttp3.Response;

/**

 * Created by yun on 2018/3/29.

 */

public class HomeFragment extends Fragment {

    TextView doneDay;

    TextView newNum;

    TextView todayNum;

    TextView remainNum;

    TextView mineNum;

    TextView btMineNum;

    Button startStudy;

    LinearLayout numLayout;

    LinearLayout welcomeLayout;

    LinearLayout commonLayout;

    TextView addBook;

    ProgressBar progress;

    ImageView allDiary;

    WordsListAdapter menuAdapter;

    HomeListAdapter listAdapter;

    RecyclerView recyclerView,listRecyclerView;

    public HomeFragment() {

    }

    @Nullable

    @Override

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,

                             @Nullable Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.main_pager_home_new, container, false);

        return view;

    }

    @Override

    public void onActivityCreated(@Nullable Bundle savedInstanceState) {

        super.onActivityCreated(savedInstanceState);

        doneDay = getActivity().findViewById(R.id.done_day);

        newNum = getActivity().findViewById(R.id.home_num_new);

        todayNum = getActivity().findViewById(R.id.home_num_today);

        remainNum = getActivity().findViewById(R.id.home_num_remain);

        mineNum = getActivity().findViewById(R.id.home_num_mine);

        btMineNum = getActivity().findViewById(R.id.home_bt_mine);

        startStudy = getActivity().findViewById(R.id.start_study);

        numLayout = getActivity().findViewById(R.id.home_num_layout);

        welcomeLayout = getActivity().findViewById(R.id.home_welcome_layout);

        commonLayout = getActivity().findViewById(R.id.home_common_layout);

        addBook = getActivity().findViewById(R.id.home_add_book);

        progress = getActivity().findViewById(R.id.home_progress);

        allDiary = getActivity().findViewById(R.id.home_calendar);

        recyclerView = getActivity().findViewById(R.id.menu_recycler_view);

        listRecyclerView = getActivity().findViewById(R.id.mlist_recycler_view);

        startStudy.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                Intent intent = new Intent(getActivity(), TestActivity.class);

                startActivity(intent);

            }

        });

        btMineNum.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                Intent intent = new Intent(getActivity(), ProgressActivity.class);

                startActivity(intent);

            }

        });

        addBook.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                Intent intent = new Intent(getActivity(), BooksActivity.class);

                getActivity().startActivity(intent);

            }

        });

        allDiary.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                Intent intent = new Intent(getActivity(), DiariesActivity.class);

                getActivity().startActivity(intent);

            }

        });

        menuAdapter = new WordsListAdapter();

        listAdapter = new HomeListAdapter();

        menuAdapter.setDataList(getContext(),getData());

        listAdapter.setDataList(getContext(),getData());

        recyclerView.setLayoutManager(new GridLayoutManager(getContext(),4));

        recyclerView.setAdapter(menuAdapter);

        listRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

        listRecyclerView.setAdapter(listAdapter);

        menuAdapter.setOnItemClickListener(new WordsListAdapter.OnItemClickListener() {

            @Override

            public void onItemClick(int position) {

                if (position==7){

                    Intent intent = new Intent(getContext(), WordsDetailActivity.class);

                    getActivity().startActivity(intent);

                }else{

                    Intent intent = new Intent(getContext(), DiariesActivity.class);

                    getActivity().startActivity(intent);

                }

            }

            @Override

            public void onClickMoreOp(int position, View view, Menu ArrangeBean) {

            }

            @Override

            public void onClickConnectPrint(int position, Menu ArrangeBean) {

            }

        });

    }

    @Override

    public void onStart() {

        super.onStart();

        if (!StorageUtil.getString(getContext(), StorageUtil.TODAY_DATE, " ").equals(StorageUtil

                .getToday())) {

//

//            commonLayout.setVisibility(View.GONE);

//            numLayout.setVisibility(View.VISIBLE);

//            welcomeLayout.setVisibility(View.VISIBLE);

            startStudy.setText("准备中");

            startStudy.setEnabled(false);

            if (!(DataSupport.count(Book.class) == 0)) {

                new DownloadTask().execute();

            }

        }

        initText();

    }

    private void initText() {

        doneDay.setText(String.valueOf(StorageUtil.getInt(getContext(), StorageUtil.REGISTER_DAY,

                0)));

        newNum.setText(String.valueOf(StorageUtil.getInt(getContext(), StorageUtil

                .TODAY_REAL_NEW_NUM, 0)));

        todayNum.setText(String.valueOf(StorageUtil.getInt(getContext(), StorageUtil.TODAY_NUM,

                0)));

        remainNum.setText(String.valueOf(StorageUtil.getInt(getContext(), StorageUtil

                .TODAY_REMAIN_NUM, 0)));

        mineNum.setText(String.valueOf(StorageUtil.getInt(getContext(), StorageUtil.WORDS_NUM, 0)));

    }

    private Word getWord(int level) {

        if (DataSupport.where("level > 0").count(Word.class) <= 0) {

            return null;

        } else {

            if (DataSupport.where("level = ?", level + "").count(Word.class) == 0) {

                return getWord(level % 5 + 1);

            }

            int importance;

            switch ((int) (Math.random() * 10)) {

                case 0:

                case 1:

                case 2:

                case 3:

                case 4:

                    importance = 3;

                    break;

                case 5:

                case 6:

                case 7:

                    importance = 2;

                    break;

                case 8:

                case 9:

                    importance = 1;

                    break;

                default:

                    importance = 3;

            }

            if (DataSupport.where("level = ? and importance = ?", level + "", importance + "")

                    .count(Word.class) == 0) {

                return getWord(level);

            }

            Word word = DataSupport.where("level = ? and importance = ?", level + "", importance

                    + "").findFirst(Word

                    .class);

            DataSupport.delete(Word.class, word.getId());

            return word;

        }

    }

    class DownloadTask extends AsyncTask<Void, Integer, Boolean> {

        @Override

        protected void onPreExecute() {

            progress.setVisibility(View.VISIBLE);

        }

        @Override

        protected Boolean doInBackground(Void... voids) {

            //前期更新

            if (StorageUtil.getInt(getContext(), StorageUtil.TODAY_NUM, 0) == 0) {

                StorageUtil.updateInt(getContext(), StorageUtil.TODAY_NUM, 100);

            }

            if (StorageUtil.getInt(getContext(), StorageUtil.TODAY_NEW_NUM, 0) == 0) {

                StorageUtil.updateInt(getContext(), StorageUtil.TODAY_NEW_NUM, 20);

            }

            List<Word> allWord = DataSupport.where("level > 0").find(Word.class);

            for (Word word : allWord) {

                word.setImportance(word.getImportance() + 1);

            }

            DataSupport.saveAll(allWord);

            //计算要下载单词量

            int needStudyNum = StorageUtil.getInt(getContext(), StorageUtil.WORDS_NUM, 0) -

                    StorageUtil.getInt(getContext(), StorageUtil.WORDS_STUDIED_NUM, 0);

            if (needStudyNum < StorageUtil.getInt(getContext(), StorageUtil.TODAY_NUM, 100)) {

                StorageUtil.updateInt(getContext(), StorageUtil.TODAY_REAL_NEW_NUM, StorageUtil

                        .getInt(getContext(),

                                StorageUtil.TODAY_NUM, 0) - needStudyNum);

            } else {

                int wordNum = DataSupport.where("importance > 3").count(Word.class);

                if (wordNum >= StorageUtil.getInt(getContext(), StorageUtil.TODAY_NEW_NUM, 20)) {

                    StorageUtil.updateInt(getContext(), StorageUtil.TODAY_REAL_NEW_NUM, 0);

                } else {

                    StorageUtil.updateInt(getContext(), StorageUtil.TODAY_REAL_NEW_NUM,

                            StorageUtil.getInt(getContext

                                    (), StorageUtil.TODAY_NEW_NUM, 0) - wordNum);

                }

            }

            //更新上次登陆记录

            if (DataSupport.where("DATE(theDate) <  DATE('now', '-6 day', 'localtime')").count

                    (SevenDaysReview.class) > 0) {

                DataSupport.deleteAll(SevenDaysReview.class, "theDate < DATE(?)",

                        StorageUtil.getDate(new Date(System.currentTimeMillis()

                                - (long) (6 * 24 * 60 * 60 * 1000))));

            }

            SevenDaysReview lastReview = DataSupport.findLast(SevenDaysReview.class);

            if (lastReview != null &&

                    StorageUtil.getInt(getContext(), StorageUtil.STUDY_TIME, 0) != 0) {

                lastReview.setStudiedTime(StorageUtil.getInt(getContext(), StorageUtil

                        .STUDY_TIME, 0));

                lastReview.setTodayStudiedCount(StorageUtil.getInt(getContext(), StorageUtil

                        .TODAY_STUDY_NUM, 0));

                lastReview.save();

            }

            StorageUtil.updateInt(getContext(), StorageUtil.STUDY_TIME, 0);

            StorageUtil.updateInt(getContext(), StorageUtil.TODAY_STUDY_NUM, 0);

            //本地词库填充

            DataSupport.deleteAll(TodayWord.class);

            int needNum = StorageUtil.getInt(getContext(), StorageUtil.TODAY_NUM, 100) -

                    StorageUtil.getInt(getContext

                            (), StorageUtil.TODAY_REAL_NEW_NUM, 0);

            List<Word> words = DataSupport.where("importance > 3").limit(needNum).order

                    ("importance desc").find(Word.class);

            List<TodayWord> todayWords = new ArrayList<>();

            for (Word word : words) {

                todayWords.add(new TodayWord(word.getSpell(), word.getMean(), word.getPhonogram()

                        , word.getSentence()

                        , 1));

            }

            needNum = needNum - words.size();

            List<Word> saveWords = new ArrayList<>();

            while (needNum > 0) {

                int levelNeed = (needNum + 3) / 4;

                int level;

                for (level = 1; level < 5; level++) {

                    for (int i = 0; i < levelNeed; i++) {

                        saveWords.add(getWord(level));

                        needNum--;

                        if (needNum == 0) {

                            break;

                        }

                    }

                }

            }

            DataSupport.saveAll(saveWords);

            for (Word word : saveWords) {

                todayWords.add(new TodayWord(word.getSpell(), word.getMean(), word.getPhonogram()

                        , word.getSentence()

                        , 1));

            }

            DataSupport.saveAll(todayWords);

            //联网,下载生成今日单词

            RequestBody body = new FormBody.Builder()

                    .add("userId", "" + StorageUtil.getInt(getContext(), StorageUtil.USER_ID, 0))

                    .add("bookId", "" + DataSupport.where("state = -1").findFirst(Book.class)

                            .getId())

                    .add("needNum", "" + StorageUtil.getInt(getContext(), StorageUtil

                            .TODAY_REAL_NEW_NUM, 0))

                    .build();

            HttpUtil.todayWord(body, new Callback() {

                @Override

                public void onFailure(Call call, IOException e) {

                }

                @Override

                public void onResponse(Call call, Response response) throws IOException {

                    String result = response.body().string();

                    LogUtil.d("word", result);

                    Gson gson = new Gson();

                    List<Word> netWords = gson.fromJson(result, new TypeToken<List<Word>>() {

                    }.getType());

                    for (Word word : netWords) {

                        word.setLevel(5);

                        word.setImportance(0);

                        new TodayWord(word.getSpell(), word.getMean(), word.getPhonogram(),

                                word.getSentence(), 1).save();

                    }

                    DataSupport.saveAll(netWords);

                    StorageUtil.updateInt(getContext(), StorageUtil.WORDS_NUM,

                            DataSupport.count(Word.class));

                    //更新今天记录

                    int studiedNum = DataSupport.where("level < 1").count(Word.class);

                    int allNum = DataSupport.count(Word.class);

                    SevenDaysReview newReview = new SevenDaysReview(StorageUtil.getDate(new Date

                            (System.currentTimeMillis())), studiedNum, allNum);

                    newReview.save();

                }

            });

            StorageUtil.updateString(getContext(), StorageUtil.TODAY_DATE, StorageUtil.getToday());

            StorageUtil.updateInt(getContext(), StorageUtil.STUDY_TIME, 0);

            StorageUtil.updateInt(getContext(), StorageUtil.TODAY_REMAIN_NUM,

                    StorageUtil.getInt(getContext(), StorageUtil.TODAY_NUM, 0));

            return true;

        }

        @Override

        protected void onPostExecute(Boolean aBoolean) {

            progress.setVisibility(View.GONE);

            commonLayout.setVisibility(View.VISIBLE);

            startStudy.setText("学习");

            startStudy.setEnabled(true);

            numLayout.setVisibility(View.VISIBLE);

            welcomeLayout.setVisibility(View.GONE);

            initText();

        }

    }

    private List<Menu> getData(){

        List<Menu> list = new ArrayList<>();

        for (int i = 1; i < 9; i++) {

            Menu menu = new Menu();

            if (i==1){

                menu.setName("外刊阅读");

            }

            else if (i==2){

                menu.setName("高中听力");

            }

            else if (i==3){

                menu.setName("高中写作");

            }

            else if (i==4){

                menu.setName("更多");

            }

            else if (i==5){

                menu.setName("情景对话");

            }

            else if (i==6){

                menu.setName("语法讲练");

            }

            else if (i==7){

                menu.setName("每日一句");

            }

            else if (i==8){

                menu.setName("背单词");

            }

            list.add(menu);

        }

        return list;

    }

}

3.3.3背单词详情

APP背单词详情页面如图3-3所示。

图3-3  背单词详情

核心代码:

package com.yunus.remember.activity.home;

import android.content.Intent;

import android.os.Bundle;

import android.support.v7.widget.Toolbar;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.widget.Button;

import android.widget.ImageButton;

import android.widget.TextView;

import android.widget.Toast;

import com.example.yunus.activity.BaseActivity;

import com.yunus.remember.R;

import com.yunus.remember.activity.chief.SearchActivity;

import com.yunus.remember.bean.NeologismWords;

import com.yunus.remember.bean.Words;

import com.yunus.remember.dao.NeologismListDao;

import com.yunus.remember.dao.WordsListDao;

import com.yunus.remember.entity.TodayWord;

import com.yunus.remember.entity.Word;

import com.yunus.remember.utils.StorageUtil;

import java.util.List;

public class WordsDetailActivity extends BaseActivity {

    TextView words;

    TextView pero;

    TextView chains;

    Button next;

    Button wrong;

    TodayWord todayWord;

    long beginTime;

    List<Words> list;

    int count = 0;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_detail);

        WordsListDao wordsListDao = new WordsListDao();

        list = wordsListDao.getContactAll();

        todayWord = getIntent().getParcelableExtra("today_word");

        final Toolbar toolbar = findViewById(R.id.detail_toolBar);

        toolbar.setTitle("背单词");

        setSupportActionBar(toolbar);

        toolbar.setNavigationOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                finish();

            }

        });

        words = findViewById(R.id.words);

        pero = findViewById(R.id.pero);

        next = findViewById(R.id.detail_next);

        wrong = findViewById(R.id.detail_wrong);

        chains = findViewById(R.id.chains);

        final NeologismListDao neologismListDao = new NeologismListDao();

        if (list != null && list.size()>0){

            words.setText(list.get(count).getContent());

            pero.setText(list.get(count).getPron());

        }

        toolbar.setNavigationOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                finish();

            }

        });

        next.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                count ++;

                chains.setVisibility(View.GONE);

                words.setText(list.get(count).getContent());

                pero.setText(list.get(count).getPron());

                chains.setText(list.get(count).getDefinition());

            }

        });

        wrong.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                chains.setVisibility(View.VISIBLE);

                NeologismWords neologismWords = new NeologismWords();

                neologismWords.setId(System.currentTimeMillis()+"");

                neologismWords.setContent(list.get(count).getContent());

                neologismWords.setPron(list.get(count).getPron());

                neologismWords.setDefinition(list.get(count).getDefinition());

                neologismListDao.addOrUpdate(neologismWords);

                chains.setText(list.get(count).getDefinition());

                Toast.makeText(WordsDetailActivity.this,"已加入生词本",Toast.LENGTH_LONG).show();

            }

        });

    }

    @Override

    protected void onStart() {

        super.onStart();

        beginTime = System.currentTimeMillis();

    }

    @Override

    protected void onStop() {

        super.onStop();

    }

}

3.3.4单词管理

  单词管理主要是对单词的编辑,可以修改和删除; 如下图所示

public class RankingFragment extends Fragment implements View.OnClickListener {

    Button allWord;

    Button allTime;

    Button friendWord;

    Button friendTime;

    RecyclerView recyclerView;

    NeologismListAdapter neologismListAdapter ;

    NeologismListDao neologismListDao;

    List<NeologismWords> list ;

    public RankingFragment() {

    }

    @Nullable

    @Override

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable

            Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.main_pager_ranking, container, false);

        return view;

    }

    @Override

    public void onActivityCreated(@Nullable Bundle savedInstanceState) {

        super.onActivityCreated(savedInstanceState);

        allWord = getActivity().findViewById(R.id.ranking_all_word);

        allWord.setOnClickListener(this);

        allTime = getActivity().findViewById(R.id.ranking_all_time);

        allTime.setOnClickListener(this);

        friendWord = getActivity().findViewById(R.id.ranking_friend_word);

        friendWord.setOnClickListener(this);

        friendTime = getActivity().findViewById(R.id.ranking_friend_time);

        recyclerView = getActivity().findViewById(R.id.neoglog);

        friendTime.setOnClickListener(this);

        final NeologismListDao neologismListDao = new NeologismListDao();

        final List<NeologismWords> list = neologismListDao.getContactAll();

        neologismListAdapter = new NeologismListAdapter();

        recyclerView.setAdapter(neologismListAdapter);

        neologismListAdapter.setDataList(getActivity(),list);

        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

        neologismListAdapter.setOnItemClickListener(new NeologismListAdapter.OnItemClickListener() {

            @Override

            public void onItemClick(int position) {

                Toast.makeText(getContext(),"删除",Toast.LENGTH_LONG).show();

                neologismListDao.delete(list.get(position));

                list.remove(position);

                neologismListAdapter.setDataList(getActivity(),list);

            }

            @Override

            public void onClickMoreOp(int position, View view, NeologismWords ArrangeBean) {

            }

            @Override

            public void onClickConnectPrint(int position, NeologismWords ArrangeBean) {

            }

        });

    }

    @Override

    public void onClick(View v) {

        Intent intent = new Intent(getActivity(), RankingActivity.class);

        switch (v.getId()) {

            case R.id.ranking_all_word:

                intent.putExtra("mode", 0);

                break;

            case R.id.ranking_all_time:

                intent.putExtra("mode", 1);

                break;

            case R.id.ranking_friend_word:

                intent.putExtra("mode", 2);

                break;

            case R.id.ranking_friend_time:

                intent.putExtra("mode", 3);

                break;

            default:

                break;

        }

        startActivity(intent);

    }

    @Override

    public void onResume() {

        super.onResume();

        neologismListDao = new NeologismListDao();

        list = neologismListDao.getContactAll();

        neologismListAdapter = new NeologismListAdapter();

        recyclerView.setAdapter(neologismListAdapter);

        neologismListAdapter.setDataList(getActivity(),list);

        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

        neologismListAdapter.setOnItemClickListener(new NeologismListAdapter.OnItemClickListener() {

            @Override

            public void onItemClick(int position) {

                showNormalDialog(position);

            }

            @Override

            public void onClickMoreOp(int position, View view, NeologismWords ArrangeBean) {

            }

            @Override

            public void onClickConnectPrint(int position, NeologismWords ArrangeBean) {

            }

        });

    }

    private void showNormalDialog(final int position){

        /* @setIcon 设置对话框图标

         * @setTitle 设置对话框标题

         * @setMessage 设置对话框消息提示

         * setXXX方法返回Dialog对象,因此可以链式设置属性

         */

        final AlertDialog.Builder normalDialog =  new AlertDialog.Builder(getActivity());

        normalDialog.setTitle("删除");

        normalDialog.setMessage("是否需要删除?"  );

        normalDialog.setPositiveButton("确定",  new DialogInterface.OnClickListener() {

            @Override

            public void onClick(DialogInterface dialog, int which) {

                //...To-do

                Toast.makeText(getContext(),"删除成功",Toast.LENGTH_LONG).show();

                neologismListDao.delete(list.get(position));

                list.remove(position);

                neologismListAdapter.setDataList(getActivity(),list);

            }

        });

        normalDialog.setNegativeButton("取消",  new DialogInterface.OnClickListener() {

            @Override

            public void onClick(DialogInterface dialog, int which) {

                //...To-do

                dialog.dismiss();

            }

        });

        // 显示

        normalDialog.show();

    }

}


四、致谢

首页感谢老师的培养和教导,此项目得与开发还是离不开老师的教导,在开发过程遇到不少问题也是在老师的帮助下完成,主要体现在sqlite数据库的应用,解决疑难问题,调式过程中经常卡克,另外需要感谢同学的鼓励和帮助,是他们一起学习生活中渡过一段时光,在枯燥乏味的日子,同学们的欢声笑语滋润了心田,是他们的一起前行中学习到了每个知识点,课外经常讨论不明白的问题,梳理了不少疑惑。

    此项目离使用还存在很多的不足,希望能在积累知识点的同时继续完善功能,尽量满足每一个功能,能够达到投入使用的状态,解决校园的需求,主要问题是云交互阶段和跨端的调式,也是我需要继续挖掘和学习的地方;

生就像一面镜子,你用什么样的态度去面对她,她就会用同样的结果反馈给你。面对论文,如果你用认真的态度面对它,你所获得的将会是满意的成绩和丰收。论文能够顺利完成,首先需要感谢的就是我的论文指导老师对我的细心指导,同时他也用行动告诉我该怎样去面对社会、面对人生。同时感谢其他给予我帮助的老师和同学。


五、参考文献

[1]李刚彪.数据库加密技术的研讨与完成[D].太原理工大学,2010:18-78.

[2]杨云君.Android的设计与完成[M].北京:机械工业出版社,2013:5-65.

[3]秦明甫.基于混沌实际的数字图像加密研讨[D].重庆大学,2009:34-48.

[4]柯除夕.Android内核分析[M].北京:电子工业出版社,2011:67-98.

[5]李刚.疯狂Android讲义[M].北京:电子工业出版社,2013:12-87.

[6]吴明航.DES和RSA混合加密算法的研讨[D].哈尔滨工业大学,2013:13-56.

[7]顶峰.Linux内存管理的设计与完成[D].沈阳工业大学,2007:45-89

[8]陈最.基于Android平台挪动终端通明加密零碎的研讨与完成[D].重庆理工大学,2012:108-150.

[9]佟晓筠,王翥,杜宇,岳银亮.基于软件平安混合加密技术的研讨[J].计算机工程,2004,23(33):98-100.

[10]程庭,张明慧,石公营.一种基于DES和RSA算法的数据加密方案及完成[J].河南教育学院学报(自然迷信版),2003,22(3):69-71.

[11]XinChen,SongweiMa,BingliGuo,YanWang,JuhaoLi,ZhangyuanChen,YongqiHe.Anovelfragmentation-awarespectrumallocationalgorithminflexiblebandwidthopticalnetworks[J].OpticalSwitchingandNetworking,2014(12):6-22.

[12]廉士国,李忠新,王执铨.两种基于局部加密的图像和视频加密方案[J].计算机工程,2004,4(11):11-34.

[13]Zhu,ZhiwuLiu,XuLi,Xiangyu.RatchetingBehaviorsoftheCarbonFiberReinforcedPEEKComposites:ExperimentalStudyandNumericalSimulation[J].Polymers&PolymerComposite,2014,(221)

网址:基于Android系统英语学习助手APP设计开发 https://www.yuejiaxmz.com/news/view/343551

相关内容

android 大学生生活助手,基于Android的大学生生活小助手设计与开发.doc
android app实现多种语音,基于Android的语音助手APP
基于android校园旧货交易手机软件系统设计.doc
基于Android平台下的健康管理APP/基于android的健康管理系统
基于Android的家庭理财系统的设计与实现
基于Android平台的生活小助手app的设计与实现
基于Android的校园二手闲置物品交易系统设计与实现
基于Android的家庭理财APP的设计与实现(论文+源码)
基于Android系统的智能社区平台系统APP设计与实现(含论文)
基于android个人生活助手app

随便看看