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

2023-11-17

1.1设计目标 

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

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

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

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

1.2设计思路

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

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

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

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

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

图1-1  思维导图

1.3设计内容

1.3.1界面设计

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

1.3.2功能模块设计

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

系统功能结构图如图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技术方案

  1. 界面美观、易用、友好,使用流畅,布局合理;
  2. 注意编码规范,命名规范,合理添加注释;
  3. MVP 模式 Sqlite数据库
  4. 技术要求,主要使用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 欢迎页面功能

  1. 使用viewpage进行页面布局;
  2. 通过viewpage加载多种图片 可以滑动的方式
  3. 停留一会让用户看见启动页面广告

2.3.2首页功能

  1. 页面上方使用了Mui轮播图;
  2. 轮播图上添加搜索框,点击后可进行运动场馆、价格搜索;
  3. 页面有最新咨询,场馆推荐等功能,使用了Mui页面跳转功能;
  4. 首页有场馆预定,订单查看等功能,都用了Mui矿建进行页面跳转。

2.3.3搜索

  1. 检索输入信息,根据输入信息查找单词对应的中文信息
  2. 监听按键完成进行搜索
  3. 通过查找的模糊信息可能返回列表,通过recycleview展示词汇
  4. 搜索失败则不展示信息

2.3.4单词生词本查看

  1. 背诵的单词不认识默认加入生词本中
  2. 查看生词本信息
  3. 生词本单词复习,记住之后可以删除改单词
  4. Recycleview的形式展示

2.3.5我的页面

  1. 主要是对应的学习单词汇总信息,单词库,词汇,学习进度等等
  2. 显示打卡信息,学习多少天,展示打卡信息
  3. 词汇信息展示
  4. 记录每周的学习情况

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性能特点

  1. 单词背诵,对单词的中文和发音并进行校验,有相关的信息提示;
  2. 兼容性比较好,Android系统都支持安装
  3. 该APP界面友好,用户操作起来无难度,易于掌握,便捷用户的使用体验;
  4. 该APP兼容性强,模块功能明确,模块化程度高。

3.1.3创新之处

  1. 兼容性强,占用空间较小,且操作简单明了,容易上手;
  2. 维护方便、快速,页面功能设计明确。

3.2毕业设计总结

3.2.1归纳总结

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

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

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

3.2.2待解决的问题

  1. 数据使用的时sqlite静态数据,并没有实时连接到远程数据库
  2. 目前词汇量并不是很大
  3. 页面中,打卡计算问题还是对词汇量的统计等
  4. 并未部署到云服务器中去。

3.2.3改进意见

  1. 查询英文不仅仅是本地,需要远程查询;
  2. 词汇量信息不够全;
  3. 资讯列表没有维护,基本上都是假数据;
  4. 将项目部署到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)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Android系统英语学习助手APP设计开发 的相关文章

随机推荐

  • Graph Neural Network-Based Anomaly Detection in Multivariate Time Series 代码配置及解析

    可以在GPU上跑通的代码 含数据集 我已经放到了以下链接 链接 https pan baidu com s 1gM4KTbRNHzfbGEGgvEjXAw 提取码 e7wu 在服务器上跑 先创建一个虚拟环境 conda create n G
  • 算法——B树,B-树,B+树,B*树全面解析笔记

    算法 B树 B 树 B 树 B 树全面解析笔记 https www cnblogs com lianzhilei p 11250589 html http blog codinglabs org articles theory of mys
  • 【QT】混合UI设计

    虽然利用Designer和代码的设计方式都可以开发GUI 但是毫无疑问的是最有效的开发方式是利用两者进行混合开发 下面这个实验例子来自 QT5 9 C 开发指南 我做了小部分修改 最终效果是这样 图标导入 这次我们要开发的是一个有工具栏 菜
  • 哈希表——哈希表的概念,哈希表的实现(闭散列,开散列)详细解析

    作者 努力学习的少年 个人简介 双非大二 一个正在自学c 和linux操作系统 写博客是总结知识 方便复习 目标 进大厂 如果你觉得文章可以的话 麻烦你给我点个赞和关注 感谢你的关注 种一颗树最好是10年前 其次是现在 目录 哈希概念 哈希
  • 实战怎么用u盘重装系统

    当电脑系统出现故障问题无法进系统的情况下 我们可以通过制作u盘启动盘进pe系统进行修复或者重装系统解决 不过很多网友不知道怎么用u盘重装系统 今天小编就给大家分享一个简单易操作的u盘重装系统教程 具体的步骤如下 1 先在一台可用的电脑上下载
  • nodejs服务后台持续运行三种方法

    网上看到的 用了第二种方式OK的 自己备份保存下 一 利用 forever forever是一个nodejs守护进程 完全由命令行操控 forever会监控nodejs服务 并在服务挂掉后进行重启 1 安装 forever npm inst
  • 微信小程序之内嵌网页(webview)

    微信小程序提供了新的开放能力 它终于开放了在小程序中内嵌HTML页面的功能 从微信小程序基础库1 6 4开始 我们就可以在小程序内放置一个
  • 蓝桥杯大赛— —每日一题(6、走方格)

    走方格 题目描述 在平面上有一些二维的点阵 这些点的编号就像二维数组的编号一样 从上到下依次为第 1 至第 n 行 从左到右依次为第 1 至第 m 列 每一个点可以用行号和列号来表示 现在有个人站在第 1 行第 1 列 要走到第 n 行第
  • Redis可以代替MySQL作为数据库吗

    Redis可以代替MySQL作为数据库吗 当使用Redis作为数据库时 以下是一些基本的代码示例 1 连接到Redis服务器 2 存储和获取数据 3 列表操作 4 有序集合操作 6 键过期和删除 Redis作为数据库时 下面是一些更复杂的代
  • 如何基于G6进行双树流转绘制?

    1 背景 业务背景 CRM系统随着各业务条线对线索精细化分配的诉求逐渐增加 各个条线的流向规则会越来越复杂 各个条线甚至整个CRM的线索流转规则急需一种树形的可视化的图来表达 技术背景 在开发之前考虑了三种方案 原生canvas fabri
  • STM32 同个定时器 采用2个通道输入捕获

    工作中遇到 做点总结 之前看CSDN 找到一种写法 就是 把中断中的 CAPTURE VAL 的值 变成 date1 date2 去保存 但是我的写法不成功 一位大佬帮忙改成功了 总结我的写法错误之处 主函数区别 我把date1 清0 放后
  • java longlong_java Long long

    在Java中执行如下的代码 long number 26012402244 编译的时候会出现一个错误 提示 过大的整数 32322355744 如果在Eclipse中书写上面的代码 提示的是 The literal 26012402244
  • DrawerLayout与FragmentTabHost结合模仿oschina主界面

    1 DrawerLayout实现侧滑菜单 drawerlayout是官方出的侧滑菜单控件 使用起来非常方便 将它当作LinearLayout一样的布局控件 完成布局xml文件
  • 安全(六种核心安全机制-加密、密钥、签名与证书)

    安全要解决什么问题 你都会的密码术 安全机制之对称加密 安全机制之非对称加密 安全机制之密钥交换 安全机制之消息摘要 安全机制之电子签名 安全机制之证书与PKI 一 在典型的场景中 安全主要用于解决4类需求 1 保密 Security Co
  • Load balancer does not have available server for client问题

    Load balancer does not have available server for client问题 是因为消费端没有调用成功服务端 下面四步是必备的 可以检查一番 1 写nacos发现的启动类注解 SpringBootApp
  • statsmodels 笔记:seasonal_decompose 时间序列分解

    1 使用方法 statsmodels tsa seasonal seasonal decompose x model additive filt None period None two sided True extrapolate tre
  • [Nowcoder / POJ2728] 最优比率生成树

    Nowcoder链接 POJ链接 题目描述 David the Great has just become the king of a desert country To win the respect of his people he d
  • 单例模式的6种实现方式

    单例模式的6种实现方式 一 单例模式的定义 定义 确保一个类只有一个实例 并提供该实例的全局访问点 这样做的好处是 有些实例 全局只需要一个就够了 适用单例模式就可以避免一个全局适用的类 频繁的创建和销毁 耗费系统资源 二 单例模式的设计要
  • C++函数指针应用例子

    C 函数指针应用例子 前段时间在写代码的时候 想让程序根据一个函数运行出的结果 从四个函数中自动选择一个函数运行 这四个函数我们就取名叫 value 0 value 1 value 2 value 3 假设value 0是这样的 int v
  • 基于Android系统英语学习助手APP设计开发

    一 设计思路 1 1设计目标 1 2设计思路 1 3设计内容 1 3 1界面设计 1 3 2功能模块设计 1 3 3功能流程图 1 3 4数据库设计 如果没有数据库这部分删除 1 4工具设备要求 1 5技术方案 二 设计过程与说明 2 1技