Notepad

圖標(biāo).jpg

簡(jiǎn)述:


記事本的第一個(gè)版本,需要完善的還有很多,完成了基本的增刪改查的功能,以及在正文中插入圖片,對(duì)內(nèi)容進(jìn)行分類,根據(jù)內(nèi)容查找等基本功能,對(duì)于刪除添加了回收站機(jī)制,可在回收站中對(duì)已刪除的內(nèi)容進(jìn)行恢復(fù)或者永久刪除
暫時(shí)只支持Android5.0以上的設(shè)備運(yùn)行,后續(xù)版本將會(huì)對(duì)4.4版本進(jìn)行兼容,對(duì)4.4以下的設(shè)備未做兼容打算

關(guān)于.jpg
主界面
主界面.jpg
編輯界面
編輯界面.jpg

功能點(diǎn):

基礎(chǔ)功能

  • 對(duì)記事的增刪改
  • 添加時(shí)間戳
  • 查詢內(nèi)容

拓展功能

  • 對(duì)記事進(jìn)行分類
  • 在記事中添加圖片
  • 一些界面美化以及人性化細(xì)節(jié)設(shè)置

基礎(chǔ)功能

對(duì)記事的增刪改

使用了數(shù)據(jù)庫(kù)輔助類SQLiteOpenHelper來(lái)創(chuàng)建數(shù)據(jù)庫(kù)

數(shù)據(jù)的插入

使用dbHelper封裝insert方法
插入數(shù)據(jù) ContentValues values = new ContentValues(); values.put(COLUMN_NAME_NOTE_TITLE ,title); values.put(COLUMN_NAME_NOTE_CONTENT ,content); values.put(COLUMN_NAME_NOTE_DATE ,dateNum); dbread.insert(TABLE_NAME_NOTES ,null,values);

原先使用的是execSQL()方法來(lái)插入數(shù)據(jù),但是有一個(gè)問(wèn)題就是輸入 ' 這個(gè)符號(hào)使,執(zhí)行語(yǔ)句就會(huì)出錯(cuò),
原先的插入方法 sql = "insert into " +NotesDB.TABLE_NAME_NOTES +"(" +COLUMN_NAME_ID + " ," +COLUMN_NAME_NOTE_TITLE +"," +COLUMN_NAME_NOTE_CONTENT + " ," +COLUMN_NAME_NOTE_DATE + ")" +" values("+count+","+"'"+ title +"'"+","+"'"+ content +"'"+","+"'"+ dateNum + "')"; Log.d("LOG",sql); dbread.execSQL(sql);

數(shù)據(jù)的修改

使用dbHelper封裝update方法 ContentValues values = new ContentValues();; values.put(COLUMN_NAME_NOTE_TITLE ,title); values.put(COLUMN_NAME_NOTE_CONTENT ,content); values.put(COLUMN_NAME_NOTE_DATE,dateNum); String where = "_id="+id; dbread.update(TABLE_NAME_NOTES ,values ,where, null);
同上,使用數(shù)據(jù)庫(kù)語(yǔ)句的execSQL()方法會(huì)因?yàn)檩斎?' 而出錯(cuò),此處不再列出

數(shù)據(jù)的刪除

本應(yīng)用的刪除分兩步進(jìn)行,第一步只是先把記事的屬性改為已刪除,并在回收站顯示,第二部才是進(jìn)行在數(shù)據(jù)庫(kù)的刪除

第一步
更改屬性為刪除 Cursor content = c1; String id = c1.getString(content.getColumnIndex("_id")); String setCategory = "update note set category ='" + CATEGORY_DELETED + "' where _id=" + id; Log.d("DELETE",setCategory); dbread.execSQL(setCategory);
第二步
在數(shù)據(jù)庫(kù)中刪除 Cursor content = (Cursor) deletedview.getItemAtPosition(n); String id = content.getString(content.getColumnIndex("_id")); String recovery = "delete from note where _id=" + id; dbread.execSQL(recovery);

至此,本應(yīng)用的核心功能增刪改已經(jīng)完成

下面是徹底刪除一條記事的流程:

主界面長(zhǎng)按選擇刪除

主界面長(zhǎng)按.jpg

在彈出的提示中確認(rèn)刪除,此時(shí),主界面列表已經(jīng)不顯示這條記錄

刪除提示.jpg

而在回收站中可以看到先前被刪除的記錄,長(zhǎng)按則可以選擇回復(fù)或者徹底刪除

回收站長(zhǎng)按.jpg

選擇刪除則彈出提示,這條記錄"徹底刪除"已在數(shù)據(jù)庫(kù)中刪除

永久刪除.jpg

邏輯的判斷
進(jìn)入編輯界面有兩個(gè)途徑,第一是點(diǎn)擊新建按鈕,第二是從記事列表進(jìn)入,所以我們加入了一個(gè)屬性,若是新建按鈕則為0(調(diào)用插入函數(shù)),若是從記事列表則為1(調(diào)用修改函數(shù)).
if(ENTER_STATE == 0){ noteInsert(); else{ noteUpdate(); }


添加時(shí)間戳

首先要在顯示的listview中加入一個(gè)TextView組件來(lái)顯示這個(gè)時(shí)間,
使用SimpleDateFormat 可以把當(dāng)前時(shí)間格式化成指定格式
Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm"); String dateNum = sdf.format(date);
然后在數(shù)據(jù)庫(kù)相對(duì)應(yīng)的列中加入這個(gè)字符串即可


查詢內(nèi)容

查詢的方法在工具欄點(diǎn)擊查詢按鈕即可調(diào)出searchview,然后輸入所需查詢的文字然后點(diǎn)擊鍵盤的搜索即可查詢內(nèi)容包含關(guān)鍵詞的記錄


查詢1.jpg

查詢"在"的結(jié)果


查詢結(jié)果.jpg

實(shí)現(xiàn)

具體搜索的實(shí)現(xiàn)代碼不難,執(zhí)行一下代碼就可以將查詢到的內(nèi)容放到Cursor里,然后用適配器進(jìn)行適配就可以在列表中顯示了

String sql = "select * from note where category !='"+CATEGORY_DELETED+"' and content like ?"; Cursor cursor = dbread.rawQuery(sql, new String[]{"%"+word+"%"});

但是為了實(shí)現(xiàn)搜索欄,我們需要用到一個(gè)新的組件
SearchView

首先要在AndroidManifest的顯示搜索欄的活動(dòng)中加入

<meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> <meta-data android:name="android.app.default_searchable" android:value="edu.fjnu.birdie.notemd.MainActivity" />

并在顯示搜索結(jié)果的活動(dòng)中加入
<intent-filter> <action android:name="android.intent.action.SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>

在 onCreateOptionsMenu(Menu menu)函數(shù)中加入
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); searchView.setSearchableInfo( searchManager.getSearchableInfo(getComponentName())); String SearchContent = getIntent().getStringExtra(SearchManager.QUERY); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { Intent intent = new Intent(MainActivity.this,SearchActivity.class); intent.putExtra("word",query); startActivity(intent); return true; } @Override public boolean onQueryTextChange(String newText) { return true; } });
即可讓搜索欄中輸入的文字傳到顯示搜索結(jié)果的活動(dòng)中,并在顯示結(jié)果的搜索欄中進(jìn)行dbread.rawQuery()并裝配到listview就可以得到搜索結(jié)果


拓展功能

對(duì)記事進(jìn)行分類

此處的分類有"默認(rèn)", "重要", "備忘", "筆記", "日程" ,用戶不可自定義
此處一是作為分類,二也是為后續(xù)添加的功能留下接口(備忘接口添加鬧鐘提醒等,但這個(gè)版本只單純的作為分類功能)
同時(shí)還有一個(gè)隱藏分類 刪除
刪除也是通過(guò)分類到刪除分類并在select的時(shí)候去掉這個(gè)分類的記錄

修改分類可以從主界面長(zhǎng)按或者編輯界面的右上角分類按鈕進(jìn)行

分類菜單.jpg

實(shí)現(xiàn)
public void addCategory(){ //Toast.makeText(this,"add_catagory",Toast.LENGTH_SHORT).show(); //{ "默認(rèn)", "重要", "備忘", "筆記", "日程" }; if(ENTER_STATE == 1) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("設(shè)置分組"); builder.setSingleChoiceItems(category, 0, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { int choose = which; switch (which) { case 0: { setCategory = "update note set category ='" + CATEGORY_NORMAL + "' where _id=" + id; Log.d("EXE", setCategory); break; } .... builder.setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dbread.execSQL(setCategory); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); builder.create(); builder.show();
使用一個(gè)AlertDialog彈出單選框,并根據(jù)選項(xiàng)的不同來(lái)加載不同的sql語(yǔ)句,并在確定后執(zhí)行sql語(yǔ)句.


在記事中添加圖片

在編輯界面 點(diǎn)擊右下角的按鈕,就會(huì)打開相冊(cè),選擇相冊(cè)中的圖片即可將圖片加入到文本中

插入圖片1.jpg

實(shí)現(xiàn):
首先要在AndroidManifest中加入權(quán)限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

首先
對(duì)點(diǎn)擊按鈕的事件創(chuàng)建監(jiān)聽


一些界面美化以及人性化細(xì)節(jié)設(shè)置

本應(yīng)用參照了Material Design,雖然并未完全規(guī)范,不過(guò)在界面上還是達(dá)到了相對(duì)應(yīng)的簡(jiǎn)潔,在操作邏輯上也符合用戶的使用

界面美化

界面的演變

4.12 --雛形
內(nèi)容:

  • 通過(guò)ListView,Button,EditText等控件做出初始的界面
  • 并通過(guò)內(nèi)嵌數(shù)據(jù)庫(kù)SQLite 完成對(duì)內(nèi)容的增刪改
1g.jpg

4.13 --重新設(shè)計(jì)界面
內(nèi)容:

  • 對(duì)界面進(jìn)行重新設(shè)計(jì)
2g.jpg

為了使輸入界面更加簡(jiǎn)潔,可以通過(guò) 在<EditText>中,加入

android:background="@null"

去掉輸入框下的橫線

4.13 --Material Design
內(nèi)容:

  • 基于對(duì)界面的重新設(shè)計(jì),加入了Material Design
    雖然并不是很規(guī)范,但會(huì)在后續(xù)慢慢完善
  • 完成了搜索的基本邏輯,記事本的增刪改查功能基本完善
  • 同時(shí)對(duì)設(shè)置菜單,關(guān)于界面進(jìn)行了初步的設(shè)計(jì),但大部分功能都未實(shí)現(xiàn)
3g_1.jpg

3g_2.jpg

后續(xù)的版本都是在第三次界面修改后基本沒(méi)有太大的變化,主要實(shí)在功能上的變化

當(dāng)前版本

mg-1.jpg
人性化細(xì)節(jié)設(shè)置
  • 虛擬鍵盤設(shè)置
  • 自動(dòng)補(bǔ)充標(biāo)題
  • 提醒設(shè)置
  • 空界面提示

虛擬鍵盤設(shè)置
新建記事會(huì)自動(dòng)彈出虛擬鍵盤,而二次編輯不彈出虛擬鍵盤,需要點(diǎn)擊才會(huì)彈出鍵盤,因?yàn)樽鳛橛浭骂愜浖罄m(xù)修改的頻率遠(yuǎn)低于查看的頻率,自動(dòng)彈出鍵盤反而會(huì)降低用戶體驗(yàn)
此外,光標(biāo)自動(dòng)聚焦在內(nèi)容編輯處,標(biāo)題在記事類軟件中的存在性并不重要,若要編輯標(biāo)題則需要點(diǎn)擊標(biāo)題欄
實(shí)現(xiàn)
//使焦點(diǎn)默認(rèn)在編輯內(nèi)容上,點(diǎn)擊標(biāo)題欄才能編輯標(biāo)題 et_title.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { et_title.setFocusableInTouchMode(true); return false; } }); //新建文本時(shí)調(diào)用軟鍵盤,如果是打開原來(lái)存在的文本默認(rèn)不打開軟鍵盤 //在Manifest中添加android:windowSoftInputMode="stateHidden"使得虛擬鍵盤不會(huì)自動(dòng)彈出 if(ENTER_STATE == 0){ Log.d("KeyBoard","VISIBLE"); Log.d("ENTER_STATE",ENTER_STATE+""); getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); }

自動(dòng)補(bǔ)充標(biāo)題
若用戶覺(jué)得標(biāo)題不重要大可不填,將會(huì)自動(dòng)生成標(biāo)題
if(title.equals("")){ SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd-HH-mm"); String dateNum1 = sdf.format(date); //title = "新建記事"+ dateNum1;//自動(dòng)添加為時(shí)間 title = "新建記事";//添加為新建記事 }

提醒設(shè)置
在刪除,編輯了內(nèi)容未保存的情況下,空內(nèi)容保存記錄,都會(huì)彈出提示框來(lái)提示用戶確保不會(huì)產(chǎn)生誤操作
(在回收站中的刪除沒(méi)有提示,邏輯上如果你已經(jīng)進(jìn)到回收站并確認(rèn)要?jiǎng)h除那條被刪除過(guò)的記錄,應(yīng)該不會(huì)是誤操作)

未保存提示


未保存提示.jpg

刪除提示


刪除提示.jpg

空界面提示
在沒(méi)有記錄的首頁(yè),搜索不到結(jié)果的搜索頁(yè)面,沒(méi)有回收記錄的回收站,不會(huì)因?yàn)闆](méi)有記錄而空在那里,而是會(huì)有一定的文字提醒

沒(méi)有記錄會(huì)提示點(diǎn)擊右下角添加


nullmain.jpg

無(wú)搜索結(jié)果


nullsearch.jpg

無(wú)回收文件


nulldelete.jpg

實(shí)現(xiàn)
在Layout中同時(shí)放兩個(gè)Item都是matchparents
然后通過(guò)判斷select結(jié)果來(lái)判斷是要顯示Listview還是顯示提示性文字
以MainActivity為例
//如果列表項(xiàng)為空,則顯示背景和文字 public boolean isNoteNull(){ String sql = "select * from note where category !='"+CATEGORY_DELETED+"'"; Log.d("sql",sql); Cursor c = dbManager.executeSql(sql, null); int number = c.getCount(); Log.d("Note number",number+""); if(number == 0){ ListView listView = (ListView)findViewById(R.id.notelist); TextView textView = (TextView)findViewById(R.id.main_text); listView.setVisibility(View.GONE); textView.setVisibility(View.VISIBLE); return true; }else{ ListView listView = (ListView)findViewById(R.id.notelist); TextView textView = (TextView)findViewById(R.id.main_text); textView.setVisibility(View.GONE); listView.setVisibility(View.VISIBLE); return false; } }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末志秃,一起剝皮案震驚了整個(gè)濱河市委乌,隨后出現(xiàn)的幾起案子囤萤,更是在濱河造成了極大的恐慌搏熄,老刑警劉巖卦尊,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異倦青,居然都是意外死亡图毕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門迎瞧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)夸溶,“玉大人,你說(shuō)我怎么就攤上這事凶硅》觳茫” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵足绅,是天一觀的道長(zhǎng)捷绑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)氢妈,這世上最難降的妖魔是什么粹污? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮首量,結(jié)果婚禮上壮吩,老公的妹妹穿的比我還像新娘进苍。我一直安慰自己,他們只是感情好鸭叙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布觉啊。 她就那樣靜靜地躺著,像睡著了一般沈贝。 火紅的嫁衣襯著肌膚如雪杠人。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天宋下,我揣著相機(jī)與錄音嗡善,去河邊找鬼。 笑死学歧,一個(gè)胖子當(dāng)著我的面吹牛罩引,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撩满,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蜒程,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼绅你!你這毒婦竟也來(lái)了伺帘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤忌锯,失蹤者是張志新(化名)和其女友劉穎伪嫁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體偶垮,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡张咳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了似舵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脚猾。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖砚哗,靈堂內(nèi)的尸體忽然破棺而出龙助,到底是詐尸還是另有隱情,我是刑警寧澤蛛芥,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布提鸟,位于F島的核電站,受9級(jí)特大地震影響仅淑,放射性物質(zhì)發(fā)生泄漏称勋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一涯竟、第九天 我趴在偏房一處隱蔽的房頂上張望赡鲜。 院中可真熱鬧空厌,春花似錦、人聲如沸银酬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捡硅。三九已至哮内,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壮韭,已是汗流浹背北发。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喷屋,地道東北人琳拨。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像屯曹,于是被迫代替她去往敵國(guó)和親狱庇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 簡(jiǎn)述: 記事本的第一個(gè)版本,需要完善的還有很多,完成了基本的增刪改查的功能,以及在正文中插入圖片,對(duì)內(nèi)容進(jìn)行分類,...
    Birdie0421閱讀 972評(píng)論 0 0
  • 1. 安裝Python 1 下載 我選擇了32位的2.7版本恶耽。https://www.python.org/ftp...
    葉遠(yuǎn)三閱讀 680評(píng)論 0 0
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    草里有只羊閱讀 18,324評(píng)論 0 85
  • 1 “將頭發(fā)梳成大人模樣偷俭,換上一身帥氣西裝浪讳,等會(huì)兒給老科送別,也給自己十幾年的青春送別涌萤!” 這是以前一起打球的朋友...
    金七言閱讀 2,039評(píng)論 5 10
  • 人近不惑淹遵,許多事明白了,可是社會(huì)變化快负溪,還是有許多事讓人措手不及透揣,只能邊生活邊學(xué)習(xí)。 下過(guò)基層抓壞人川抡,站過(guò)馬...
    焦野_流莽閱讀 175評(píng)論 0 0