一、項(xiàng)目概述
本系統(tǒng)包含高考、四級(jí)、六級(jí)、托福和雅思詞匯五個(gè)章節(jié)。每個(gè)章節(jié)分為多個(gè)單元,每個(gè)單元又包含上百個(gè)詞匯??梢栽趩卧斜聿樵?xún)單詞,實(shí)時(shí)記錄每個(gè)單元的閱讀時(shí)間,點(diǎn)進(jìn)單詞詳情頁(yè),有單詞的拼寫(xiě)、音標(biāo)、釋義和例句,底部導(dǎo)航欄可以查看前一頁(yè)和后一頁(yè),還可以進(jìn)行自動(dòng)播放,可以手動(dòng)滑動(dòng)頁(yè)面,右上角可以設(shè)置播放速度。是一款很給力的記單詞軟件。
二、主要技術(shù)
主要應(yīng)用的技術(shù)如下:
Fragment碎片 | ViewPager | SharedPreferences | MediaPlayer |
---|---|---|---|
Handler消息機(jī)制 | SQLiteDatabase | Bundle | ListView |
FileOutputStream | Timer | MediaPlayer | Dialog |
本項(xiàng)目知識(shí)點(diǎn)還是很多的,雖然看起來(lái)功能不算多,但是實(shí)現(xiàn)起來(lái)很不容易。
三、開(kāi)發(fā)環(huán)境
開(kāi)發(fā)環(huán)境依舊是在3.5.1上進(jìn)行開(kāi)發(fā)的,只要你的AS是近兩年從官網(wǎng)下載的,都是可以滿(mǎn)足的。
四、詳細(xì)設(shè)計(jì)
1、數(shù)據(jù)庫(kù)
本項(xiàng)目的數(shù)據(jù)庫(kù)采用已有的單詞數(shù)據(jù)庫(kù)word.db文件,通過(guò)讀文件的方式,從數(shù)據(jù)庫(kù)中讀取存儲(chǔ)的單詞數(shù)據(jù)。
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);
}
與以往的數(shù)據(jù)庫(kù)幫助類(lèi)不同,這次并沒(méi)有提前創(chuàng)建好數(shù)據(jù)庫(kù)和表,而是在歡迎活動(dòng)中調(diào)用構(gòu)造函數(shù)進(jìn)行創(chuàng)建,創(chuàng)建之后會(huì)自動(dòng)執(zhí)行建表語(yǔ)句。
// 創(chuàng)建數(shù)據(jù)庫(kù)和表
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、單詞詳情
首先肯定創(chuàng)建單詞和單元的實(shí)體類(lèi),其實(shí)就是數(shù)據(jù)表的結(jié)構(gòu)。類(lèi)的內(nèi)容就是:類(lèi)的屬性、構(gòu)造函數(shù)、get和set方法。
/**
* 單詞實(shí)體類(lèi)
*/
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;
}
@Override
public int describeContents() {
return 0;
}
@Override
public 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<Word> CREATOR = new Parcelable.Creator<Word>() {
public Word createFromParcel(Parcel source) {
return new Word(source);
}
public Word[] newArray(int size) {
return new Word[size];
}
};
}
單詞詳情包含單詞的拼寫(xiě)、單詞的音標(biāo)、單詞的釋義和單詞的例句,通過(guò)數(shù)據(jù)庫(kù)方法獲取到單詞的這些信息,然后依次填入TextView中,具體實(shí)現(xiàn)起來(lái)肯定還有很多細(xì)節(jié)點(diǎn)。
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() {
@Override
public 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、搜索單詞
在點(diǎn)擊搜索框時(shí),定義了mSearchFgt,用mSearchFgt的fragment先替換UnitList的fragment,然后在檢測(cè)搜索框中有內(nèi)容時(shí),通過(guò)onQueryTextChange
方法獲取數(shù)據(jù)源,并通知適配器更新數(shù)據(jù)源。
@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() {
@Override
public 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;
}
@Override
public boolean onQueryTextChange(String newText) {
ArrayList<Word> words = null;
if (!TextUtils.isEmpty(newText)) {
words = mWordDao.queryWords(mMetaKey, newText);
}
mSearchFgt.refresh(words);
return true;
}
五、運(yùn)行演示
1、啟動(dòng)程序,首先是1s的歡迎界面。
2、主界面包含五大模塊,包含高考、四級(jí)、六級(jí)、托福、雅思五大章節(jié)詞匯。
3、我們選擇雅思模塊,進(jìn)入單元列表界面。
4、選擇Unit1,進(jìn)入單詞列表界面。
5、點(diǎn)進(jìn)任意一個(gè)單詞,我選擇從第一個(gè)單詞開(kāi)始背,發(fā)現(xiàn)是abandon放棄的意思。
6、點(diǎn)擊底部導(dǎo)航欄的后退,提示“已經(jīng)是第一頁(yè)”。
7、點(diǎn)擊前進(jìn),可以自動(dòng)翻到下一頁(yè),看到了第二個(gè)單詞,當(dāng)然我們也可以用手指左右滑動(dòng)。
8、點(diǎn)擊播放,可以按照指定的速度自動(dòng)切換頁(yè)面。
9、點(diǎn)擊右上角菜單按鈕,選擇速度。
10、返回到單元列表,可以看到累積閱讀的時(shí)長(zhǎng),來(lái)制定合理學(xué)習(xí)方案。
11、右上角搜索欄中輸入需要查找的單詞,下面會(huì)顯示符合搜索要求的單詞,原理就是字符串匹配篩選。
12、可以看到我們找到了fresh這個(gè)單詞,點(diǎn)擊進(jìn)入詳情頁(yè)面。退出程序需要雙擊兩次退出鍵才會(huì)退出。
13、最后從六級(jí)詞匯中選擇一個(gè)單詞送給大家,你們都要做自己生活的champion!
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-778444.html
六、源碼獲取
??下面兩種方式都可以獲取源代碼 |
---|
1?? 點(diǎn)擊直接下載 Android Studio 記單詞App |
2??關(guān)注公眾號(hào)《 萌新加油站 》,后臺(tái)回復(fù): 單詞 |
??這有你錯(cuò)過(guò)的精彩內(nèi)容 |
---|
Android Studio實(shí)現(xiàn)外賣(mài)訂餐系統(tǒng) |
Android Studio實(shí)現(xiàn)考試管理系統(tǒng) |
Android Studio實(shí)現(xiàn)天氣預(yù)報(bào)系統(tǒng) |
Android Studio實(shí)現(xiàn)圖書(shū)館訂座系統(tǒng) |
Android Studio實(shí)現(xiàn)前后臺(tái)分離的選課系統(tǒng) |
功崇惟志,業(yè)廣惟勤?!?span toymoban-style="hidden">文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-778444.html
到了這里,關(guān)于Android Studio實(shí)現(xiàn)記單詞App,背完四六級(jí)一次過(guò)~的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!