您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)Android中怎么開發(fā)一個記事本項目,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
DBHelper.java
package com.ikok.notepad.DBUtil; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper { /** * 創(chuàng)建筆記表 */ private static final String CREATE_NOTE = "create table Note(" + "id integer primary key autoincrement," + "content text," + "time text)"; private Context mContext; public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); mContext = context; } @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { sqLiteDatabase.execSQL(CREATE_NOTE); // Toast.makeText(mContext,"Created",Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { } }
創(chuàng)建完數(shù)據(jù)表后,自然需要操作數(shù)據(jù)庫,CRUD數(shù)據(jù),我把所有跟數(shù)據(jù)庫有關(guān)的操作封裝在一起:NoteDB.java
package com.ikok.notepad.DBUtil; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.ikok.notepad.Entity.Note; import java.util.ArrayList; import java.util.List; /** * Created by Anonymous on 2016/3/24. */ public class NoteDB { public static final String DB_NAME = "notepad"; public static final int VERSION = 1; private static NoteDB mNoteDB; private SQLiteDatabase db; public NoteDB(Context context) { DBHelper dbHelper = new DBHelper(context,DB_NAME,null,VERSION); db = dbHelper.getWritableDatabase(); } /** * 獲取 NoteDB 的實例 * @param context * @return */ public synchronized static NoteDB getInstance(Context context){ if (mNoteDB == null){ mNoteDB = new NoteDB(context); } return mNoteDB; } public void saveNote(Note note){ if (note != null) { ContentValues values = new ContentValues(); values.put("content", note.getContent()); values.put("time", note.getTime()); db.insert("Note", null, values); } } public List<Note> loadNotes(){ List<Note> noteList = new ArrayList<Note>(); /** * 先按時間降序排列,再按id降序排列 */ Cursor cursor = db.query("Note",null,null,null,null,null,"time desc,id desc"); if (cursor.moveToNext()){ do { Note note = new Note(); note.setId(cursor.getInt(cursor.getColumnIndex("id"))); note.setContent(cursor.getString(cursor.getColumnIndex("content"))); note.setTime(cursor.getString(cursor.getColumnIndex("time"))); noteList.add(note); } while (cursor.moveToNext()); } return noteList; } public Note loadById(int id){ Note note = null; Cursor cursor = db.query("Note",null,"id = " + id,null,null,null,null); if (cursor.moveToNext()){ note = new Note(); note.setContent(cursor.getString(cursor.getColumnIndex("content"))); note.setTime(cursor.getString(cursor.getColumnIndex("time"))); } return note; } public void deleteById(Integer id){ db.delete("Note","id = " + id,null); } public void deleteAllNote(){ db.delete("Note", null, null); } public void updateById(String noteTime, String noteContent, int noteId){ ContentValues values = new ContentValues(); values.put("content",noteContent); values.put("time",noteTime); db.update("Note",values,"id = " + noteId,null); } }
設(shè)計完數(shù)據(jù)庫后,與數(shù)據(jù)庫對應(yīng)的需要一個實體類:Note.java
package com.ikok.notepad.Entity; import java.io.Serializable; /** * Created by Anonymous on 2016/3/24. */ public class Note implements Serializable { private int id; private String content; private String time; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } }
接下來進行App主頁的設(shè)計:main_activity.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/repeat_bg" android:orientation="vertical"> <TextView android:id="@+id/app_title" android:layout_width="match_parent" android:layout_height="40dp" android:textSize="16sp" android:gravity="center" android:text="@string/app_title" android:textColor="#333" /> <ListView android:id="@+id/listview" android:descendantFocusability="blocksDescendants" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </ListView> <RelativeLayout android:layout_width="match_parent" android:layout_height="40dp" > <ImageButton android:id="@+id/about_btn" android:src="@drawable/about_me" android:layout_alignParentLeft="true" android:paddingLeft="20dp" android:background="#00ffffff" android:scaleType="center" android:layout_marginTop="4dp" android:layout_width="52dp" android:layout_height="32dp" /> <TextView android:id="@+id/note_num" android:layout_width="wrap_content" android:layout_height="30dp" android:paddingTop="2dp" android:textSize="18sp" android:textColor="#333" android:layout_centerInParent="true" android:text="@string/app_title" /> <ImageButton android:id="@+id/write_btn" android:src="@drawable/write_btn" android:layout_alignParentRight="true" android:paddingRight="20dp" android:background="#00ffffff" android:scaleType="center" android:layout_marginTop="4dp" android:layout_width="52dp" android:layout_height="32dp" /> </RelativeLayout> </LinearLayout>
具體效果如下(圖標(biāo)懶得去改顏色了):
左邊的是一個關(guān)于App的按鈕,右邊的新建記事本的按鈕。
因為主頁需要顯示已經(jīng)記錄的內(nèi)容,所以我選擇用ListView去顯示。用到ListView,則與之對應(yīng)的是要一個數(shù)據(jù)源,一個適配器。所以我為每一條子項設(shè)計了一個樣式,去讓它左邊顯示創(chuàng)建或更新的時間,右邊顯示內(nèi)容。如下:list_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:minHeight="50dp" android:orientation="horizontal"> <TextView android:id="@+id/show_time" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:paddingLeft="10dp" android:textColor="#333" android:textSize="16sp" /> <TextView android:id="@+id/show_content" android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:textSize="16sp" android:paddingLeft="20dp" android:textColor="#333" android:paddingTop="14dp" android:singleLine="true" /> </LinearLayout>
創(chuàng)建好了ListView,接下來為它準(zhǔn)備適配器:MyAdapter.java
package com.ikok.notepad.Util; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import com.ikok.notepad.Entity.Note; import com.ikok.notepad.R; import java.util.List; /** * Created by Anonymous on 2016/3/24. */ public class MyAdapter extends BaseAdapter { private List<Note> noteList; private LayoutInflater mInflater; private Context mContext; private int index; public MyAdapter(Context context,List<Note> noteList,ListView listView) { this.mInflater = LayoutInflater.from(context); this.noteList = noteList; this.mContext = context; } @Override public int getCount() { return noteList.size(); } @Override public Object getItem(int i) { return noteList.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View convertView, ViewGroup viewGroup) { ViewHolder viewHolder = null; if (convertView == null){ viewHolder = new ViewHolder(); convertView = mInflater.inflate(R.layout.list_item, null); viewHolder.mTime = (TextView) convertView.findViewById(R.id.show_time); viewHolder.mContent = (TextView) convertView.findViewById(R.id.show_content); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.mTime.setText(noteList.get(i).getTime()); viewHolder.mContent.setText(noteList.get(i).getContent()); index = i; // convertView.setOnClickListener(new View.OnClickListener() { // @Override // public void onClick(View view) { // Intent intent = new Intent(mContext,UpdateOrReadActivity.class); //// Bundle bundle = new Bundle(); //// bundle.putSerializable("note_item",noteList.get(index)); //// intent.putExtras(bundle); // intent.putExtra("note_id",noteList.get(index).getId()); // Log.d("Anonymous","備忘錄ID:"+noteList.get(index).getId()); // mContext.startActivity(intent); // Log.d("Anonymous","執(zhí)行了適配器里的點擊事件"); // } // }); return convertView; } class ViewHolder{ public TextView mTime; public TextView mContent; } }
這里采用了使用ViewHolder,來使ListView滾動的時候不必每次重新創(chuàng)建對象,提升性能。
創(chuàng)建好了ListView,準(zhǔn)備好了適配器,接下來要為ListView準(zhǔn)備數(shù)據(jù)源,而這數(shù)據(jù)源是要從數(shù)據(jù)庫讀出來的。但是數(shù)據(jù)庫操作和網(wǎng)絡(luò)訪問等都是屬于耗時操作,如果用主UI線程去執(zhí)行響應(yīng)操作的話,很可能會出現(xiàn)ANR現(xiàn)象,所以這里我用AsyncTask去執(zhí)行數(shù)據(jù)庫操作。主Activity代碼如下:MainActivity.java
package com.ikok.notepad.Activity; import android.app.Activity; import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.view.View; import android.view.Window; import android.widget.AdapterView; import android.widget.ImageButton; import android.widget.ListView; import android.widget.TextView; import com.ikok.notepad.DBUtil.NoteDB; import com.ikok.notepad.Entity.Note; import com.ikok.notepad.R; import com.ikok.notepad.Util.DeleteAsyncTask; import com.ikok.notepad.Util.MyAdapter; import java.util.ArrayList; import java.util.List; /** * Created by Anonymous on 2016/3/24. */ public class MainActivity extends Activity { /** * 布局控件 */ private TextView mTitle; private TextView mNoteNum; private ImageButton mWrite; private ListView mNoteListView; private ImageButton mAbout; /** * 數(shù)據(jù)庫實例,數(shù)據(jù)源 */ private List<Note> mNoteList = new ArrayList<Note>() ; private NoteDB mNoteDB; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main_activity); initView(); new NewAsyncTask().execute(); initEvent(); } private void initEvent() { /** * 新寫一條備忘錄 */ mWrite.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, AddNoteActivity.class); startActivity(intent); } }); /** * 修改或查看一條已有的備忘錄 */ mNoteListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Note note = (Note) adapterView.getItemAtPosition(i); // Log.d("Anonymous", "點擊ListView獲取的note id: " + note.getId()); Intent intent = new Intent(MainActivity.this, UpdateOrReadActivity.class); intent.putExtra("note_id", note.getId()); startActivity(intent); } }); /** * listview長按刪除 */ mNoteListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { final Note note = (Note) parent.getItemAtPosition(position); // Log.d("Anonymous", "長按ListView獲取的note id: " + note.getId()); /** * 長按提示是否刪除 */ new AlertDialog.Builder(MainActivity.this) .setTitle("提示") .setMessage("真的要刪除這條記錄嗎?") .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { new DeleteAsyncTask(mNoteDB).execute(note.getId()); new NewAsyncTask().execute(); } }) .setNegativeButton("取消", null) .show(); return true; } }); /** * 關(guān)于自己 */ mAbout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,AboutActivity.class); startActivity(intent); } }); } public void initView() { /** * 布局控件初始化 */ mTitle = (TextView) findViewById(R.id.app_title); // 畫TextView文字下的下劃線 // mTitle.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG); mNoteNum = (TextView) findViewById(R.id.note_num); mWrite = (ImageButton) findViewById(R.id.write_btn); mNoteListView = (ListView) findViewById(R.id.listview); mAbout = (ImageButton) findViewById(R.id.about_btn); /** * 獲取數(shù)據(jù)庫實例 */ mNoteDB = NoteDB.getInstance(this); } /** * 異步加載備忘錄 */ class NewAsyncTask extends AsyncTask<Void,Void,List<Note>>{ @Override protected List<Note> doInBackground(Void... voids) { mNoteList = mNoteDB.loadNotes(); return mNoteList; } @Override protected void onPostExecute(List<Note> notes) { super.onPostExecute(notes); /** * 設(shè)置適配器,綁定適配器 */ MyAdapter myAdapter = new MyAdapter(MainActivity.this,notes,mNoteListView); mNoteListView.setAdapter(myAdapter); /** * 更新備忘錄記錄數(shù) */ int temp = mNoteList.size(); mNoteNum.setText("共 " + temp + " 條備忘錄"); } } /** * 當(dāng)活動恢復(fù)時,刷新listview和備忘錄記錄數(shù) */ @Override protected void onResume() { super.onResume(); new NewAsyncTask().execute(); } }
在上面的代碼中,我新建了一個 NewAsyncTask 類去繼承 AsyncTask,去執(zhí)行從數(shù)據(jù)庫讀取數(shù)據(jù)的操作,在onPostExecute()方法中,去更新UI,比如顯示ListView中的數(shù)據(jù),一下頁面底部中間有幾條數(shù)據(jù)等。還有我考慮了新建記事本的話,是另外一個Activity。當(dāng)從另外的Activity返回到主Activity時,主頁面應(yīng)該再刷新一次,刷新數(shù)據(jù)和顯示,所以我在onResume()方法中調(diào)用了 NewAsyncTask().execute() 方法,當(dāng)活動恢復(fù)時刷新顯示。
接下來是新建記事本的Activity,布局如下:write_note.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/screen_view" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/repeat_bg" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="40dp"> <ImageButton android:id="@+id/back_btn" android:src="@drawable/back_btn" android:layout_alignParentLeft="true" android:paddingLeft="5dp" android:background="#00ffffff" android:scaleType="center" android:layout_marginTop="6dp" android:layout_width="52dp" android:layout_height="32dp" /> <TextView android:id="@+id/complete_btn" android:layout_alignParentRight="true" android:paddingTop="10dp" android:paddingRight="10dp" android:textSize="18sp" android:textColor="#ec6d51" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/complete"/> </RelativeLayout> <EditText android:id="@+id/note_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="10dp" android:paddingRight="10dp" android:textColor="#333" android:textCursorDrawable="@null" android:background="@null"/> </LinearLayout>
具體效果如下:
新建記事本的Activity如下:AddNoteActivity.java
package com.ikok.notepad.Activity; import android.app.Activity; import android.content.DialogInterface; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.view.View; import android.view.Window; import android.widget.EditText; import android.widget.ImageButton; import android.widget.TextView; import android.widget.Toast; import com.ikok.notepad.DBUtil.NoteDB; import com.ikok.notepad.Entity.Note; import com.ikok.notepad.R; import java.text.SimpleDateFormat; import java.util.Date; /** * Created by Anonymous on 2016/3/24. */ public class AddNoteActivity extends Activity { /** * 布局控件 */ private TextView mComplete; private ImageButton mBackBtn; private EditText mContent; /** * 備忘錄數(shù)據(jù) */ private String noteTime; private String noteContent; /** * 數(shù)據(jù)庫 */ private NoteDB mNoteDB; private Note note; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.write_note); initView(); initEvent(); } private void initView() { /** * 布局控件初始化 */ mComplete = (TextView) findViewById(R.id.complete_btn); mBackBtn = (ImageButton) findViewById(R.id.back_btn); mContent = (EditText) findViewById(R.id.note_content); /** * 獲取數(shù)據(jù)庫實例 */ mNoteDB = NoteDB.getInstance(this); } /** * 事件處理 */ private void initEvent() { /** * 返回上一級菜單,如果有內(nèi)容,提示是否保存 * 是、保存,銷毀活動;否,直接銷毀活動 */ mBackBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { saveDataOrNot(); } }); /** * 完成按鈕,保存?zhèn)渫浀綌?shù)據(jù)庫 */ mComplete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (!mContent.getText().toString().equals("")){ new AddAsyncTask().execute(); finish(); } else { finish(); } } }); } /** * 根據(jù)是否有內(nèi)容,提示保存 */ private void saveDataOrNot() { if (!mContent.getText().toString().trim().equals("")) { new AlertDialog.Builder(AddNoteActivity.this) .setTitle("提示") .setMessage("需要保存您編輯的內(nèi)容嗎?") .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { new AddAsyncTask().execute(); finish(); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }) .show(); } else { finish(); } } /** * 添加數(shù)據(jù)到數(shù)據(jù)庫 */ class AddAsyncTask extends AsyncTask<Void,Void,Void>{ @Override protected Void doInBackground(Void... voids) { mNoteDB.saveNote(note); return null; } @Override protected void onPreExecute() { super.onPreExecute(); /** * 記錄數(shù)據(jù) */ SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm"); Date date = new Date(System.currentTimeMillis()); noteTime = sdf.format(date); noteContent = mContent.getText().toString(); note = new Note(); note.setTime(noteTime); note.setContent(noteContent); } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); Toast.makeText(AddNoteActivity.this, "保存成功!", Toast.LENGTH_SHORT).show(); } } /** * 按返回鍵,有內(nèi)容時,提示保存 */ @Override public void onBackPressed() { saveDataOrNot(); } }
新建記事本,插入數(shù)據(jù)到數(shù)據(jù)庫,如從數(shù)據(jù)庫讀取數(shù)據(jù)一樣,都是耗時操作,所以我還是用了AsyncTask,在 onPreExecute()方法中,先獲取到系統(tǒng)當(dāng)前時間,進行格式化,存儲下來,把輸入的文本存儲下來,然后再 doInBackground()去保存數(shù)據(jù)。這里我考慮了,用戶輸入了內(nèi)容,但是沒有保存,在頂部的返回鍵或者系統(tǒng)的返回鍵的處理事件中都加了判斷。如果文本為空,空格也算空,則不保存,直接退出當(dāng)前Activity,如果有內(nèi)容,則彈出對話框提示用戶是否保存,是則保存,否則不保存,退出當(dāng)前活動。
接下來是查看或修改一條記事本了,布局我是直接復(fù)用新建記事本的布局。因為沒有區(qū)別 - -
接下來是查看或修改一條記事本的Activity了,之前,我想的是點擊一條記事本,則進入這條記事本,把這條記事本直接顯示在頁面上,用戶直接在內(nèi)容最后進行編輯。所以這里需要一個子項點擊事件。我在MainActivity里已經(jīng)寫了,先獲取當(dāng)前點擊的這一項的對象,這里我費了好多時間,我不知道點擊這一項的時候,怎么把該項的對象讀取出來。最后自己查看源碼,查API,看到參數(shù)中AdapterView是個泛型,我試著從它著手,把它強轉(zhuǎn)成Note對象,然后試試獲取id,沒想到就成了。 - -
所以,我獲取了當(dāng)前點擊的item中的Note對象的id,把它放在Intent中,帶著這個參數(shù)去開啟活動。
這里,查看或修改一條記事本的Activity正式開始了,如下:UpdateOrReadActivity.java
package com.ikok.notepad.Activity; import android.app.Activity; import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.util.Log; import android.view.View; import android.view.Window; import android.widget.EditText; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; import com.ikok.notepad.DBUtil.NoteDB; import com.ikok.notepad.Entity.Note; import com.ikok.notepad.R; import com.ikok.notepad.Util.DeleteAsyncTask; import java.text.SimpleDateFormat; import java.util.Date; /** * Created by Anonymous on 2016/3/24. */ public class UpdateOrReadActivity extends Activity { /** * 布局控件 */ private TextView mComplete; private ImageButton mBackBtn; private EditText mContent; private LinearLayout mScreen; /** * 備忘錄數(shù)據(jù) */ private int noteId; private String noteTime; private String noteContent; private String originData; /** * 數(shù)據(jù)庫 */ private NoteDB mNoteDB; private static Note note; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.write_note); /** * 獲取傳遞過來的note對象 */ Intent intent = getIntent(); // 傳遞Note對象,必須要Note實體實現(xiàn)Serializable // note = (Note) intent.getSerializableExtra("note_item"); noteId = intent.getIntExtra("note_id",0); Log.d("Anonymous", "傳遞后的備忘錄ID:" + noteId); initView(); /** * 加載顯示數(shù)據(jù) */ new LoadAsyncTask().execute(); initEvent(); } private void initView() { /** * 布局控件初始化 */ mComplete = (TextView) findViewById(R.id.complete_btn); mBackBtn = (ImageButton) findViewById(R.id.back_btn); mContent = (EditText) findViewById(R.id.note_content); mScreen = (LinearLayout) findViewById(R.id.screen_view); /** * 獲取數(shù)據(jù)庫實例 */ mNoteDB = NoteDB.getInstance(this); } private void initEvent() { /** * 返回上一級菜單,直接銷毀當(dāng)前活動 */ mBackBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { updateDataOrNot(); } }); /** * 完成按鈕,修改備忘錄到數(shù)據(jù)庫 */ mComplete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mContent.getText().toString().trim().equals("")){ // Log.d("Anonymous","進入判斷為空函數(shù)"); new DeleteAsyncTask(mNoteDB).execute(noteId); finish(); } else if (mContent.getText().toString().equals(originData)) { finish(); } else { // Log.d("Anonymous","進入判斷不為空函數(shù)"); new UpdateAsyncTask().execute(); // Toast.makeText(UpdateOrReadActivity.this, "修改成功!", Toast.LENGTH_SHORT).show(); finish(); } } }); /** * 點擊屏幕空白區(qū)域,EditText選中 */ } /** * 根據(jù)id從數(shù)據(jù)庫讀數(shù)據(jù)的異步任務(wù) */ class LoadAsyncTask extends AsyncTask<Void,Void,Note>{ @Override protected Note doInBackground(Void... voids) { note = mNoteDB.loadById(noteId); return note; } @Override protected void onPostExecute(Note note) { super.onPostExecute(note); /** * 根據(jù)傳遞進來的Note顯示備忘錄內(nèi)容,并把光標(biāo)移動到最后 * 記錄最初的文本內(nèi)容 */ originData = note.getContent(); mContent.setText(note.getContent()); mContent.setSelection(mContent.getText().toString().length()); } } /** * 更新數(shù)據(jù)庫的異步任務(wù) */ class UpdateAsyncTask extends AsyncTask<Void,Void,Void>{ @Override protected void onPreExecute() { super.onPreExecute(); /** * 記錄數(shù)據(jù) */ SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm"); Date date = new Date(System.currentTimeMillis()); noteTime = sdf.format(date); noteContent = mContent.getText().toString(); note.setTime(noteTime); note.setContent(noteContent); } @Override protected Void doInBackground(Void... voids) { mNoteDB.updateById(noteTime, noteContent, noteId); return null; } } /** * 根據(jù)是否有內(nèi)容,提示保存 */ private void updateDataOrNot() { if (!mContent.getText().toString().equals(originData)) { new AlertDialog.Builder(UpdateOrReadActivity.this) .setTitle("提示") .setMessage("需要保存您編輯的內(nèi)容嗎?") .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { new UpdateAsyncTask().execute(); finish(); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }) .show(); } else { finish(); } } /** * 返回鍵事件 * 根據(jù)內(nèi)容是否有變化,提示是否保存 */ @Override public void onBackPressed() { updateDataOrNot(); } }
操作數(shù)據(jù)庫還是用了AsyncTask。這里,我考慮了,是否有改動,用一個變量,去存放原始的數(shù)據(jù),在用戶點擊頂部返回或者系統(tǒng)返回鍵的時候去判斷是否有改動,如果有,則提示用戶是否需要保存更改。如果修改內(nèi)容,沒有字了,則自動刪除該條記事本。因為刪除記事本的操作,在主頁還需要用到,所以我把它提出來,單獨作為一個類,不再是內(nèi)部類了。如下:
package com.ikok.notepad.Util; import android.os.AsyncTask; import com.ikok.notepad.DBUtil.NoteDB; /** * Created by Anonymous on 2016/3/25. */ public class DeleteAsyncTask extends AsyncTask<Integer,Void,Void> { private NoteDB noteDB; public DeleteAsyncTask(NoteDB noteDB) { this.noteDB = noteDB; } @Override protected Void doInBackground(Integer... params) { noteDB.deleteById(params[0]); return null; } }
接下來是CRUD的最后一項,刪除數(shù)據(jù)了,在主頁的時候,我設(shè)計的是單擊進入該條記事本,去查看或修改這一條記事本,然后我考慮的是長按刪除。長按,彈出對話框,提示是否刪除,是則刪除,否則不做任何事。所以在MainActivity中可以看到長按事件的監(jiān)聽器。但是因為Android的事件分發(fā)機制,長按事件必定會觸發(fā)點擊事件。所以需要在ListView中設(shè)置這樣一個屬性,才能點擊事件和長按事件同時監(jiān)聽。
android:descendantFocusability="blocksDescendants"
主要功能都差不多完成了。接下來就是優(yōu)化App了。我設(shè)計了過渡動畫,引導(dǎo)頁,以及是否第一次啟動App。是則過渡動畫過渡完到引導(dǎo)頁,引導(dǎo)頁完才到主頁。否則過渡動畫過渡完則直接進入主頁。還設(shè)計了引導(dǎo)頁的切換動畫,使用了nineoldandroid,保證動畫在低版本手機上可顯示。
以上就是Android中怎么開發(fā)一個記事本項目,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。