admin 管理员组

文章数量: 1184232

Android项目实战——一个简单的记事本程序

因为自己刚看完第一行代码,就想做一个小小的项目来巩固一下自己的知识,顺便检验一下自己的学习成果。

运行界面如图:

相信大家都已经看出来了,这个app分为两个activity,MainActivity中列出笔记的title,用户通过点击列表项目进入另一个活动。

下面是activity_main.xml的代码

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android=""android:id="@+id/activity_main"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><android.support.v4.widget.SwipeRefreshLayoutandroid:id="@+id/swipe_refresh"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_height="wrap_content"android:layout_width="match_parent"android:orientation="vertical"><ListViewandroid:id="@+id/list_item"android:layout_width="match_parent"android:layout_height="wrap_content"></ListView><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="暂无更多"/></LinearLayout></android.support.v4.widget.SwipeRefreshLayout><Buttonandroid:id="@+id/add"android:layout_height="wrap_content"android:layout_width="match_parent"android:text="添加"android:gravity="center"android:layout_alignParentBottom="true" /></RelativeLayout>

该布局中,有一个下拉刷新用来刷新新增加笔记或删除笔记导致ListView列表项的变化。

 

接下来是MainActivity的代码:

 

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;import android.widget.ListView;import java.util.ArrayList;
import java.util.List;import static com.example.notepad.DatabaseHelper.DB_NAME;
import static com.example.notepad.DatabaseHelper.TABLE_NAME;
import static com.example.notepad.DatabaseHelper.VERSION;public class MainActivity extends AppCompatActivity {public static DatabaseHelper dbHelper;private SQLiteDatabase db;private List<String> diary=new ArrayList<>();public static final int TAG_INSERT=1;public static final int TAG_UPDATE=0;private String select_item;private int Id;ListView listView;ArrayAdapter<String> adapter;private SwipeRefreshLayout swipeRefresh;public static DatabaseHelper getDbHelper(){return dbHelper;}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button add=(Button)findViewById(R.id.add);swipeRefresh=(SwipeRefreshLayout)findViewById(R.id.swipe_refresh);swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {@Overridepublic void onRefresh() {refresh();}});dbHelper=new DatabaseHelper(MainActivity.this,DB_NAME,null,VERSION);dbHelper.getWritableDatabase();init();//添加笔记add.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(MainActivity.this,Detail.class);intent.putExtra("TAG",TAG_INSERT);startActivity(intent);}});//设置列表项目点击事件listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {Intent intent=new Intent(MainActivity.this,Detail.class);Id=getDiaryId(position);//  Log.d("MainActivity",""+id);intent.putExtra("ID",Id);intent.putExtra("TAG",TAG_UPDATE);startActivity(intent);}});}private void init(){db=dbHelper.getWritableDatabase();diary.clear();//查询数据库,将title一列添加到列表项目中Cursor cursor=db.query(TABLE_NAME,null,null,null,null,null,null);if(cursor.moveToFirst()){String diary_item;do{diary_item=cursor.getString(cursor.getColumnIndex("title"));diary.add(diary_item);}while(cursor.moveToNext());}cursor.close();adapter=new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,diary);listView=(ListView)findViewById(R.id.list_item);listView.setAdapter(adapter);}private void refresh(){new Thread(new Runnable(){@Overridepublic void run() {try{Thread.sleep(1000);}catch(InterruptedException e){e.printStackTrace();}runOnUiThread(new Runnable() {@Overridepublic void run() {init();swipeRefresh.setRefreshing(false);}});}}).start();}private int getDiaryId(int position){//获取所点击的日记的titleint Id;select_item=diary.get(position);//获取iddb=dbHelper.getWritableDatabase();Cursor cursor=db.query(TABLE_NAME,new String[]{"id"},"title=?",new String[]{select_item},null,null,null);cursor.moveToFirst();Id=cursor.getInt(cursor.getColumnIndex("id"));return Id;}
}
 

DataHelper的代码:

 

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;/*** Created by Administrator on 2018/6/5.*/public class DatabaseHelper extends SQLiteOpenHelper{public static final String DB_NAME="NotePad.db";public static final int VERSION=1;public static final String TABLE_NAME="Diary";//建表语句public static final String CREATE_DIARY="create table Diary(" +"id integer primary key autoincrement," +"title text," +"content text)";private Context mContext;public DatabaseHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version){super(context,name,factory,version);mContext=context;}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_DIARY);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}
接下来是一个自定义控件menu_main.xml,用来作为第二个活动的标题栏,代码如下:

 

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android=""xmlns:app=""><itemandroid:id="@+id/delete"android:orderInCategory="1"app:showAsAction="always"android:title="删除"/><itemandroid:id="@+id/save"android:title="保存"android:orderInCategory="0"app:showAsAction="always"/></menu>
接下来新建一个activity,名为Detail,activity_detail.xml的代码如下:

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=""android:id="@+id/activity_detail"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><EditTextandroid:id="@+id/detail_title"android:layout_height="wrap_content"android:layout_width="match_parent"android:hint="title"android:background="#D1EEEE"android:textSize="30sp"/><EditTextandroid:id="@+id/detail_content"android:layout_height="wrap_content"android:layout_width="match_parent"android:hint="content"android:textSize="18sp"android:layout_marginTop="10dp"/>

</LinearLayout>

 

Detail.java的代码如下:

 

import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;import android.view.Menu;
import android.view.MenuItem;import android.widget.EditText;
import android.widget.Toast;import static com.example.notepad.DatabaseHelper.TABLE_NAME;
import static com.example.notepad.MainActivity.TAG_INSERT;
import static com.example.notepad.MainActivity.TAG_UPDATE;
import static com.example.notepad.MainActivity.dbHelper;
import static com.example.notepad.MainActivity.getDbHelper;public class Detail extends AppCompatActivity {private SQLiteDatabase db;EditText title;  //标题EditText content;  //内容public DatabaseHelper deHelper=getDbHelper();private int tag;private int id;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_detail);title=(EditText)findViewById(R.id.detail_title);content=(EditText)findViewById(R.id.detail_content);title.setSelection(title.getText().length());content.setSelection(content.getText().length());db= dbHelper.getWritableDatabase();Intent intent=getIntent();tag=intent.getIntExtra("TAG",-1);switch(tag){case TAG_INSERT:break;case TAG_UPDATE:id=intent.getIntExtra("ID",-1);Cursor cursor=db.query(TABLE_NAME,null,"id=?",new String[]{String.valueOf(id)},null,null,null);if(cursor.moveToFirst()){String select_title=cursor.getString(cursor.getColumnIndex("title"));String select_content=cursor.getString(cursor.getColumnIndex("content"));title.setText(select_title);content.setText(select_content);//  Log.d("Ditail","title:"+select_title);//  Log.d("Detail","content"+select_content);}break;default:}}//将menu中的actionbar添加进来@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu_main,menu);return true;}//设置“保存”或者“删除”按钮点击事件@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch(item.getItemId()){case R.id.save:if(tag==TAG_INSERT) {ContentValues values = new ContentValues();values.put("title", title.getText().toString());values.put("content", content.getText().toString());db.insert(TABLE_NAME, null, values);values.clear();Toast.makeText(this, "Save", Toast.LENGTH_SHORT).show();finish();break;}else if(tag==TAG_UPDATE){//修改title和contentString update_title=title.getText().toString();String update_content=content.getText().toString();ContentValues values=new ContentValues();values.put("title",update_title);values.put("content",update_content);db.update(TABLE_NAME,values,"id=?",new String[]{String.valueOf(id)});finish();break;}case R.id.delete:if(tag==TAG_UPDATE) {db.delete(TABLE_NAME,"id=?",new String[]{String.valueOf(id)});}Toast.makeText(this,"Delete",Toast.LENGTH_SHORT).show();finish();break;default:}return true;}
}
总结一下:总的来说,这个记事本最主要的地方在于SQLite数据库的操作,以及从一个activity到另一个activity所要传递的数据,这花费了我个人不少的时间。

希望这个app能帮助到大家!

本文标签: Android项目实战一个简单的记事本程序