您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Android中怎么開發一個記事本項目,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
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 { /** * 創建筆記表 */ 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) { } }
創建完數據表后,自然需要操作數據庫,CRUD數據,我把所有跟數據庫有關的操作封裝在一起: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); } }
設計完數據庫后,與數據庫對應的需要一個實體類: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主頁的設計: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>
具體效果如下(圖標懶得去改顏色了):
左邊的是一個關于App的按鈕,右邊的新建記事本的按鈕。
因為主頁需要顯示已經記錄的內容,所以我選擇用ListView去顯示。用到ListView,則與之對應的是要一個數據源,一個適配器。所以我為每一條子項設計了一個樣式,去讓它左邊顯示創建或更新的時間,右邊顯示內容。如下: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>
創建好了ListView,接下來為它準備適配器: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","執行了適配器里的點擊事件"); // } // }); return convertView; } class ViewHolder{ public TextView mTime; public TextView mContent; } }
這里采用了使用ViewHolder,來使ListView滾動的時候不必每次重新創建對象,提升性能。
創建好了ListView,準備好了適配器,接下來要為ListView準備數據源,而這數據源是要從數據庫讀出來的。但是數據庫操作和網絡訪問等都是屬于耗時操作,如果用主UI線程去執行響應操作的話,很可能會出現ANR現象,所以這里我用AsyncTask去執行數據庫操作。主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; /** * 數據庫實例,數據源 */ 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; } }); /** * 關于自己 */ 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); /** * 獲取數據庫實例 */ 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); /** * 設置適配器,綁定適配器 */ MyAdapter myAdapter = new MyAdapter(MainActivity.this,notes,mNoteListView); mNoteListView.setAdapter(myAdapter); /** * 更新備忘錄記錄數 */ int temp = mNoteList.size(); mNoteNum.setText("共 " + temp + " 條備忘錄"); } } /** * 當活動恢復時,刷新listview和備忘錄記錄數 */ @Override protected void onResume() { super.onResume(); new NewAsyncTask().execute(); } }
在上面的代碼中,我新建了一個 NewAsyncTask 類去繼承 AsyncTask,去執行從數據庫讀取數據的操作,在onPostExecute()方法中,去更新UI,比如顯示ListView中的數據,一下頁面底部中間有幾條數據等。還有我考慮了新建記事本的話,是另外一個Activity。當從另外的Activity返回到主Activity時,主頁面應該再刷新一次,刷新數據和顯示,所以我在onResume()方法中調用了 NewAsyncTask().execute() 方法,當活動恢復時刷新顯示。
接下來是新建記事本的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; /** * 備忘錄數據 */ private String noteTime; private String noteContent; /** * 數據庫 */ 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); /** * 獲取數據庫實例 */ mNoteDB = NoteDB.getInstance(this); } /** * 事件處理 */ private void initEvent() { /** * 返回上一級菜單,如果有內容,提示是否保存 * 是、保存,銷毀活動;否,直接銷毀活動 */ mBackBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { saveDataOrNot(); } }); /** * 完成按鈕,保存備忘錄到數據庫 */ mComplete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (!mContent.getText().toString().equals("")){ new AddAsyncTask().execute(); finish(); } else { finish(); } } }); } /** * 根據是否有內容,提示保存 */ private void saveDataOrNot() { if (!mContent.getText().toString().trim().equals("")) { new AlertDialog.Builder(AddNoteActivity.this) .setTitle("提示") .setMessage("需要保存您編輯的內容嗎?") .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(); } } /** * 添加數據到數據庫 */ class AddAsyncTask extends AsyncTask<Void,Void,Void>{ @Override protected Void doInBackground(Void... voids) { mNoteDB.saveNote(note); return null; } @Override protected void onPreExecute() { super.onPreExecute(); /** * 記錄數據 */ 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(); } } /** * 按返回鍵,有內容時,提示保存 */ @Override public void onBackPressed() { saveDataOrNot(); } }
新建記事本,插入數據到數據庫,如從數據庫讀取數據一樣,都是耗時操作,所以我還是用了AsyncTask,在 onPreExecute()方法中,先獲取到系統當前時間,進行格式化,存儲下來,把輸入的文本存儲下來,然后再 doInBackground()去保存數據。這里我考慮了,用戶輸入了內容,但是沒有保存,在頂部的返回鍵或者系統的返回鍵的處理事件中都加了判斷。如果文本為空,空格也算空,則不保存,直接退出當前Activity,如果有內容,則彈出對話框提示用戶是否保存,是則保存,否則不保存,退出當前活動。
接下來是查看或修改一條記事本了,布局我是直接復用新建記事本的布局。因為沒有區別 - -
接下來是查看或修改一條記事本的Activity了,之前,我想的是點擊一條記事本,則進入這條記事本,把這條記事本直接顯示在頁面上,用戶直接在內容最后進行編輯。所以這里需要一個子項點擊事件。我在MainActivity里已經寫了,先獲取當前點擊的這一項的對象,這里我費了好多時間,我不知道點擊這一項的時候,怎么把該項的對象讀取出來。最后自己查看源碼,查API,看到參數中AdapterView是個泛型,我試著從它著手,把它強轉成Note對象,然后試試獲取id,沒想到就成了。 - -
所以,我獲取了當前點擊的item中的Note對象的id,把它放在Intent中,帶著這個參數去開啟活動。
這里,查看或修改一條記事本的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; /** * 備忘錄數據 */ private int noteId; private String noteTime; private String noteContent; private String originData; /** * 數據庫 */ 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實體實現Serializable // note = (Note) intent.getSerializableExtra("note_item"); noteId = intent.getIntExtra("note_id",0); Log.d("Anonymous", "傳遞后的備忘錄ID:" + noteId); initView(); /** * 加載顯示數據 */ 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); /** * 獲取數據庫實例 */ mNoteDB = NoteDB.getInstance(this); } private void initEvent() { /** * 返回上一級菜單,直接銷毀當前活動 */ mBackBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { updateDataOrNot(); } }); /** * 完成按鈕,修改備忘錄到數據庫 */ mComplete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mContent.getText().toString().trim().equals("")){ // Log.d("Anonymous","進入判斷為空函數"); new DeleteAsyncTask(mNoteDB).execute(noteId); finish(); } else if (mContent.getText().toString().equals(originData)) { finish(); } else { // Log.d("Anonymous","進入判斷不為空函數"); new UpdateAsyncTask().execute(); // Toast.makeText(UpdateOrReadActivity.this, "修改成功!", Toast.LENGTH_SHORT).show(); finish(); } } }); /** * 點擊屏幕空白區域,EditText選中 */ } /** * 根據id從數據庫讀數據的異步任務 */ 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); /** * 根據傳遞進來的Note顯示備忘錄內容,并把光標移動到最后 * 記錄最初的文本內容 */ originData = note.getContent(); mContent.setText(note.getContent()); mContent.setSelection(mContent.getText().toString().length()); } } /** * 更新數據庫的異步任務 */ class UpdateAsyncTask extends AsyncTask<Void,Void,Void>{ @Override protected void onPreExecute() { super.onPreExecute(); /** * 記錄數據 */ 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; } } /** * 根據是否有內容,提示保存 */ private void updateDataOrNot() { if (!mContent.getText().toString().equals(originData)) { new AlertDialog.Builder(UpdateOrReadActivity.this) .setTitle("提示") .setMessage("需要保存您編輯的內容嗎?") .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(); } } /** * 返回鍵事件 * 根據內容是否有變化,提示是否保存 */ @Override public void onBackPressed() { updateDataOrNot(); } }
操作數據庫還是用了AsyncTask。這里,我考慮了,是否有改動,用一個變量,去存放原始的數據,在用戶點擊頂部返回或者系統返回鍵的時候去判斷是否有改動,如果有,則提示用戶是否需要保存更改。如果修改內容,沒有字了,則自動刪除該條記事本。因為刪除記事本的操作,在主頁還需要用到,所以我把它提出來,單獨作為一個類,不再是內部類了。如下:
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的最后一項,刪除數據了,在主頁的時候,我設計的是單擊進入該條記事本,去查看或修改這一條記事本,然后我考慮的是長按刪除。長按,彈出對話框,提示是否刪除,是則刪除,否則不做任何事。所以在MainActivity中可以看到長按事件的監聽器。但是因為Android的事件分發機制,長按事件必定會觸發點擊事件。所以需要在ListView中設置這樣一個屬性,才能點擊事件和長按事件同時監聽。
android:descendantFocusability="blocksDescendants"
主要功能都差不多完成了。接下來就是優化App了。我設計了過渡動畫,引導頁,以及是否第一次啟動App。是則過渡動畫過渡完到引導頁,引導頁完才到主頁。否則過渡動畫過渡完則直接進入主頁。還設計了引導頁的切換動畫,使用了nineoldandroid,保證動畫在低版本手機上可顯示。
以上就是Android中怎么開發一個記事本項目,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。