android项目实战-背呗单词DEV07-单词测试实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android项目实战-背呗单词DEV07-单词测试实现相关的知识,希望对你有一定的参考价值。

该篇说明

该篇我们进行单词测试实现讲解

也就是单词测试界面WordExamActivity中功能

布局也需要在xml中实现

但是也需要有单词测试视图类来设置一些值具体查看对照源码

在该界面中,测试完后会更新数据

 

效果如图

技术分享

 

流程图

 技术分享

 

单词测试界面功能流程详解

1> 显示单词测试信息

a> 首先要加载单词测试数据

需要调用单词测试管理模块加载数据功能

private void loadWordExamData() {
      loadingExamDataProgressBar = (ProgressBar)
         findViewById(R.id.loadingExamDataProgressBar);
      loadingExamDataProgressBar.setVisibility(View.VISIBLE);

      new Thread() {
            public void run() {
                new WordExamManager().loadData();
                SystemUtil.sleepvd(2000);
                myHandler.sendEmptyMessage(0);
            }
      }.start();
   }

b> handler处理0的消息并初始及处理逻辑

@SuppressLint("HandlerLeak")
   private void initHandler() {
      myHandler = new Handler() {
         public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
                case 0:
                   wordExamLinearLayout.setVisibility(View.VISIBLE);
                   loadingExamDataProgressBar.setVisibility(View.GONE);
                   init();
                   logic();
                   break;
            }
         }
      };
   }

c> 接着在初始中加载显示单词测试界面

private void loadView() {
      //正确选项随机数
      Global.rightOptionRandom = Math.floor(Math.random() * 4 + 1);
      WordDet wordDet = Global.wordDetList.get(Global.studyedWordId - 1);

      //单词测试标题
      wordExamTitelTextView.setText(wordDet.wordStr + String.format(" /%s/", wordDet.pron));
      WordExamView.initOptions(this);
      WordExamView.setOptionsData(wordDet);
}

 

2> 四个选项添加监听

来实现点击判断选择的正确还是错误。进一步确定执行

监听类请自行查看源码

private void logic() {
      for(int i=1; i<=4; i++) {
         LinearLayout wordExamOptionll = WordExamView.weOptionLLayoutList.get(i-1);
         wordExamOptionll.setOnClickListener(new WordExamOptionClickListener(wordExamOptionll, i));
      }
}

 

3> 测试正确后下一个

a> 跳转下一个

单选正确后自动跳转到下一个

如果是已是最后一个,那么更新数据

public void examNext() {
      Global.studyedWordId += 1;

      if(Global.studyedWordId <= Global.wordList.size()) {
         timer.schedule(new TimerTask() {
            @Override
            public void run() {
                myHandler.sendEmptyMessage(1);
            }
         }, 1000);
      } else if((Global.studyedWordId > Global.wordList.size())) {
         updateData();
      }
}

b> 使用计时器控制1秒后跳转

Handler异步任务处理1的消息测试下个单词

@SuppressLint("HandlerLeak")
   private void initHandler() {
      myHandler = new Handler() {
         public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
                case 1:
                   if(timer != null) {
                      timer.cancel();
                   }
                   timer = new Timer();

                   showNextView();
                   break;
            }
         }
      };
 }

c> 更新数据

如果测试完最后一个,就进行更新数据。

如果从单词背诵界面跳转的,才更新记录次数

private void updateData() {
      clear();

      if(parentStr != null && parentStr.equals("wordDet")) {
         updateDataProgressDialog.setMessage("正在更新数据");
         updateDataProgressDialog.show();     

         new Thread(){
            @Override
            public void run() {
                updateRecordTimes();
            }
         }.start();
      } else if(parentStr.equals("wordList")) {
            Toast.makeText(context,
            Global.selectUnitGroupFlagStr + "单元测组试完,回到单词列表界面!!!",          
            Toast.LENGTH_LONG).show(); 
            toNextView(WordListActivity.class); 
      }
 }

d> 更新次数

> 没有完成次数进度才可设置需要更新数据

> 如果结果记录次数等于需要背诵的次数,则返回到今天任务

进度归0(会存储到数据库),同时需要清空单词记录表及单词表

> 否则返回到单词列表,递增进度(不保存到数据库)

private void updateRecordTimes() {
int recitedtimes = Integer.parseInt(Global.studyPlanObj.lastReciteProgressStr.split("/")[0]); int resultRtimes = 0; if(recitedtimes != Global.defaultReciteTimes) { resultRtimes = recitedtimes + 1; Global.studyPlanObj.lastReciteProgressStr = resultRtimes + "/" + Global.defaultReciteTimes; if(resultRtimes == Global.defaultReciteTimes) { new ReciteManager().updateData(); SystemUtil.sleepvd(2000); myHandler.sendEmptyMessage(2); } else { new ReciteManager().updateReciteProgress(Global.studyPlanObj.lastReciteProgressStr); SystemUtil.sleepvd(2000); myHandler.sendEmptyMessage(3); } } }

 

4> 测试错误后的操作

测试错误后显示按钮操作

> 返回学习按钮,返回单词列表界面进行学习

> 继续测试按钮,重新开始测试

public void showButtonAfterNotRight() {
      returnToStudyButton.setVisibility(View.VISIBLE);
      continueExamButton.setVisibility(View.VISIBLE);

      returnToStudyButton.setOnClickListener(new OnClickListener() {
         @Override
         public void onClick(View v) {
            clear();
            toNextView(WordListActivity.class);
         }
      });

      continueExamButton.setOnClickListener(new OnClickListener() {
         @Override
         public void onClick(View v) {
            Global.studyedWordId = 1;
            Global.examedWordId = 1;

            returnToStudyButton.setVisibility(View.GONE);
            continueExamButton.setVisibility(View.GONE);
            showNextView();
         }
      });  
}

 

单词测试后台功能详解

在加载数据以及更新次数方法使用到了后台模块

使用到了如下模块功能

> 单词测试管理WordExamManager的加载数据loadData()方法

> 背诵管理ReciteManager的更新背诵次数updateReciteProgress()方法

1> 单词测试管理加载数据详解

a> 首先是加载数据方法

public void loadData() {
      if(Global.examWordDetList == null) {
         if(wordDetManager == null) {
            wordDetManager = new WordDetManager();
         }

         List<Word> tmexamWordList = getExamWordList();
         Global.examWordDetList  = wordDetManager.findMoreWordDet(tmexamWordList);
      }
}

b> 获得测试单词范围

private List<Word> getExamWordList() {
      //确定单元及组
      String unitGroupIntro = Global.todayStudyUnitGroupIntroList.get(Global.studyPlanObj.lastUnitGroupIndex);
      int cunit = Integer.parseInt(unitGroupIntro.split("-")[0]);
      int cgroup = Integer.parseInt(unitGroupIntro.split("-")[1]);
      int scopeBegin = -1;
      int scopeEnd = -1;
 
      //确定范围
      if(cunit == 1 && cgroup <= 3) {
         scopeBegin = (cunit - 1) * ReciteConstant.DUNIT_WORD_COUNT + (cgroup+1) * ReciteConstant.DUNITG_WORD_COUNT;
         scopeEnd = scopeBegin + 3 * ReciteConstant.DUNITG_WORD_COUNT;
      } else {
         scopeEnd = (cunit - 1) * ReciteConstant.DUNIT_WORD_COUNT + cgroup * ReciteConstant.DUNITG_WORD_COUNT;
         if(scopeEnd > Global.studyPlanObj.allWordCount) {
            scopeEnd = Global.studyPlanObj.allWordCount - ReciteConstant.DUNITG_WORD_COUNT;
         }
         scopeBegin = scopeEnd - 3 * ReciteConstant.DUNITG_WORD_COUNT;
      }

     
      if(wordDao == null) {
         wordDao = new WordDao();
      }
      String pathStr = PathConstant.STUPLAN_PATH + "sp_" + Global.studyPlanObj.name;
      return wordDao.findScope(scopeBegin, scopeEnd, pathStr);
}

c> 根据单词列表得到单词详解列表

这里引用单词详解模块WordDetManager的查找更多单词详解方法

请查看源码点到该类

public List<WordDet> findMoreWordDet(List<Word> wordList) {
      List<WordDet> wordDetList = new ArrayList<WordDet>();

      for(Word word : wordList) {
         WordDet wordDet = findDetWord(word.wordStr);
         if(wordDet != null) {
            wordDetList.add(wordDet);
         }
      }
   
return wordDetList; }

查找某个单词的单词详解方法

public WordDet findDetWord(String wordStr) {
      if(dictDao == null) {
         dictDao = new DictDao();
      }

      String wordDefinition = dictDao.findWordDefinition(wordStr);
      WordDet wordDet = jsonDefiToDefWord(wordStr, wordDefinition);
      return wordDet;
}

 

2> 背诵管理更新次数详解

更新背诵次数,直接调用相应的dao即可

public void updateReciteProgress(String reciteProgressStr) {
      if(reciteDao == null) {
         reciteDao = new ReciteDao ();
      }

      String pathStr = PathConstant.STUPLAN_PATH + "sp_" + Global.studyPlanObj.name;
      reciteDao.updateReciteProgress(reciteProgressStr, Global.studyPlanObj.name, pathStr);
}

 

 

到此《android项目实战-背呗单词》重点功能及技术介绍完结

更多请自行下载源码解读

应用下载:请点击

源码下载:请点击

以上是关于android项目实战-背呗单词DEV07-单词测试实现的主要内容,如果未能解决你的问题,请参考以下文章

android项目实战-背呗单词DEV06-单词背诵实现

android项目实战-背呗单词DEV05-主界面自定义menu

android项目实战-背呗单词02-项目概述

android项目实战-背呗单词03-项目图表

android dev如何下划线和更改字符串中单词的颜色,如链接颜色

程序员学习和实战指南-AI记单词0.0.1