Android Studio实现记单词App,背完四六级一次过~
创始人
2024-04-09 13:36:11
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!

在这里插入图片描述

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...