Android Studio实现记单词App,背完四六级一次过~
创始人
2024-04-09 12:58:36
0

项目目录

  • 一、项目概述
  • 二、主要技术
  • 三、开发环境
  • 四、详细设计
    • 1、数据库
    • 2、单词详情
    • 3、搜索单词
  • 五、运行演示

一、项目概述

本系统包含高考、四级、六级、托福和雅思词汇五个章节。每个章节分为多个单元,每个单元又包含上百个词汇。可以在单元列表查询单词,实时记录每个单元的阅读时间,点进单词详情页,有单词的拼写、音标、释义和例句,底部导航栏可以查看前一页和后一页,还可以进行自动播放,可以手动滑动页面,右上角可以设置播放速度。是一款很给力的记单词软件。

二、主要技术

主要应用的技术如下:

Fragment碎片ViewPagerSharedPreferencesMediaPlayerAdapter
Handler消息机制SQLiteDatabaseBundleSQLiteOpenHelperSharedPreferences
FileOutputStreamTimerMediaPlayerDialogListView

本项目知识点还是很多的,虽然看起来功能不算多,但是实现起来很不容易。

三、开发环境

开发环境依旧是在3.5.1上进行开发的,只要你的AS是近两年从官网下载的,都是可以满足的。

在这里插入图片描述

四、详细设计

1、数据库

本项目的数据库采用已有的单词数据库word.db文件,通过读文件的方式,从数据库中读取存储的单词数据。

public SQLiteDatabase getDatabase() {String path = mContext.getDir(Const.DB_DIR, Context.MODE_PRIVATE) + File.separator + Const.DB_NAME;return SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);
}

与以往的数据库帮助类不同,这次并没有提前创建好数据库和表,而是在欢迎活动中调用构造函数进行创建,创建之后会自动执行建表语句。

  // 创建数据库和表private void initTable() {DBOpenHelper dbOpenHelper = DBOpenHelper.getInstance(this);SQLiteDatabase database = dbOpenHelper.getDatabase();database.execSQL("create table if not exists TABLE_UNIT (" +"Unit_Key integer not null," +"Unit_Time integer not null default 0," +"Cate_Key text references TABLE_META(Meta_Key)" +");");for (String metaKey : Const.META_KEYS) {Cursor cursor = database.rawQuery("select Meta_UnitCount from TABLE_META where Meta_Key=?;", new String[]{metaKey});if (cursor.moveToFirst()) {int count = cursor.getInt(cursor.getColumnIndex("Meta_UnitCount"));for (int i = 1; i <= count; i++) {database.execSQL("insert into TABLE_UNIT (Unit_Key,Unit_Time,Cate_Key) " +"values(?,?,?);", new Object[]{i, 0, metaKey});}}cursor.close();}}

2、单词详情

首先肯定创建单词和单元的实体类,其实就是数据表的结构。类的内容就是:类的属性、构造函数、get和set方法。

/*** 单词实体类*/
public class Word implements Parcelable {//Word_Id, Word_Key, Word_Phono, Word_Trans, Word_Example, Word_Unit;private int mId;private String mKey;private String mPhono;private String mTrans;private String mExample;private int mUnit;public Word() {}public Word(int id, String key, String phono, String trans, String example, int unit) {mId = id;mKey = key;mPhono = phono;mTrans = trans;mExample = example;mUnit = unit;}public int getId() {return mId;}public void setId(int id) {mId = id;}public String getKey() {return mKey;}public void setKey(String key) {mKey = key;}public String getPhono() {return mPhono;}public void setPhono(String phono) {mPhono = phono;}public String getTrans() {return mTrans;}public void setTrans(String trans) {mTrans = trans;}public String getExample() {return mExample;}public void setExample(String example) {mExample = example;}public int getUnit() {return mUnit;}public void setUnit(int unit) {mUnit = unit;}@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeInt(this.mId);dest.writeString(this.mKey);dest.writeString(this.mPhono);dest.writeString(this.mTrans);dest.writeString(this.mExample);dest.writeInt(this.mUnit);}protected Word(Parcel in) {this.mId = in.readInt();this.mKey = in.readString();this.mPhono = in.readString();this.mTrans = in.readString();this.mExample = in.readString();this.mUnit = in.readInt();}public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {public Word createFromParcel(Parcel source) {return new Word(source);}public Word[] newArray(int size) {return new Word[size];}};
}

单词详情包含单词的拼写、单词的音标、单词的释义和单词的例句,通过数据库方法获取到单词的这些信息,然后依次填入TextView中,具体实现起来肯定还有很多细节点。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_detail, container, false);TextView tvExample = (TextView) view.findViewById(R.id.tv_exam);TextView tvKey = (TextView) view.findViewById(R.id.tv_key);TextView tvPhono = (TextView) view.findViewById(R.id.tv_phono);TextView tvTrans = (TextView) view.findViewById(R.id.tv_trans);final Word word = getArguments().getParcelable(Const.WORD_KEY);mImageView = (ImageView) view.findViewById(R.id.icon_speech);mImageView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mOnSpeechListener != null) {mOnSpeechListener.speech(word);}}});if (word != null) {tvExample.setText(word.getExample());tvKey.setText(word.getKey());tvPhono.setText("[" + word.getPhono() + "]");tvTrans.setText(word.getTrans());}return view;
}

3、搜索单词

在点击搜索框时,定义了mSearchFgt,用mSearchFgt的fragment先替换UnitList的fragment,然后在检测搜索框中有内容时,通过onQueryTextChange方法获取数据源,并通知适配器更新数据源。

@Override
public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu_search, menu);MenuItem item = menu.findItem(R.id.menu_item_search);mSearchView = (SearchView) item.getActionView();if (mSearchView != null) {mSearchView.setInputType(InputType.TYPE_CLASS_TEXT);mSearchView.setOnSearchClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mActionBar.setDisplayHomeAsUpEnabled(true);mWordDao = new WordDao(UnitListActivity.this);FragmentTransaction transaction = mFragmentManager.beginTransaction();transaction.hide(mUnitListFgt);if (mSearchFgt == null) {mSearchFgt = SearchFgt.newInstance(mMetaKey);transaction.add(R.id.unit_content, mSearchFgt);} else {transaction.show(mSearchFgt);}transaction.commit();}});mSearchView.setQueryHint(getString(R.string.search_hint));mSearchView.setOnQueryTextListener(this);}return true;
}
 @Overridepublic boolean onQueryTextChange(String newText) {ArrayList words = null;if (!TextUtils.isEmpty(newText)) {words = mWordDao.queryWords(mMetaKey, newText);}mSearchFgt.refresh(words);return true;}

五、运行演示

1、启动程序,首先是1s的欢迎界面。

在这里插入图片描述

2、主界面包含五大模块,包含高考、四级、六级、托福、雅思五大章节词汇。

在这里插入图片描述
3、我们选择雅思模块,进入单元列表界面。

在这里插入图片描述

4、选择Unit1,进入单词列表界面。

在这里插入图片描述

5、点进任意一个单词,我选择从第一个单词开始背,发现是abandon放弃的意思。

在这里插入图片描述

6、点击底部导航栏的后退,提示“已经是第一页”。

在这里插入图片描述
7、点击前进,可以自动翻到下一页,看到了第二个单词,当然我们也可以用手指左右滑动。

在这里插入图片描述

8、点击播放,可以按照指定的速度自动切换页面。

在这里插入图片描述

9、点击右上角菜单按钮,选择速度。

在这里插入图片描述

10、返回到单元列表,可以看到累积阅读的时长,来制定合理学习方案。

在这里插入图片描述

11、右上角搜索栏中输入需要查找的单词,下面会显示符合搜索要求的单词,原理就是字符串匹配筛选。

在这里插入图片描述

12、可以看到我们找到了fresh这个单词,点击进入详情页面。退出程序需要双击两次退出键才会退出。

在这里插入图片描述

13、最后从六级词汇中选择一个单词送给大家,你们都要做自己生活的champion!

在这里插入图片描述

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...