Android 简单记事本
寫在前面
課程作業需要,于是忙活好幾天抄了一個簡單的記事本,使用已學內容包括Android UI布局,Activity的跳轉,SQLite數據庫。
開發環境:Android Studio
參考:https://blog.csdn.net/zouguo1211/article/details/83474845
源碼鏈接:https://github.com/zsy0216/Notepad
目錄
寫在前面
一.界面預覽
二.基本實現
一.界面預覽
- 主界面
- 編輯界面
- 長按刪除
二.基本實現
- 布局實現代碼
初始界面功能,最上方標題下為用戶創建的各條記錄,點擊進行修改,長按刪除,最下方有添加筆記按鈕進行筆記的增加操作。實現的布局文件有初始界面activity_main.xml(里面包含可以以列表的形式展示數據內容的ListView控件)、note_item(ListView對應的item布局,以顯示每個條目信息)、note_editor(新建文本編輯界面)、activity_show(文本修改界面)
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#eaeaea"android:orientation="vertical"tools:context=".MainActivity" ><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Notepad"android:textSize="20sp"android:textStyle="bold"android:background="#efdede"android:paddingTop="10dp"android:paddingBottom="5dp"android:paddingLeft="10dp"android:gravity="left"></TextView><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="#eaeaea"android:layout_weight="1"><ListViewandroid:id="@+id/lv_note"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="5dp"></ListView></LinearLayout><Buttonandroid:id="@+id/btn_add"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:layout_marginBottom="10dp"android:textSize="20sp"android:text="添加筆記"/></LinearLayout>note_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:orientation="vertical"><TextViewandroid:id="@+id/tv_title"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:lines="1"android:text=""android:textStyle="bold"android:textAppearance="?android:attr/textAppearanceLarge"/><TextViewandroid:id="@+id/tv_content"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:lines="1"/><TextViewandroid:id="@+id/tv_time"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:text="" /> </LinearLayout>note_editor.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="#eaeaea"android:orientation="vertical"><EditTextandroid:id="@+id/et_title"android:layout_width="match_parent"android:layout_height="wrap_content"android:ems="10"android:hint="請輸入標題"><requestFocus /></EditText><TextViewandroid:id="@+id/edit_time"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#d7d5d5"android:gravity="right"android:textSize="10sp"/><EditTextandroid:id="@+id/et_content"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:hint="請輸入內容"android:gravity="left"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center"android:gravity="center"><Buttonandroid:id="@+id/btn_save"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginBottom="10dp"android:text="保存"android:textSize="20sp"/><Buttonandroid:id="@+id/btn_cancel"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginBottom="10dp"android:text="取消"android:textSize="20sp"/></LinearLayout> </LinearLayout>activity_show.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:orientation="vertical"><EditTextandroid:id="@+id/show_title"android:layout_width="match_parent"android:layout_height="wrap_content"android:ems="10"android:hint="標題"><requestFocus /></EditText><TextViewandroid:id="@+id/show_time"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="right"android:textSize="10sp"/><EditTextandroid:id="@+id/show_content"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:hint="內容"android:gravity="left"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center"android:gravity="center"><Buttonandroid:id="@+id/show_save"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginBottom="10dp"android:text="保存"android:textSize="20sp"/><Buttonandroid:id="@+id/show_cancel"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginBottom="10dp"android:text="取消"android:textSize="20sp"/></LinearLayout> </LinearLayout>- 功能實現
首先SQLite數據庫的創建。新建一個DBService類繼承自SQLiteOpenHelper,設置靜態常量屬性,表名、id、標題、內容、創建時間。
DBService.java
package zut.edu.cn.notepad;import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper;public class DBService extends SQLiteOpenHelper {public static final String TABLE = "notes";public static final String ID = "_id";public static final String TITLE ="title";public static final String CONTENT = "content";public static final String TIME = "time";public DBService(Context context) {super(context,"notepad.db",null,1);}@Overridepublic void onCreate(SQLiteDatabase db) {String sql = "CREATE TABLE "+TABLE+"( "+ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+TITLE +" VARCHAR(30) ,"+CONTENT + " TEXT , "+TIME + " DATETIME NOT NULL )";db.execSQL(sql);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} }MainActivity.java
package zut.edu.cn.notepad;import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.TextView;import java.util.ArrayList; import java.util.List;public class MainActivity extends AppCompatActivity {DBService myDb;private Button mBtnAdd;private ListView lv_note;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//實例化自己創建的數據庫類myDb = new DBService(this);//初始化函數init();}public void init(){mBtnAdd = findViewById(R.id.btn_add);lv_note = findViewById(R.id.lv_note);//創建Values類型的list保存數據庫中的數據List<Values> valuesList = new ArrayList<>();//獲得可讀SQLiteDatabase對象SQLiteDatabase db = myDb.getReadableDatabase();//查詢數據庫中的數據Cursor cursor = db.query(DBService.TABLE,null,null,null,null,null,null);if(cursor.moveToFirst()){Values values;while (!cursor.isAfterLast()){//實例化values對象values = new Values();//把數據庫中的一個表中的數據賦值給valuesvalues.setId(Integer.valueOf(cursor.getString(cursor.getColumnIndex(DBService.ID))));values.setTitle(cursor.getString(cursor.getColumnIndex(DBService.TITLE)));values.setContent(cursor.getString(cursor.getColumnIndex(DBService.CONTENT)));values.setTime(cursor.getString(cursor.getColumnIndex(DBService.TIME)));//將values對象存入list對象數組中valuesList.add(values);cursor.moveToNext();}}cursor.close();db.close();//設置list組件adapterfinal MyBaseAdapter myBaseAdapter = new MyBaseAdapter(valuesList,this,R.layout.note_item);lv_note.setAdapter(myBaseAdapter);//按鈕點擊事件mBtnAdd.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, zut.edu.cn.notepad.EditActivity.class);startActivity(intent);}});//單擊查詢lv_note.setOnItemClickListener(new AdapterView.OnItemClickListener(){@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {Intent intent = new Intent(MainActivity.this,ShowActivity.class);Values values = (Values) lv_note.getItemAtPosition(position);intent.putExtra(DBService.TITLE,values.getTitle().trim());intent.putExtra(DBService.CONTENT,values.getContent().trim());intent.putExtra(DBService.TIME,values.getTime().trim());intent.putExtra(DBService.ID,values.getId().toString().trim());startActivity(intent);}});//長按刪除lv_note.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {final Values values = (Values) lv_note.getItemAtPosition(position);new AlertDialog.Builder(MainActivity.this).setTitle("提示框").setMessage("是否刪除?").setPositiveButton("yes",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {SQLiteDatabase db = myDb.getWritableDatabase();db.delete(DBService.TABLE,DBService.ID+"=?",new String[]{String.valueOf(values.getId())});db.close();myBaseAdapter.removeItem(position);lv_note.post(new Runnable() {@Overridepublic void run() {myBaseAdapter.notifyDataSetChanged();}});//MainActivity.this.onResume();}}).setNegativeButton("no",null).show();return true;}});} //創建繼承自BaseAdapter的實現類進行ListView的展示class MyBaseAdapter extends BaseAdapter{private List<Values> valuesList;private Context context;private int layoutId;public MyBaseAdapter(List<Values> valuesList, Context context, int layoutId) {this.valuesList = valuesList;this.context = context;this.layoutId = layoutId;}@Overridepublic int getCount() {if (valuesList != null && valuesList.size() > 0)return valuesList.size();elsereturn 0;}@Overridepublic Object getItem(int position) {if (valuesList != null && valuesList.size() > 0)return valuesList.get(position);elsereturn null;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder;if (convertView == null) {convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.note_item, parent,false);viewHolder = new ViewHolder();viewHolder.title = (TextView) convertView.findViewById(R.id.tv_title);viewHolder.content = convertView.findViewById(R.id.tv_content);viewHolder.time = (TextView) convertView.findViewById(R.id.tv_time);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}String title = valuesList.get(position).getTitle();String content = valuesList.get(position).getContent();viewHolder.title.setText(title);viewHolder.content.setText(content);viewHolder.time.setText(valuesList.get(position).getTime());return convertView;}public void removeItem(int position){this.valuesList.remove(position);}}class ViewHolder{TextView title;TextView content;TextView time;} }Values.java
Values類實現對數據的保存
package zut.edu.cn.notepad;public class Values {private Integer id;private String title;private String content;private String time;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}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;}@Overridepublic String toString() {return "Values{" +"id=" + id +", title='" + title + '\'' +", content='" + content + '\'' +", time='" + time + '\'' +'}';} }Edit_Activity.java
package zut.edu.cn.notepad;import android.content.ContentValues; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast;import java.text.SimpleDateFormat; import java.util.Date;public class EditActivity extends AppCompatActivity {DBService myDb;private Button btnCancel;private Button btnSave;private EditText titleEditText;private EditText contentEditText;private TextView timeTextView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.note_editor);init();if(timeTextView.getText().length()==0)timeTextView.setText(getTime());}private void init() {myDb = new DBService(this);SQLiteDatabase db = myDb.getReadableDatabase();titleEditText = findViewById(R.id.et_title);contentEditText = findViewById(R.id.et_content);timeTextView = findViewById(R.id.edit_time);btnCancel = findViewById(R.id.btn_cancel);btnSave = findViewById(R.id.btn_save);//按鈕點擊事件btnCancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(EditActivity.this,MainActivity.class);startActivity(intent);}});btnSave.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {SQLiteDatabase db = myDb.getWritableDatabase();ContentValues values = new ContentValues();String title= titleEditText.getText().toString();String content=contentEditText.getText().toString();String time= timeTextView.getText().toString();if("".equals(titleEditText.getText().toString())){Toast.makeText(EditActivity.this,"標題不能為空",Toast.LENGTH_LONG).show();return;}if("".equals(contentEditText.getText().toString())) {Toast.makeText(EditActivity.this,"內容不能為空",Toast.LENGTH_LONG).show();return;}values.put(DBService.TITLE,title);values.put(DBService.CONTENT,content);values.put(DBService.TIME,time);db.insert(DBService.TABLE,null,values);Toast.makeText(EditActivity.this,"保存成功",Toast.LENGTH_LONG).show();Intent intent = new Intent(EditActivity.this,MainActivity.class);startActivity(intent);db.close();}});}//獲取當前時間private String getTime() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = new Date(System.currentTimeMillis());String str = sdf.format(date);return str;}}ShowActivity
package zut.edu.cn.notepad;import android.annotation.SuppressLint; import android.content.ContentValues; import android.content.DialogInterface; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast;import java.text.SimpleDateFormat; import java.util.Date;public class ShowActivity extends AppCompatActivity {private Button btnSave;private Button btnCancel;private TextView showTime;private EditText showContent;private EditText showTitle;private Values value;DBService myDb;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_show);init();}public void init() {myDb = new DBService(this);btnCancel = findViewById(R.id.show_cancel);btnSave = findViewById(R.id.show_save);showTime = findViewById(R.id.show_time);showTitle = findViewById(R.id.show_title);showContent = findViewById(R.id.show_content);Intent intent = this.getIntent();if (intent != null) {value = new Values();value.setTime(intent.getStringExtra(DBService.TIME));value.setTitle(intent.getStringExtra(DBService.TITLE));value.setContent(intent.getStringExtra(DBService.CONTENT));value.setId(Integer.valueOf(intent.getStringExtra(DBService.ID)));showTime.setText(value.getTime());showTitle.setText(value.getTitle());showContent.setText(value.getContent());}//按鈕點擊事件btnSave.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {SQLiteDatabase db = myDb.getWritableDatabase();ContentValues values = new ContentValues();String content = showContent.getText().toString();String title = showTitle.getText().toString();values.put(DBService.TIME, getTime());values.put(DBService.TITLE,title);values.put(DBService.CONTENT,content);db.update(DBService.TABLE,values,DBService.ID+"=?",new String[]{value.getId().toString()});Toast.makeText(ShowActivity.this,"修改成功",Toast.LENGTH_LONG).show();db.close();Intent intent = new Intent(ShowActivity.this,MainActivity.class);startActivity(intent);}});btnCancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {final String content = showContent.getText().toString();final String title = showTitle.getText().toString();new AlertDialog.Builder(ShowActivity.this).setTitle("提示框").setMessage("是否保存當前內容?").setPositiveButton("yes",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {SQLiteDatabase db = myDb.getWritableDatabase();ContentValues values = new ContentValues();values.put(DBService.TIME, getTime());values.put(DBService.TITLE,title);values.put(DBService.CONTENT,content);db.update(DBService.TABLE,values,DBService.ID+"=?",new String[]{value.getId().toString()});Toast.makeText(ShowActivity.this,"修改成功",Toast.LENGTH_LONG).show();db.close();Intent intent = new Intent(ShowActivity.this,MainActivity.class);startActivity(intent);}}).setNegativeButton("no",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Intent intent = new Intent(ShowActivity.this,MainActivity.class);startActivity(intent);}}).show();}});}String getTime() {@SuppressLint("SimpleDateFormat")SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");//獲取當前時間Date date = new Date(System.currentTimeMillis());return simpleDateFormat.format(date);} }偷偷地寫在最后
? 基本實現就是以上了,還有很多地方不太完善,希望能夠從一次一次的實踐當中學習到更多的東西。
? 曾經滄海難為水,除卻巫山不是云。
源碼已上傳:github.Notepad
參考博客:https://blog.csdn.net/zouguo1211/article/details/83474845
轉載于:https://www.cnblogs.com/tassel/p/10009071.html
總結
以上是生活随笔為你收集整理的Android 简单记事本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: httpd: apr_sockaddr_
- 下一篇: 本Blog一些声明