Android单词学习APP - LearnWordActivity功能解析与代码实现
LearnWordActivity功能解析与代码实现
LearnWordActivity是Android单词学习APP中负责单词学习功能的核心活动,主要实现了背单词、听写、提示、删除等功能,并根据不同的学习模式进行界面更新。
1. 编程思路
LearnWordActivity继承自BaseActivity并实现了View.OnClickListener接口,并在onCreate()方法中初始化各个控件并设置适配器。根据传入的currentMode变量,选择不同的学习模式,并调用updateStatus()方法更新界面。
在updateStatus()方法中,更新学习状态,包括当前学习的单词、单词的释义、例句、学习进度等。
在onClick()方法中,处理各个控件的点击事件,例如点击“知道了”按钮更新学习进度,点击“不知道”按钮跳转到单词详情页面,点击语音播放按钮播放单词发音等。
2. 设计思路
单词的学习主要分为两种模式:新学和复习。
- 新学模式:学习新单词,不需要选择正确的释义。
- 复习模式:需要选择正确的释义,用户可以点击“知道了”或“不知道”按钮表示是否掌握该单词。
如果用户不掌握该单词,则跳转到单词详情页面,以便更好地学习;如果用户掌握该单词,则更新学习进度,并随机选择下一个单词进行学习。同时,用户可以点击语音播放按钮,听单词的发音。
3. 用到的方法
- onCreate()方法:初始化各个控件并设置适配器。
- init()方法:初始化各个控件。
- updateStatus()方法:更新学习状态,包括当前学习的单词、单词的释义、例句、学习进度等。
- onClick()方法:处理各个控件的点击事件。
- showLearn()方法:展示学习模式。
- showReview()方法:展示复习模式。
代码示例
public class LearnWordActivity extends BaseActivity implements View.OnClickListener {
private RecyclerView recyclerView;
private RelativeLayout layoutDelete, layoutVoice, layoutTip;
private List<ItemWordMeanChoice> wordMeanChoices = new ArrayList<>();
private LinearLayout layoutBottomReview;
private LinearLayout layoutBottomLearn;
private TextView textWord, textWordPhone;
private TextView textLastWord, textLastWordMean;
private int[] randomId;
private RelativeLayout cardKnow, cardNotKnow, cardDark;
private CardView cardTip;
private TextView textTip;
// 记录上一个单词
public static String lastWord;
public static String lastWordMean;
private TextView textLearnNum, textReviewNum;
private MeanChoiceAdapter meanChoiceAdapter;
private static final String TAG = "LearnWordActivity";
public static boolean needUpdate = true;
// 学习时间记录
private long startTime = -1;
public static final String MODE_NAME = "learnmode";
public static final int MODE_GENERAL = 1;
public static final int MODE_ONCE = 2;
private int currentMode;
private String tipSentence;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_learn_word);
init();
currentMode = getIntent().getIntExtra(MODE_NAME, MODE_GENERAL);
startTime = TimeController.getCurrentTimeStamp();
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
meanChoiceAdapter = new MeanChoiceAdapter(wordMeanChoices);
meanChoiceAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(RecyclerView parent, View view, int position, ItemWordMeanChoice itemWordMeanChoice) {
if (MeanChoiceAdapter.isFirstClick) {
Log.d(TAG, "选择了:" + itemWordMeanChoice.getId());
Log.d(TAG, "目标是: " + WordController.currentWordId);
// 答错了
if (itemWordMeanChoice.getId() != WordController.currentWordId) {
switch (WordController.currentMode) {
case WordController.REVIEW_AT_TIME:
WordController.reviewNewWordDone(WordController.currentWordId, false);
break;
case WordController.REVIEW_GENERAL:
WordController.reviewOneWordDone(WordController.currentWordId, false);
break;
}
itemWordMeanChoice.setRight(ItemWordMeanChoice.WRONG);
meanChoiceAdapter.notifyDataSetChanged();
MeanChoiceAdapter.isFirstClick = false;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
WordDetailActivity.wordId = WordController.currentWordId;
Intent intent = new Intent();
intent.setClass(LearnWordActivity.this, WordDetailActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(WordDetailActivity.TYPE_NAME, WordDetailActivity.TYPE_LEARN);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(LearnWordActivity.this).toBundle());
MeanChoiceAdapter.isFirstClick = true;
}
}, 250);
} else {
switch (WordController.currentMode) {
case WordController.REVIEW_AT_TIME:
WordController.reviewNewWordDone(WordController.currentWordId, true);
break;
case WordController.REVIEW_GENERAL:
WordController.reviewOneWordDone(WordController.currentWordId, true);
break;
}
itemWordMeanChoice.setRight(ItemWordMeanChoice.RIGHT);
meanChoiceAdapter.notifyDataSetChanged();
MeanChoiceAdapter.isFirstClick = false;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
updateStatus();
MeanChoiceAdapter.isFirstClick = true;
}
}, 250);
}
Log.d(TAG, "id+" + itemWordMeanChoice.getId());
}
}
});
recyclerView.setAdapter(meanChoiceAdapter);
}
private void init() {
recyclerView = findViewById(R.id.recyclerview_word_mean);
layoutBottomReview = findViewById(R.id.layout_word_bottom);
layoutBottomLearn = findViewById(R.id.linear_learn_control);
textWord = findViewById(R.id.text_learn_word);
textWordPhone = findViewById(R.id.text_learn_word_phone);
cardDark = findViewById(R.id.card_dark);
cardDark.setOnClickListener(this);
cardKnow = findViewById(R.id.card_know);
cardKnow.setOnClickListener(this);
cardNotKnow = findViewById(R.id.card_no_know);
cardNotKnow.setOnClickListener(this);
textLearnNum = findViewById(R.id.text_new_num_top);
textReviewNum = findViewById(R.id.text_review_num_top);
textLastWord = findViewById(R.id.text_word_top);
textLastWordMean = findViewById(R.id.text_word_top_mean);
layoutTip = findViewById(R.id.layout_word_tip);
layoutTip.setOnClickListener(this);
layoutDelete = findViewById(R.id.layout_word_delete);
layoutDelete.setOnClickListener(this);
layoutVoice = findViewById(R.id.layout_word_voice);
layoutVoice.setOnClickListener(this);
cardTip = findViewById(R.id.card_lw_tip);
textTip = findViewById(R.id.text_lw_tip);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.card_dark:
if (!TextUtils.isEmpty(tipSentence.trim())) {
textTip.setText(tipSentence);
cardTip.setVisibility(View.VISIBLE);
MediaHelper.play(tipSentence);
} else {
Toast.makeText(this, "暂无提示", Toast.LENGTH_SHORT).show();
}
break;
case R.id.card_no_know:
WordDetailActivity.wordId = WordController.currentWordId;
Intent intent = new Intent();
intent.setClass(LearnWordActivity.this, WordDetailActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(WordDetailActivity.TYPE_NAME, WordDetailActivity.TYPE_LEARN);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(LearnWordActivity.this).toBundle());
WordController.learnNewWordDone(WordController.currentWordId);
break;
case R.id.card_know:
WordController.learnNewWordDone(WordController.currentWordId);
updateStatus();
break;
case R.id.layout_word_tip:
ActivityCollector.startOtherActivity(LearnWordActivity.this, WordDetailActivity.class);
WordDetailActivity.wordId = WordController.currentWordId;
break;
case R.id.layout_word_delete:
WordController.removeOneWord(WordController.currentWordId);
updateStatus();
break;
case R.id.layout_word_voice:
MediaHelper.play(textWord.getText().toString());
break;
}
}
@Override
public void onBackPressed() {
Intent intent = new Intent(LearnWordActivity.this, MainActivity.class);
startActivity(intent);
MediaHelper.releasePlayer();
finish();
}
@Override
protected void onStart() {
super.onStart();
if (needUpdate) {
updateStatus();
needUpdate = false;
}
}
public void updateStatus() {
tipSentence = "";
cardTip.setVisibility(View.GONE);
textLearnNum.setText("新学" + WordController.needLearnWords.size());
textReviewNum.setText("复习" + (WordController.needReviewWords.size() + WordController.justLearnedWords.size()));
WordController.currentMode = WordController.whatToDo();
switch (WordController.currentMode) {
case WordController.REVIEW_AT_TIME:
WordController.currentWordId = WordController.reviewNewWord();
showReview();
break;
case WordController.REVIEW_GENERAL:
WordController.currentWordId = WordController.reviewOneWord();
showReview();
break;
case WordController.NEW_LEARN:
WordController.currentWordId = WordController.learnNewWord();
showLearn();
break;
case WordController.TODAY_MASK_DONE:
switch (currentMode) {
case MODE_GENERAL:
Toast.makeText(this, "已完成今日任务", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(this, FinishActivity.class);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(LearnWordActivity.this).toBundle());
finish();
break;
case MODE_ONCE:
Toast.makeText(this, "复习完毕", Toast.LENGTH_SHORT).show();
onBackPressed();
break;
}
break;
}
Log.d(TAG, "currentId" + WordController.currentWordId);
// 找到该单词的数据
List<Word> words = LitePal.where("wordId = ?", WordController.currentWordId + "").select("wordId", "word", "ukPhone", "usPhone").find(Word.class);
if (!words.isEmpty()) {
Word word = words.get(0);
textWord.setText(word.getWord());
if (word.getUsPhone() != null)
textWordPhone.setText(word.getUsPhone());
else
textWordPhone.setText(word.getUkPhone());
if (WordController.currentMode != WordController.TODAY_MASK_DONE)
new Thread(new Runnable() {
@Override
public void run() {
MediaHelper.play(textWord.getText().toString());
}
}).start();
// 得到该单词的释义
List<Interpretation> interpretations = LitePal.where("wordId = ?", WordController.currentWordId + "").find(Interpretation.class);
StringBuilder stringBuilder = new StringBuilder();
if (!interpretations.isEmpty()) {
stringBuilder.append(interpretations.get(0).getWordType() + ". " + interpretations.get(0).getCHSMeaning());
}
// 得到该单词的例句
List<Sentence> sentences = LitePal.where("wordId = ?", WordController.currentWordId + "").find(Sentence.class);
if (!sentences.isEmpty())
tipSentence = sentences.get(0).getEnSentence();
if (WordController.currentMode == WordController.REVIEW_AT_TIME ||
WordController.currentMode == WordController.REVIEW_GENERAL) {
wordMeanChoices.clear();
// 得到不是该单词的释义
List<Interpretation> interpretationWrongs = LitePal.where("wordId != ?", WordController.currentWordId + "").find(Interpretation.class);
Collections.shuffle(interpretationWrongs);
if (recyclerView.getVisibility() == View.VISIBLE) {
wordMeanChoices.add(new ItemWordMeanChoice(WordController.currentWordId, stringBuilder.toString(), ItemWordMeanChoice.NOTSTART));
// 再添加3个随机意思
for (int i = 0; i < 3; ++i) {
wordMeanChoices.add(new ItemWordMeanChoice(-1, interpretationWrongs.get(i).getWordType() + ". " + interpretationWrongs.get(i).getCHSMeaning(), ItemWordMeanChoice.NOTSTART));
}
// 打乱顺序
Collections.shuffle(wordMeanChoices);
meanChoiceAdapter.notifyDataSetChanged();
}
}
textLastWord.setText(lastWord);
textLastWordMean.setText(lastWordMean);
lastWord = words.get(0).getWord();
lastWordMean = stringBuilder.toString();
} else {
Toast.makeText(this, "发生错误,请重试", Toast.LENGTH_SHORT).show();
onBackPressed();
}
}
private void showLearn() {
recyclerView.setVisibility(View.GONE);
layoutBottomReview.setVisibility(View.GONE);
layoutBottomLearn.setVisibility(View.VISIBLE);
}
private void showReview() {
recyclerView.setVisibility(View.VISIBLE);
layoutBottomReview.setVisibility(View.VISIBLE);
layoutBottomLearn.setVisibility(View.GONE);
}
@Override
protected void onDestroy() {
super.onDestroy();
needUpdate = true;
long endTime = TimeController.getCurrentTimeStamp();
long duration = endTime - startTime;
startTime = -1;
LearnTime learnTime = new LearnTime();
List<LearnTime> learnTimeList = LitePal.where("date = ?", TimeController.getPastDateWithYear(0)).find(LearnTime.class);
if (learnTimeList.isEmpty()) {
learnTime.setTime(duration + "");
learnTime.setDate(TimeController.getPastDateWithYear(0));
learnTime.save();
} else {
int lastTime = Integer.valueOf(learnTimeList.get(0).getTime());
learnTime.setTime((lastTime + duration) + "");
learnTime.updateAll("date = ?", TimeController.getPastDateWithYear(0));
}
}
}
代码分析
- 初始化控件:在init()方法中初始化了所有用到的控件,并设置了相应的点击监听。
- 设置RecyclerView:创建RecyclerView的线性布局管理器,并设置适配器。
- 处理点击事件:在onClick()方法中,根据点击的控件ID进行不同的操作,例如播放语音、更新学习进度、跳转到单词详情页面等。
- 更新学习状态:在updateStatus()方法中,根据当前的学习模式更新学习状态,包括当前学习的单词、单词的释义、例句、学习进度等。
- 展示学习模式和复习模式:showLearn()方法和showReview()方法分别展示学习模式和复习模式。
总结
LearnWordActivity是Android单词学习APP中非常重要的一个模块,它实现了背单词、听写、提示、删除等功能,并根据不同的学习模式进行界面更新。本文详细解析了LearnWordActivity的编程思路、设计思路以及代码实现细节,希望可以帮助你更好地理解Android应用开发。
原文地址: https://www.cveoy.top/t/topic/od7e 著作权归作者所有。请勿转载和采集!