溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android中怎么開發(fā)一個記事本項目

發(fā)布時間:2021-06-28 17:37:38 來源:億速云 閱讀:277 作者:Leah 欄目:移動開發(fā)

本篇文章給大家分享的是有關(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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI