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

news2024/9/30 1:30:10

一、 设计思路

1.1设计目标

1.2设计思路

1.3设计内容

1.3.1界面设计

1.3.2功能模块设计

1.3.3功能流程图

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

1.4工具设备要求

1.5技术方案

二、设计过程与说明

2.1技术路线

2.2实现方案

2.3实现原理

2.3.1 欢迎页面功能

2.3.2首页功能

2.3.3搜索

2.3.4单词生词本查看

2.3.5我的页面

2.4功能描述

2.5系统测试方案

2.6遇到的问题及解决措施

三、设计成果简介

3.1作品特点

3.1.1技术指标

3.1.2性能特点

3.1.3创新之处

3.2毕业设计总结

3.2.1归纳总结

3.2.2待解决的问题

3.2.3改进意见

3.3详细设计成果

3.3.1欢迎页面

3.3.2首页

3.3.3背单词详情

3.3.4单词管理

四、致谢

五、参考文献

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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1025504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#复习:面向对象基本概念

C#复习&#xff1a;面向对象基本概念 前言什么是面向对象类&#xff0c;名称空间的介绍 如何导入类库DLL引用(黑盒引用)项目引用(白盒引用)NuGet介绍 依赖关系C#的分装(个人理解) 前言 关于我C#的博客是根据刘铁猛老师的C#入门课程为基础写的&#xff0c;可以配合刘铁猛老师的…

.bat批处理命令处理文件

批处理命令处理文件找到上级目录&#xff0c;并删除文件与文件夹 参考资料&#xff1a; [BAT] 如何获取bat的上一级目录、上两级目录..._bat 上层目录_Risun_Lee的博客-CSDN博客echo offset currPath%~dp0set parentPathset parentparentPath:beginfor /f "tokens1,* de…

solidworks导出文本能打开的stl文件

几种以文本格式&#xff08;ASCII&#xff09;导出stl的设置 1.solidworks导出时需要在选项里设置导出格式为ASCII&#xff0c;当选择以二进制格式导出时&#xff0c;打开会乱码&#xff1b; 2.CAD直接导出的是以二进制形式导出的&#xff0c;导出后也无法使用文本打开&#xf…

NVIDIA DALI学习:数据加载

DALI的工作流&#xff0c; 如下图&#xff1a; 读取数据图像解码和变换&#xff0c;可以放到GPU上进行&#xff0c;也是加速的关键生成处理好的数据&#xff0c; 导出给计算引擎 测试用例 import ctypesimport numpy as np import nvidia.dali.fn as fn import nvidia.dali…

关于Godot动态生成节点的细节

var dy_btn Button.new()add_child(dy_btn)print(get_child(0).name) 此时获取的名词会带有动态类型&#xff0c;如果这个时候想通过特定的节点名词来获取节点是不行的 此时需要补充类似 dy_btn.name "a" 的代码&#xff0c;然后就能按照节点名词获取节点了

Java下打印九九乘法表

这个算法是基于打直角三角型演变而来&#xff0c;代码如下&#xff1a; public class MyWork {public static void main(String[] args) {for (int i 1; i < 10; i) {for (int j 1; j < i; j) {System.out.print(j "x" i "" i*j "\t&qu…

使用Arduino简单测试HC-08蓝牙模块

目录 模块简介模块测试接线代码测试现象 总结 模块简介 HC-08 蓝牙串口通信模块是新一代的基于 Bluetooth Specification V4.0 BLE 蓝牙协议的数传模块。无线工作频段为 2.4GHz ISM&#xff0c;调制方式是 GFSK。模块最大发射功率为4dBm&#xff0c;接收灵度-93dBm&#xff0c…

软考软件设计师-计算机组成与体系结构(上

软考中级 一、数据的表示如果是其他进制 二、把十进制转其他进制【短除法三、存储系统的层次结构存储系统-存储器的分类 四、把二进制转8进制与16进制二进制转8进制二进制转16进制 五、原码、反码、补码原码反码补码移码原码 反码 补码的取值范围 六、数据的表示-浮点数运算七、…

TienChin 渠道管理-配置字典常量

在字典管理当中添加渠道状态 channel_status&#xff1a;渠道状态 分别为&#xff1a; 正常&#xff0c;键值为1&#xff0c;回显样式为 success 禁用&#xff0c;键值为0&#xff0c;回显样式为 info !> 有个注意点&#xff1a;Vue3 当中 v-for 与 v-if 不能写在一起。 在上…

Linux 查看进程和线程

ps命令 在ps命令中&#xff0c;“-T”选项可以开启线程查看。下面的命令列出了由进程号为<pid>的进程创建的所有线程。 ps -T -p <pid> “SID”栏表示线程ID&#xff0c;而“CMD”栏则显示了线程名称。 你可以用 ps -eLf |grep XXX 来查看程序运行所产生的线程情…

005:vue2使用vue-type-writer实现打字机效果

Vue Type Writer是一个Vue.js 2打字机效果组件&#xff0c;支持像打字机一样模仿键入文本。 文章目录 1. 效果2. 安装使用 1. 效果 2. 安装使用 npm 安装 npm install vue-type-writer --save完整代码 <template><div class"app-container home"><…

MyBatis 高级使用

文章目录 动态SQL语句ifchoosetrimforeach 批量操作批量插入批量更新批量删除BatchExecutor 关联查询嵌套查询延迟加载 分页操作逻辑分页物理分页 MyBatis Generator添加配置文件添加插件生成 通用Mapper方式一方式二 MyBatis-Plus 动态SQL语句 动态 SQL 是 MyBatis 的强大特性…

【运维篇】二、配置文件与多环境控制

文章目录 1、临时属性2、IDEA中的临时属性3、配置文件4级分类4、关于四级分类的思考5、自定义配置文件6、多环境开发&#xff08;yaml版&#xff09;7、配置文件按环境分类8、include与group再细粒度9、一点思考10、多环境开发兼容问题 1、临时属性 jar包或者镜像已经打完了&a…

根据每帧点云的PCD文件和每帧的位姿合成整个点云地图(附python open3d 代码)

现在有多个PCD文件表示每帧的点云,有一个位姿文件,里面是每帧的位姿,需要根据每帧点云和每帧的位姿合成整个地图。 首先,从文件中读取所有点云文件的路径,并将其存储到一个列表中。然后,读取位姿文件,并将其转换为一个 3x4 的矩阵。 然后,遍历所有点云文件。对于每帧点…

如何通过简历展示自己的执行力和动力?

导语: 简历是求职过程中的重要工具&#xff0c;通过合适的展示方式能够有效地展示自己的执行力和动力。本文将分享一些技巧&#xff0c;帮助您在简历中突出这两个关键能力。 突出成就和项目经历: 在简历中详细描述您曾经完成的项目或工作&#xff0c;并着重强调其中的具体成果…

ICS TRIPLEX T9402 自动化控制模块

ICS TRIPLEX T9402 是一款自动化控制模块&#xff0c;通常用于工业自动化和控制系统中&#xff0c;用于监测、控制和自动化各种工业过程。以下是该产品的一些主要特点&#xff1a; 可靠性&#xff1a; T9402 模块通常具有高可靠性&#xff0c;以确保系统能够稳定运行&#xff0…

开学季哪个牌子的电容笔好?ipad2023手写笔推荐

到底是用苹果原装的电容笔&#xff0c;还是用平替的电容笔&#xff0c;这要根据自己的需要来决定&#xff0c;比如经常用在画画上&#xff0c;可以选择苹果原装笔&#xff1b;如果你一天里用来写东西的时间多于用来画画的时间&#xff0c;那你就该考虑一下&#xff0c;买一支更…

基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境Pycharm 环境Scikit-learnt 模块实现1. 数据预处理1&#xff09;加载数据集2&#xff09;时间划分与保存3&#xff09;处理天气预报数据4&#xff09;增加特征5&#xff09;合并特征值 相关其它博客工程源代码下载…

pytest框架前后置设置,以及pytest默认规则

一、pytest框架的默认规则 1、模块名默认必须以test开头或者以test结尾 2、测试类必须以Test开头&#xff0c;并且不能有__init__方法 3、测试方法默认必须以test开头 当然以后的一些默认规则除测试类不能使用__init__方法外其余的都是可配置的&#xff0c;当然一般情况下我们…