当前位置:   article > 正文

Android Studio——记事本案例_android studio记事本

android studio记事本

一、布局界面

        1、记事本界面布局

main_notepad.xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:background="#fefefe">
  5. <TextView
  6. android:id="@+id/note_name"
  7. android:layout_width="match_parent"
  8. android:layout_height="45dp"
  9. android:background="@android:color/darker_gray"
  10. android:text="记事本"
  11. android:gravity="center"
  12. android:textStyle="bold"
  13. android:textColor="@android:color/black"
  14. android:textSize="20sp" />
  15. <ListView
  16. android:id="@+id/listview"
  17. android:layout_width="match_parent"
  18. android:layout_height="match_parent"
  19. android:cacheColorHint="#00000000"
  20. android:divider="#E4E4E4E4"
  21. android:dividerHeight="1dp"
  22. android:fadingEdge="horizontal"
  23. android:listSelector="#00000000"
  24. android:scrollbars="none"
  25. android:layout_below="@+id/note_name">
  26. </ListView>
  27. <ImageView
  28. android:id="@+id/add"
  29. android:layout_width="60dp"
  30. android:layout_height="60dp"
  31. android:background="@drawable/add"
  32. android:layout_marginBottom="30dp"
  33. android:layout_alignParentBottom="true"
  34. android:layout_centerHorizontal="true"/>
  35. </RelativeLayout>

        2、记事本Item布局界面

activity_item.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical"
  5. android:paddingLeft="12dp">
  6. <TextView
  7. android:id="@+id/ietm_content"
  8. android:textColor="@android:color/black"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:maxLines="2"
  12. android:ellipsize="end"
  13. android:lineSpacingExtra="3dp"
  14. android:paddingTop="10dp"/>
  15. <TextView
  16. android:id="@+id/item_time"
  17. android:textColor="#fb7a6a"
  18. android:layout_width="match_parent"
  19. android:layout_height="wrap_content"
  20. android:paddingTop="5dp"
  21. android:paddingBottom="7dp"/>
  22. </LinearLayout>

        3、添加、修改界面布局

activity_record.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical"
  5. android:background="#fefefe">
  6. <RelativeLayout
  7. android:layout_width="match_parent"
  8. android:layout_height="45dp"
  9. android:background="#E4E4E4"
  10. android:orientation="horizontal">
  11. <ImageView
  12. android:id="@+id/note_back"
  13. android:layout_width="45dp"
  14. android:layout_height="wrap_content"
  15. android:layout_centerVertical="true"
  16. android:paddingLeft="10dp"
  17. android:background="@drawable/back"/>
  18. <TextView
  19. android:id="@+id/note_name"
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:layout_centerInParent="true"
  23. android:gravity="center"
  24. android:text="记事本"
  25. android:textColor="@android:color/black"
  26. android:textSize="15sp"
  27. android:textStyle="bold" />
  28. </RelativeLayout>
  29. <TextView
  30. android:id="@+id/tv_time"
  31. android:layout_width="match_parent"
  32. android:layout_height="wrap_content"
  33. android:textSize="15sp"
  34. android:paddingTop="10dp"
  35. android:paddingBottom="10dp"
  36. android:gravity="center"
  37. android:visibility="gone"
  38. android:textColor="#fb7a6a"/>
  39. <EditText
  40. android:id="@+id/note_content"
  41. android:layout_width="match_parent"
  42. android:layout_height="match_parent"
  43. android:layout_weight="1"
  44. android:gravity="top"
  45. android:hint="请输入要添加的内容"
  46. android:paddingLeft="5dp"
  47. android:textColor="@android:color/black"
  48. android:background="#fefefe"/>
  49. <View
  50. android:layout_width="match_parent"
  51. android:layout_height="1dp"
  52. android:background="#fb7a6a"/>
  53. <LinearLayout
  54. android:layout_width="match_parent"
  55. android:layout_height="55dp"
  56. android:orientation="horizontal">
  57. <ImageView
  58. android:layout_width="match_parent"
  59. android:layout_height="wrap_content"
  60. android:layout_weight="1"
  61. android:background="@android:color/white"
  62. android:paddingBottom="15dp"
  63. android:paddingTop="9dp"/>
  64. <ImageView
  65. android:layout_width="match_parent"
  66. android:layout_height="wrap_content"
  67. android:layout_weight="1"
  68. android:background="@android:color/white"
  69. android:paddingBottom="15dp"
  70. android:paddingTop="9dp"/>
  71. <ImageView
  72. android:id="@+id/delete"
  73. android:layout_width="match_parent"
  74. android:layout_height="wrap_content"
  75. android:layout_weight="1"
  76. android:background="@drawable/delete"
  77. android:paddingBottom="15dp"
  78. android:paddingTop="9dp"/>
  79. <ImageView
  80. android:layout_width="match_parent"
  81. android:layout_height="wrap_content"
  82. android:layout_weight="1"
  83. android:background="@android:color/white"
  84. android:paddingBottom="15dp"
  85. android:paddingTop="9dp"/>
  86. <ImageView
  87. android:layout_width="match_parent"
  88. android:layout_height="wrap_content"
  89. android:layout_weight="1"
  90. android:background="@android:color/white"
  91. android:paddingBottom="15dp"
  92. android:paddingTop="9dp"/>
  93. <ImageView
  94. android:id="@+id/note_save"
  95. android:layout_width="match_parent"
  96. android:layout_height="wrap_content"
  97. android:layout_weight="1"
  98. android:background="@drawable/save"
  99. android:paddingTop="9dp"
  100. android:paddingBottom="15dp" />
  101. <ImageView
  102. android:id="@+id/none2"
  103. android:layout_width="match_parent"
  104. android:layout_height="wrap_content"
  105. android:layout_weight="1"
  106. android:background="@android:color/white"
  107. android:paddingBottom="15dp"
  108. android:paddingTop="9dp"/>
  109. <ImageView
  110. android:layout_width="match_parent"
  111. android:layout_height="wrap_content"
  112. android:layout_weight="1"
  113. android:background="@android:color/white"
  114. android:paddingBottom="15dp"
  115. android:paddingTop="9dp"/>
  116. </LinearLayout>
  117. </LinearLayout>

二、封装记录信息实体类

        记事本的每个记录都会有记录内容和记录时间这两个属性,因此需要建立一个实体类用于存放这些属性。

NotepadBean.java

  1. public class NotepadBean {
  2. private String id;
  3. private String notepadContent;
  4. private String notepadTime;
  5. public String getId() {
  6. return id;
  7. }
  8. public void setId(String id) {
  9. this.id = id;
  10. }
  11. public String getNotepadContent() {
  12. return notepadContent;
  13. }
  14. public void setNotepadContent(String notepadContent) {
  15. this.notepadContent = notepadContent;
  16. }
  17. public String getNotepadTime() {
  18. return notepadTime;
  19. }
  20. public void setNotepadTime(String notepadTime) {
  21. this.notepadTime = notepadTime;
  22. }
  23. }

三、编写记事本界面列表适配器

        因为记事本的纪录列表是使用ListView控件展示的,因此需要建立一个数据适配器对ListView控件进行数据适配。

NotepadAdapter.java

  1. public class NotepadAdapter extends BaseAdapter {
  2. private LayoutInflater layoutInflater;
  3. private List<NotepadBean> list;
  4. public NotepadAdapter(Context context, List<NotepadBean> list){
  5. this.layoutInflater=LayoutInflater.from(context);
  6. this.list=list;
  7. }
  8. @Override
  9. //获取Item条目的总数
  10. public int getCount(){
  11. return list==null? 0: list.size();
  12. }
  13. @Override
  14. //根据position(位置)获取某个Item的对象
  15. public Object getItem(int position){
  16. return list.get(position);
  17. }
  18. @Override
  19. //根据position(位置)获取某个Item的id
  20. public long getItemId(int position){
  21. return position;
  22. }
  23. @Override
  24. //获取相应position对应的Item视图,position是当前Item的位置,convertView用于复用旧视图,parent用于加载xml布局
  25. public View getView(int position, View convertView, ViewGroup parent){
  26. ViewHolder viewHolder;
  27. //通过inflate()方法加载Item布局,并将获取的数据显示到对应的控件上,并判断旧视图是否为空,若为空,则创建一个ViewHolder对象
  28. //通过set.Tag()方法将该对象添加到convertView中进行缓存,否则把获取的旧视图进行缓存
  29. if(convertView==null){
  30. convertView=layoutInflater.inflate(R.layout.activity_item,null);
  31. viewHolder=new ViewHolder(convertView);
  32. convertView.setTag(viewHolder);
  33. }
  34. else{
  35. viewHolder=(ViewHolder) convertView.getTag();
  36. }
  37. NotepadBean noteInfo=(NotepadBean) getItem(position);
  38. viewHolder.tvNoteoadContent.setText(noteInfo.getNotepadContent());
  39. viewHolder.tvNotepadTime.setText(noteInfo.getNotepadTime());
  40. return convertView;
  41. }
  42. class ViewHolder{
  43. TextView tvNoteoadContent;
  44. TextView tvNotepadTime;
  45. public ViewHolder(View view){
  46. tvNoteoadContent=(TextView) view.findViewById(R.id.ietm_content);
  47. tvNotepadTime=(TextView) view.findViewById((R.id.item_time));
  48. }
  49. }
  50. }

四、创建数据库

        因为记事本的存储和读取记录的数据都是通过数据库完成的,因此需要创建数据库

        1、先创建一个DBUtils类,在该类中定义数据库的名称、表名、数据库版本、数据库表中的列名以及获取当前日期等信息。

DBUtils.java

  1. public class DBUtils {
  2. public static final String DATABASE_NAME="Notepad";
  3. public static final String DATABASE_TABLE="Note";
  4. public static final int DATABASE_VERSION=1;
  5. //数据库表中的列名
  6. public static final String NOTEPAD_ID="id";
  7. public static final String NOTEPAD_CONTENT="content";
  8. public static final String NOTEPAD_TIME="notetime";
  9. //获取当前日期
  10. public static final String getTime(){
  11. SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy年MM月dd日HH:mm;ss");
  12. Date date=new Date(System.currentTimeMillis());
  13. return simpleDateFormat.format(date);
  14. }
  15. }

        2、创建SQLiteHelper类,在该类中实现增删改查操作

SQLiteHelper.java

  1. public class SQLiteHelper extends SQLiteOpenHelper {
  2. private SQLiteDatabase sqLiteDatabase;
  3. //创建数据库
  4. public SQLiteHelper(Context context){
  5. super(context, DBUtils.DATABASE_NAME,null,DBUtils.DATABASE_VERSION);
  6. sqLiteDatabase=this.getWritableDatabase();
  7. }
  8. //创建表
  9. @Override
  10. public void onCreate(SQLiteDatabase db){
  11. db.execSQL("create table "+DBUtils.DATABASE_TABLE+"("+DBUtils.NOTEPAD_ID+" integer primary key autoincrement,"+DBUtils.NOTEPAD_CONTENT+" text,"+DBUtils.NOTEPAD_TIME+ " text)");
  12. }
  13. @Override
  14. public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){}
  15. //添加数据
  16. public boolean insertData(String userContent,String userTime){
  17. ContentValues contentValues=new ContentValues();
  18. contentValues.put(DBUtils.NOTEPAD_CONTENT,userContent);
  19. contentValues.put(DBUtils.NOTEPAD_TIME,userTime);
  20. return sqLiteDatabase.insert(DBUtils.DATABASE_TABLE,null,contentValues)>0;
  21. }
  22. //删除数据
  23. public boolean deleteData(String id){
  24. String sql=DBUtils.NOTEPAD_ID+"=?";
  25. String [] contentValuesArray=new String[]{String.valueOf(id)};
  26. return sqLiteDatabase.delete(DBUtils.DATABASE_TABLE,sql,contentValuesArray)>0;
  27. }
  28. //修改数据
  29. public boolean updateData(String id,String content,String userYear){
  30. ContentValues contentValues=new ContentValues();
  31. contentValues.put(DBUtils.NOTEPAD_CONTENT,content);
  32. contentValues.put(DBUtils.NOTEPAD_TIME,userYear);
  33. String sql=DBUtils.NOTEPAD_ID+"=?";
  34. String [] strings=new String[] {id};
  35. return sqLiteDatabase.update(DBUtils.DATABASE_TABLE,contentValues,sql,strings)>0;
  36. }
  37. //查询数据
  38. public List<NotepadBean> query(){
  39. List<NotepadBean> list =new ArrayList<NotepadBean>();
  40. Cursor cursor=sqLiteDatabase.query(DBUtils.DATABASE_TABLE,null,null,null,null,null,DBUtils.NOTEPAD_ID+" desc");
  41. if(cursor!=null){
  42. while(cursor.moveToNext()){
  43. NotepadBean noteInfo=new NotepadBean();
  44. @SuppressLint("range")
  45. String id=String.valueOf(cursor.getInt(cursor.getColumnIndex(DBUtils.NOTEPAD_ID)));
  46. @SuppressLint("range")
  47. String content=cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_CONTENT));
  48. @SuppressLint("range")
  49. String time=cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_TIME));
  50. noteInfo.setId(id);
  51. noteInfo.setNotepadContent(content);
  52. noteInfo.setNotepadTime(time);
  53. list.add(noteInfo);
  54. }
  55. cursor.close();
  56. }
  57. return list;
  58. }
  59. }

五、实现添加记录界面功能

        因为添加记录界面有保存和删除按钮,因此创建记录类实现点击事件,将编写的内容添加到数据库中。

RecordActivity.java

  1. public class RecordActivity extends AppCompatActivity implements View.OnClickListener{
  2. ImageView delete,note_save,note_back;
  3. TextView noteName,note_time;
  4. EditText content;
  5. SQLiteHelper mSQLiteHelper;
  6. String id;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_record);
  11. //通过findViewById获取界面控件
  12. note_back=(ImageView) findViewById(R.id.note_back);
  13. note_save=(ImageView) findViewById(R.id.note_save);
  14. delete=(ImageView) findViewById(R.id.delete);
  15. noteName=(TextView) findViewById(R.id.note_name);
  16. note_time=(TextView) findViewById(R.id.tv_time);
  17. content=(EditText) findViewById(R.id.note_content);
  18. //设置启动器
  19. note_back.setOnClickListener(this);
  20. delete.setOnClickListener(this);
  21. note_save.setOnClickListener(this);
  22. //初始化
  23. initData();
  24. }
  25. protected void initData(){
  26. //创建数据库
  27. mSQLiteHelper=new SQLiteHelper(this);
  28. noteName.setText("添加记录");
  29. //接收记事本传来的消息
  30. //getIntent()方法获取Intent对象
  31. Intent intent=getIntent();
  32. if(intent!=null){
  33. //获取传递的记录id
  34. id=intent.getStringExtra("id");
  35. if(id!=null){
  36. noteName.setText("修改记录");
  37. content.setText(intent.getStringExtra("content"));
  38. note_time.setText(intent.getStringExtra("time"));
  39. note_time.setVisibility(View.VISIBLE);
  40. }
  41. }
  42. }
  43. public void onClick(View v){
  44. switch (v.getId()){
  45. //后退,删除,保存事件
  46. case R.id.note_back:
  47. finish();
  48. break;
  49. case R.id.delete:
  50. content.setText("");
  51. break;
  52. case R.id.note_save:
  53. //通过getText()获取输入内容
  54. String noteContent=content.getText().toString().trim();
  55. if(id!=null){
  56. if(noteContent.length()>0){
  57. if(mSQLiteHelper.updateData(id,noteContent,DBUtils.getTime())){
  58. showToast("修改成功");
  59. setResult(2);
  60. finish();
  61. }
  62. else{
  63. showToast("保存失败");
  64. }
  65. }
  66. else{
  67. showToast("保存内容不能为空");
  68. }
  69. }
  70. //向数据库添加数据
  71. else{
  72. if(noteContent.length()>0){
  73. if(mSQLiteHelper.insertData(noteContent,DBUtils.getTime())){
  74. showToast("保存成功");
  75. setResult(2);
  76. finish();
  77. }
  78. else{
  79. showToast("保存失败");
  80. }
  81. }
  82. else{
  83. showToast("修改内容不能为空");
  84. }
  85. }
  86. break;
  87. }
  88. }
  89. public void showToast(String Message){
  90. Toast.makeText(RecordActivity.this,Message,Toast.LENGTH_SHORT).show();
  91. }
  92. }

六、实现记事本界面的显示功能

        等于就是刚进入程序的界面的选择与操作

MainActivity.java

  1. public class MainActivity extends Activity {
  2. ListView listView;
  3. List<NotepadBean> list;
  4. SQLiteHelper mSQLiteHelper;
  5. NotepadAdapter adapter;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_notepad);
  10. //用于显示记录的列表
  11. listView=(ListView) findViewById(R.id.listview);
  12. ImageView add=(ImageView) findViewById(R.id.add);
  13. //设置添加按钮事件
  14. add.setOnClickListener(new View.OnClickListener() {
  15. @Override
  16. public void onClick(View v) {
  17. //使用显示Intent指定要跳转的目标Activity,并通过startActivityForResult()方法开启目标Activity
  18. Intent intent=new Intent(MainActivity.this,RecordActivity.class);
  19. startActivityForResult(intent,1);
  20. }
  21. });
  22. initData();
  23. }
  24. protected void initData() {
  25. //创建数据库
  26. mSQLiteHelper = new SQLiteHelper(this);
  27. showQueryData();
  28. //处理查看记事本详细信息
  29. listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  30. @Override
  31. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  32. //通过get方法获取对应的Item数据
  33. NotepadBean notepadBean=list.get(position);
  34. //通过putExtra()方法封装到Intent对象中
  35. Intent intent=new Intent(MainActivity.this,RecordActivity.class);
  36. intent.putExtra("id",notepadBean.getId());
  37. intent.putExtra("time",notepadBean.getNotepadTime());
  38. intent.putExtra("content",notepadBean.getNotepadContent());
  39. MainActivity.this.startActivityForResult(intent,1);
  40. }
  41. });
  42. //删除记事本记录
  43. listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
  44. @Override
  45. public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
  46. AlertDialog dialog;
  47. AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this)
  48. .setMessage("是否删除此纪录?")
  49. .setPositiveButton("确定", new DialogInterface.OnClickListener() {
  50. @Override
  51. public void onClick(DialogInterface dialog, int which) {
  52. //获取Item对象
  53. NotepadBean notepadBean=list.get(position);
  54. if(mSQLiteHelper.deleteData(notepadBean.getId())){
  55. //删除对应的Item
  56. list.remove(position);
  57. //更新记事本界面
  58. adapter.notifyDataSetChanged();
  59. Toast.makeText(MainActivity.this,"删除成功",Toast.LENGTH_SHORT).show();
  60. }
  61. }
  62. })
  63. .setPositiveButton("取消", new DialogInterface.OnClickListener() {
  64. @Override
  65. public void onClick(DialogInterface dialog, int which) {
  66. dialog.dismiss();
  67. }
  68. });
  69. dialog=builder.create();
  70. dialog.show();
  71. return true;
  72. }
  73. });
  74. }
  75. private void showQueryData(){
  76. if(list!=null){
  77. list.clear();
  78. }
  79. //从数据库中查询数据
  80. list=mSQLiteHelper.query();
  81. adapter=new NotepadAdapter(this,list);
  82. listView.setAdapter(adapter);
  83. }
  84. @Override
  85. //重写,当关闭添加记录界面时,程序回调该方法
  86. // 并在该方法中调用showQueryData()方法重新获取数据库中保存的记录数据并显示到记录列表中
  87. protected void onActivityResult(int requestCode,int resultCode,Intent data){
  88. super.onActivityResult(requestCode,resultCode,data);
  89. if(requestCode==1&&resultCode==2){
  90. showQueryData();
  91. }
  92. }
  93. }

七、运行结果截图

        主界面

         选择添加按钮之后进入编写界面

         修改界面

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/732226
推荐阅读
相关标签
  

闽ICP备14008679号