《移动应用程序设计基础》期末报告

课题名称:

《移动应用开发基础》上机考核

所使用的工具软件及环境:

JDK,Android Studio

一、课题背景

期末上机考核,将实验四中的内容和实验五的内容以及上课所完成的小实验相互结合,完成最后的考核。

二、任务内容

考核内容:上机单独完成一个简单日记本程序的编写。界面包括:用户登录,用户注册,日记本主页,新增编辑日记。

注意:以下***为您姓名的拼音单词第一个字母(如俞成海——ych)。

1.用户登录

布局:activity_login.xml, 布局如下图,资源图片username.png和password.png,布局要求左边内嵌图片,提示如图。(10分)

图1 登录界面布局

实现功能:LoginActivity.java

  1. 输入字段包括用户名(username),密码(password)和确定(ok)按钮,点击确定(ok)按钮(10分)

    1. 如果用户名(username)和密码(password)在SharedPreferences中存在的话,则跳转DiaryActivity
    2. 点击注册,跳转用户注册界面RegisterActivity
    3. 如果用户名(username)和密码(password)在SharedPreferences中不存在或不一致,则跳转用户注册界面RegisterActivity,同时Toast提示“username,请先注册您的信息,***程序友情提示!“如下图。

注意:

  1. 注册时,写入SharePreferences,文件名user,保存值username和password
  2. 登录时,读出SharePreferences(文件名为user)中的username和password

2.用户注册

界面布局:activity_register.xml, 布局如下图,资源图片username.png和password.png,布局要求左边内嵌图片,提示如下中间图。(10分)

       功能实现:RegisterActivity.java。点击注册(register),将用户名(username)和密码(password)插入到写入SharePreferences中(文件名user,保存值username和password),返回到登录界面,Toast弹出“注册成功,请登陆,***程序友情提示!”,如上图。(10分)

3.日记主页

界面布局:activity_diary.xml, 布局如下图,包括AppBarLayout,Listview和FloatingActionButton。(10分)

功能实现:DiaryActivity.java,

  1. 获取数据库***_DiaryDB.db中的表diary的信息,并将日记数据显示在listview中。(10分)
  2. 点击列表项中的编辑图片按钮,界面跳转到日记新增编辑界面(DiaryInfoActivity)。(5分)
  3. 点击AppBar上的编辑(edit_tv)列表项中的编辑图片按钮(bianji.png)替换成删除图片(delete.png),编辑改成取消,如下图。点击删除图片按钮,删除列表中的这一项,同时删除数据库中的该条数据,点击取消,取消改回为编辑,列表项中的删除图片(delete.png)替换成编辑图片按钮(bianji.png)。(10分)

三、界面设计与实现(描述设计思想和理念的加分)

登录界面采用简单而常用的linerLayout布局,注册界面同样也是

日记本主界面采用CoordinatorLayout布局、listview采用RelativeLayout布局

编辑日记界面与采用CoordinatorLayout布局

四、功能流程与实现(使用设计思想、设计模式、UML图和流程图加分)

流程图:

核心的java代码文件,以及根据实验5之后多出来的登录界面的布局文件,如下图为所有的文件详情。

代码文件:(代码文件有资源包,下载链接在文章最后)

//AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"package="com.example.sqlitedemo"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activityandroid:name=".Login"android:label="每日记"android:theme="@style/AppTheme.NoActionBar"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".Register"/><activity android:name=".MainActivity"/><activity android:name=".DiaryInfoActivity"/></application>
</manifest>
//Login.java
package com.example.sqlitedemo;import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;public class Login extends AppCompatActivity {static int p=0;static public EditText usenameEdtxt,passwordEdtxt;public Button registerButton,submitbutton;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);usenameEdtxt=(EditText)findViewById(R.id.usename_edtxt);passwordEdtxt=(EditText)findViewById(R.id.password_edtxt);submitbutton=(Button)findViewById(R.id.submit_button);registerButton=(Button)findViewById(R.id.register_button);//登录按钮监控submitbutton.setOnClickListener(new View.OnClickListener() {@RequiresApi(api = Build.VERSION_CODES.GINGERBREAD)@Overridepublic void onClick(View v) {String usename=usenameEdtxt.getText().toString();String password=passwordEdtxt.getText().toString();if(usename.isEmpty()){usenameEdtxt.setError("用户名不能为空");usenameEdtxt.requestFocus();return;}if(password.isEmpty()){passwordEdtxt.setError("密码不能为空");passwordEdtxt.requestFocus();return;}if(p==0){Toast.makeText(com.example.sqlitedemo.Login.this, usename+"请先注册您的信息,邵永刚程序友情提示!", Toast.LENGTH_SHORT).show();Intent it=new Intent();Context packageContext;it.setClass(com.example.sqlitedemo.Login.this, Register.class);com.example.sqlitedemo.Login.this.startActivity(it);return;}if(usename.length()>0&&password.length()>0&&usename.equals(Register.usenameEdtxt1.getText().toString())&&p==1&&password.equals(Register.passwordEdtxt1.getText().toString())){Toast.makeText(com.example.sqlitedemo.Login.this, "登录成功", Toast.LENGTH_SHORT).show();Intent it=new Intent();Context packageContext;it.setClass(com.example.sqlitedemo.Login.this, MainActivity.class);com.example.sqlitedemo.Login.this.startActivity(it);}else {Toast.makeText(com.example.sqlitedemo.Login.this, usename+"请先注册您的信息,邵永刚程序友情提示!", Toast.LENGTH_SHORT).show();Intent it=new Intent();Context packageContext;it.setClass(com.example.sqlitedemo.Login.this, Register.class);com.example.sqlitedemo.Login.this.startActivity(it);}}});registerButton.setOnClickListener(new View.OnClickListener() {@RequiresApi(api = Build.VERSION_CODES.GINGERBREAD)@Overridepublic void onClick(View v) {Toast.makeText(com.example.sqlitedemo.Login.this, "进行注册", Toast.LENGTH_SHORT).show();Intent it=new Intent();Context packageContext;it.setClass(com.example.sqlitedemo.Login.this, Register.class);com.example.sqlitedemo.Login.this.startActivity(it);}});}}
//Register.java
package com.example.sqlitedemo;import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;public class Register extends AppCompatActivity {static public EditText usenameEdtxt1,passwordEdtxt1;public Button registerButton;protected void onCreate(Bundle savedInstanceState) {Login.p=1;super.onCreate(savedInstanceState);setContentView(R.layout.register);usenameEdtxt1=(EditText)findViewById(R.id.usename_edtxt);passwordEdtxt1=(EditText)findViewById(R.id.password_edtxt);registerButton=(Button)findViewById(R.id.register_button);registerButton.setOnClickListener(new View.OnClickListener() {@RequiresApi(api = Build.VERSION_CODES.GINGERBREAD)@Overridepublic void onClick(View v) {String usename=usenameEdtxt1.getText().toString();String password=passwordEdtxt1.getText().toString();if(usename.isEmpty()){usenameEdtxt1.setError("用户名不能为空");usenameEdtxt1.requestFocus();return;}if(password.isEmpty()){passwordEdtxt1.setError("密码不能为空");passwordEdtxt1.requestFocus();return;}if(usename.length()>0&&password.length()>0){Toast.makeText(com.example.sqlitedemo.Register.this, "注册成功,请登陆,邵永刚程序友情提示!", Toast.LENGTH_SHORT).show();Intent it=new Intent();Context packageContext;it.setClass(com.example.sqlitedemo.Register.this, com.example.sqlitedemo.Login.class);com.example.sqlitedemo.Register.this.startActivity(it);}}});}
}
//MainActivity.java
package com.example.sqlitedemo;import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import android.os.Bundle;import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;import android.util.Log;
import android.view.View;import android.view.Menu;
import android.view.MenuItem;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import static android.os.Build.VERSION.SDK_INT;public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";private TextView editTv;private ListView diaryList;private FloatingActionButton fab;private List<Map<String, String>> listData;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(toolbar);listData = new ArrayList<>();fab = (FloatingActionButton) findViewById(R.id.fab);editTv = (TextView) findViewById(R.id.edit_tv);diaryList = (ListView) findViewById(R.id.list_view);fab.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.e(TAG, "onClick: " );Intent intent = new Intent(MainActivity.this, DiaryInfoActivity.class);intent.putExtra("FLAG", 0);startActivity(intent);}});editTv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Log.e(TAG, "on" );int length = queryData().size();if (editTv.getText().toString().equals("取消")){editTv.setText("编辑");for (int i = 0;i<length;i++){diaryList.getChildAt(i).findViewById(R.id.edit_ib).setVisibility(View.VISIBLE);diaryList.getChildAt(i).findViewById(R.id.delete_ib).setVisibility( View.INVISIBLE);}}else {editTv.setText("取消");for (int i = 0;i<length;i++){diaryList.getChildAt(i).findViewById(R.id.edit_ib).setVisibility(View.INVISIBLE);diaryList.getChildAt(i).findViewById(R.id.delete_ib).setVisibility( View.VISIBLE);}}}});diaryList.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {Intent intent = new Intent(MainActivity.this,DiaryInfoActivity.class);intent.putExtra("FLAG",1);intent.putExtra(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE,listData.get(position).get(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE));intent.putExtra(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT,listData.get(position).get(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT ));startActivity(intent);}});diaryList.setAdapter(new DiaryListAdapter(MainActivity.this,queryData()));}@Overrideprotected void onResume() {super.onResume();//重新查询适配diaryList.setAdapter(new DiaryListAdapter(MainActivity.this,queryData()));}/*** 从Sqlite中查询所有数据** @return 数据列表*/public List<Map<String,String>> queryData(){listData = new ArrayList<>();DiaryDbHelper dbHelper = new DiaryDbHelper(this);SQLiteDatabase db = dbHelper.getReadableDatabase();String[] projection = {SQLiteContract.DiaryEntry._ID,SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE,SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT,SQLiteContract.DiaryEntry.COLUMN_NAME_TIME };String sortOrder = SQLiteContract.DiaryEntry.COLUMN_NAME_TIME+" DESC";Cursor c = db.query(SQLiteContract.DiaryEntry.TABLE_NAME,projection,null,null, null,null,sortOrder);while (c.moveToNext()){Map<String,String> map = new HashMap<>();map.put(SQLiteContract.DiaryEntry._ID,c.getString(c.getColumnIndex( SQLiteContract.DiaryEntry._ID)));map.put(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE,c.getString(c.getColumnIndex(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE)));map.put(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT,c.getString(c .getColumnIndex(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT)));map.put(SQLiteContract.DiaryEntry.COLUMN_NAME_TIME,c.getString(c.getColumnIndex(SQLiteContract.DiaryEntry.COLUMN_NAME_TIME)));listData.add(map);}c.close();db.close();return listData;}
}
//DiaryInfoActivity.java
package com.example.sqlitedemo;import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.Toolbar;import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;import static android.os.Build.VERSION.SDK_INT;public class DiaryInfoActivity extends AppCompatActivity {private TextView titleTv,contentTv;private EditText titleEt,contentEt;private ImageButton submitIb;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_diary_info);Log.e("TAG","onResume()");androidx.appcompat.widget.Toolbar toolbar = (androidx.appcompat.widget.Toolbar) findViewById(R.id.toolbar_info);setSupportActionBar(toolbar);ActionBar actionBar = getSupportActionBar();//添加返回按钮actionBar.setDisplayHomeAsUpEnabled(true);//隐藏标题actionBar.setDisplayShowTitleEnabled(false);titleTv = (TextView)findViewById(R.id.info_title_tv);contentTv = (TextView)findViewById(R.id.info_content_tv);titleEt = (EditText)findViewById(R.id.info_title_et);contentEt = (EditText)findViewById(R.id.info_content_et);submitIb = (ImageButton)findViewById(R.id.submit_ib);//获取传递的参数int flag = getIntent().getIntExtra("FLAG",-1);final String id = getIntent().getStringExtra(SQLiteContract.DiaryEntry._ID);final String title = getIntent().getStringExtra(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE);String content = getIntent().getStringExtra(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT);//新建日记if(flag==0){submitIb.setVisibility(View.VISIBLE);titleTv.setVisibility(View.INVISIBLE);contentTv.setVisibility(View.INVISIBLE);titleEt.setVisibility(View.VISIBLE);contentEt.setVisibility(View.VISIBLE);submitIb.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if(titleEt==null|| titleEt.getText().toString().trim().equals("")){Toast.makeText(DiaryInfoActivity.this, "请输入标题",Toast.LENGTH_LONG).show();return;}if(contentEt==null|| contentEt.getText().toString().trim().equals("")){Toast.makeText(DiaryInfoActivity.this, "请输入内容",Toast.LENGTH_LONG).show();return;}//向Sqlite中插入一条信息DiaryDbHelper dbHelper = new DiaryDbHelper(DiaryInfoActivity.this);SQLiteDatabase db = dbHelper.getWritableDatabase();//格式化时间SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm");String date = sd.format(new Date());//设置插入值ContentValues values = new ContentValues();values.put(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE,titleEt.getText().toString());values.put(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT,contentEt.getText().toString());values.put(SQLiteContract.DiaryEntry.COLUMN_NAME_TIME, date);//执行插入方法long newRowId = db.insert(SQLiteContract.DiaryEntry.TABLE_NAME, null, values);DiaryInfoActivity.this.finish();}});}//查看日记else if(flag==1){submitIb.setVisibility(View.INVISIBLE);titleTv.setVisibility(View.VISIBLE);contentTv.setVisibility(View.VISIBLE);titleEt.setVisibility(View.INVISIBLE);contentEt.setVisibility(View.INVISIBLE);titleTv.setText(title);contentTv.setText(content);}//修改日记else if(flag==2){submitIb.setVisibility(View.VISIBLE);titleTv.setVisibility(View.INVISIBLE);contentTv.setVisibility(View.INVISIBLE);titleEt.setVisibility(View.VISIBLE);contentEt.setVisibility(View.VISIBLE);titleEt.setText(title);contentEt.setText(content);submitIb.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if(titleEt==null || titleEt.getText().toString().trim().equals("")){Toast.makeText(DiaryInfoActivity.this, "请输入标题",Toast.LENGTH_LONG).show();return;}if(contentEt==null || contentEt.getText().toString().trim().equals("")){Toast.makeText(DiaryInfoActivity.this, "请输入内容",Toast.LENGTH_LONG).show();return;}//从Sqlite中更新一条信息DiaryDbHelper dbHelper = new DiaryDbHelper(DiaryInfoActivity.this);SQLiteDatabase db = dbHelper.getWritableDatabase();//格式化时间SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm");String date = sd.format(new Date());ContentValues values = new ContentValues();values.put(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE,titleEt.getText().toString());values.put(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT,contentEt. getText().toString());values.put(SQLiteContract.DiaryEntry.COLUMN_NAME_TIME,date);//执行更新方法String selection = SQLiteContract.DiaryEntry._ID+"=?"; String[] selectionArgs = {id};int count = db.update( SQLiteContract.DiaryEntry.TABLE_NAME, values, selection,selectionArgs );DiaryInfoActivity.this.finish();}});}}private void setSupportActionBar(Toolbar toolbar) {}@Overridepublic boolean onOptionsItemSelected(@NonNull MenuItem item) {switch (item.getItemId()){//重写 ToolBar 返回按钮的行为,关闭此 Activitycase android.R.id.home: finish(); return true; }return super.onOptionsItemSelected(item);}
}
//DiaryListAdapter.java
package com.example.sqlitedemo;import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.TextView;import java.util.List;
import java.util.Map;public class DiaryListAdapter extends BaseAdapter {private static final String TAG="DiaryListAdapter";private Context context;private List<Map<String, String>> list;public DiaryListAdapter(Context context, List<Map<String, String>> list) {this.context = context;this.list = list;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);convertView = inflater.inflate(R.layout.listview_item,null);holder = new ViewHolder();holder.titleTv = (TextView) convertView.findViewById(R.id.title_tv);holder.timeTv = (TextView) convertView.findViewById(R.id.time_tv);holder.editIb = (ImageButton) convertView.findViewById(R.id.edit_ib);holder.deleteIb = (ImageButton) convertView.findViewById(R.id.delete_ib);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}holder.titleTv.setText(list.get(position).get(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE));holder.timeTv.setText(list.get(position).get(SQLiteContract.DiaryEntry.COLUMN_NAME_TIME));holder.editIb.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//Intent intent = new Intent(context, DiaryInfoActivity.class);Intent intent = new Intent(context,DiaryInfoActivity.class);intent.putExtra("FLAG",2);intent.putExtra(SQLiteContract.DiaryEntry._ID,list.get(position).get(SQLiteContract.DiaryEntry._ID));intent.putExtra(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE,list.get(position).get(SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE));intent.putExtra(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT,list. get(position).get(SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT));context.startActivity(intent);}});holder.deleteIb.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {AlertDialog.Builder builder = new AlertDialog. Builder                                                                  (context);builder.setTitle("提示").setMessage("确认删除?").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {DiaryDbHelper dbHelper = new DiaryDbHelper(context);SQLiteDatabase db = dbHelper.getWritableDatabase();String selection = SQLiteContract.DiaryEntry._ID+" = ?";String[] selectionArgs = {list.get(position).get(SQLiteContract.DiaryEntry._ID)};db.delete(SQLiteContract.DiaryEntry.TABLE_NAME,selection,selectionArgs);db.close();list.remove(position);notifyDataSetChanged();}}).setNegativeButton("取消", null);builder.show();}});return convertView;}static class ViewHolder {TextView titleTv, timeTv;ImageButton editIb, deleteIb;}
}
//DiaryDbHelper.java
package com.example.sqlitedemo;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;public class DiaryDbHelper extends SQLiteOpenHelper {public static final int DATABASE_VERSION = 1;public static final String DATABASE_NAME = "DiaryDB.db";private static final String TEXT_TYPE = " TEXT";private static final String DATE_TYPE = " DATE";private static final String COMMA_SEP = ",";private static final String SQL_CREATE_ENTRIES ="CREATE TABLE " + SQLiteContract.DiaryEntry.TABLE_NAME+"("+ SQLiteContract.DiaryEntry._ID+ " " +"INTEGER PRIMARY KEY AUTOINCREMENT,"+ SQLiteContract.DiaryEntry.COLUMN_NAME_TITLE+ TEXT_TYPE+COMMA_SEP+SQLiteContract.DiaryEntry.COLUMN_NAME_CONTENT+ TEXT_TYPE+COMMA_SEP+ SQLiteContract.DiaryEntry.COLUMN_NAME_TIME+DATE_TYPE+")";private static final String SQL_DELETE_ENTRIES ="DROP TABLE IF EXISTS " + SQLiteContract.DiaryEntry.TABLE_NAME;public DiaryDbHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(SQL_CREATE_ENTRIES);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL(SQL_DELETE_ENTRIES);onCreate(db);}
}
//SQLiteContract.java
package com.example.sqlitedemo;import android.provider.BaseColumns;public final class SQLiteContract {//为了防止使用者不小心实例化类的构造方法,//使构造函数私有化private SQLiteContract() {}//此内部类定义表的内容public static class DiaryEntry implements BaseColumns {public static final String TABLE_NAME = "diary";public static final String COLUMN_NAME_TITLE = "title";public static final String COLUMN_NAME_CONTENT = "content";public static final String COLUMN_NAME_TIME = "time";}
}
//activity_login.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Spaceandroid:layout_width="match_parent"android:layout_height="197dp" /><EditTextandroid:id="@+id/usename_edtxt"android:layout_width="275dp"android:layout_height="wrap_content"android:layout_gravity="center"android:drawableLeft="@drawable/username"android:drawablePadding="12dp"android:gravity="center|left"android:hint="请输入用户名"android:textColorHint="@android:color/darker_gray"android:textSize="24sp"tools:ignore="MissingConstraints" /><Spaceandroid:layout_width="match_parent"android:layout_height="46dp" /><EditTextandroid:id="@+id/password_edtxt"android:layout_width="272dp"android:layout_height="55dp"android:drawableLeft="@drawable/password"android:drawablePadding="12dp"android:gravity="center|left"android:hint="请输入密码"android:layout_gravity="center"android:inputType="textPassword"android:textColorHint="@android:color/darker_gray"android:textSize="24sp"tools:ignore="MissingConstraints" /><Spaceandroid:layout_width="match_parent"android:layout_height="60dp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><Spaceandroid:layout_width="47dp"android:layout_height="50dp" /><Buttonandroid:id="@+id/submit_button"android:layout_width="80dp"android:layout_height="wrap_content"android:backgroundTint="@color/white"android:text="确定"tools:ignore="MissingConstraints" /><Spaceandroid:layout_width="150dp"android:layout_height="53dp" /><Buttonandroid:id="@+id/register_button"android:layout_width="80dp"android:layout_height="wrap_content"android:backgroundTint="@color/white"android:text="注册"tools:ignore="DuplicateIds,MissingConstraints" /></LinearLayout></LinearLayout></androidx.constraintlayout.widget.ConstraintLayout>
//register.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Spaceandroid:layout_width="match_parent"android:layout_height="197dp" /><EditTextandroid:id="@+id/usename_edtxt"android:layout_width="275dp"android:layout_height="wrap_content"android:layout_gravity="center"android:drawableLeft="@drawable/username"android:drawablePadding="12dp"android:gravity="center|left"android:hint="请输入用户名"android:textColorHint="@android:color/darker_gray"android:textSize="24sp"tools:ignore="MissingConstraints" /><Spaceandroid:layout_width="match_parent"android:layout_height="46dp" /><EditTextandroid:id="@+id/password_edtxt"android:layout_width="272dp"android:layout_height="55dp"android:drawableLeft="@drawable/password"android:drawablePadding="12dp"android:gravity="center|left"android:hint="请输入密码"android:layout_gravity="center"android:inputType="textPassword"android:textColorHint="@android:color/darker_gray"android:textSize="24sp"tools:ignore="MissingConstraints" /><Spaceandroid:layout_width="match_parent"android:layout_height="60dp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><Spaceandroid:layout_width="150dp"android:layout_height="53dp" /><Buttonandroid:id="@+id/register_button"android:layout_width="80dp"android:layout_height="wrap_content"android:backgroundTint="@color/white"android:text="注册"tools:ignore="DuplicateIds,MissingConstraints" /></LinearLayout></LinearLayout></androidx.constraintlayout.widget.ConstraintLayout>

五、课题实现展示

 

 

进入登录界面,输入用户名和密码,此处不能为空,此时输入的用户名没有进行注册,所以会进入注册界面显示(请先注册)或者直接点击注册按钮进入注册界面显示(进行注册)。注册输入用户名和密码点击注册按钮显示(注册成功),会返回到登录界面,输入之前注册的用户名和密码,会进入到日记本主界面,显示(登录成功)。

 

点击编辑,可以删除所写的日记内容,点击加号按钮,可添加日记内容,点击勾保存。

 

点击日记标题右边的编辑图片按钮,可进入修改界面。

 

点击日记标题一行可以查看日记内容。点击编辑可删除日记,点击×会出现删除提示。

六、总结与体会

本次上机考核,通过高级控件进行设计登录与注册界面。同时运用SQLiteOpenHelper抽象类以及契约类SQLiteContract,创建SQLiteOpenHelper的子类并覆写onCreate方法。本次考核内容基本完成,学习到数据库的使用,使我更好掌握了安卓数据库的应用,通过查找资料以及学习,完成最后先登录在跳转进入日记本的制作。通过本次实验,收获颇多,复习了以前的知识,也学习到了新的内容,对今后的学习有了很大的帮助。

下载资源包:

https://download.csdn.net/download/weixin_48388330/76315152

资源中的图片以及内容只适用与学习

移动应用程序设计基础——期末考核——登录界面与简单日记本的综合实践相关推荐

  1. java程序设计基础 期末试卷_(程序设计基础JAVA)期末考试试卷.doc

    (程序设计基础JAVA)期末考试试卷 <程序设计基础(java)> 试题B卷 题号一二三四五六七八九总分得分 试卷说明:闭卷考试,时间120分钟. 一. 填空(本题共15空,每空2分,共3 ...

  2. Web程序设计基础期末大作业——模仿QQ飞车手游S联赛官网编写的网页

    QQ飞车手游是我非常喜欢的游戏,也是我现在为数不多的常在玩的游戏,刚好我Web程序设计基础的大作业是要做一套网站,我就借此机会模仿飞车S联赛官网的页面自己做了一个网页,又加了一些自己的元素,由于我做这 ...

  3. java图形用户登录界面_Java简单登录图形界面

    一.登录界面 1.程序代码 1 import java.awt.*;//导入awt包 2 import javax.swing.*;//导入swing包 3 import java.awt.event ...

  4. linux登录界面说明,Linux登录界面以及简单使用入门

    一.登录界面介绍 安装完操作系统以后,就进入到linux登录界面,linux默认登录界面可以分为:字符界面和图形界面: 图形界面如下所示: 字符界面如下所示: 字符登录界面的含义: CentOS re ...

  5. 学生管理系统登录界面/接口---简单前后端连接

    分析需写页面: 登录页面 学生信息展示页面:表格(可做处理) 学生详情页 前后端分别做: 前端: 1.搭建项目 2.写静态页面 3.用js实现简单的逻辑功能 4.连接后端(ajax),把数据变为真正的 ...

  6. 微信小程序踩坑—用户登录界面

    最近做的一个项目有涉及到用户登录.微信小程序的用户登录在我看来有两种,一种是需要用微信提供的用户身份标识,简单地说就是小程序的登录者就是使用这个小程序的微信用户,还有一种是小程序和服务器之间有自己的一 ...

  7. JAVA程序设计基础期末复习资料

    第1章 Java语言概述 Java语言的特点.(Java语言在1995年是Sum公司推出,2010年又是被Oracle收购 P2平台无关性.编译与解释并存. 面向对象的基本特征. 继承性:将公共的方法 ...

  8. C程序设计基础期末考试复习

    总览C语言的程序 C程序的创建过程 编辑(源程序--C语言) 编译(目标程序--机器语言) 链接 执行(可执行文件--机器语言) 数据类型及运算 数据类型及其大小(基于机器) 符号属性 长度属性 基本 ...

  9. python基础教程期末考试题_智慧树Python程序设计基础期末教程考试完整答案

    [单选题]角色震荡体现在: A. 留学生在学习的时候,对教育系统和学校生活的适应过程. B. 由于远离母文化而对自己的所处文化感到混乱和困惑. C. 在异国他乡,人们熟悉的社会联系不复存在. D. 个 ...

最新文章

  1. python读写二进制
  2. 如何处理VirtualBox启动错误消息:The vboxdrv kernel module is not loaded
  3. Qt工作笔记-QML中TextInput设置默认值,以及使用正则表达式只能输入整数
  4. 小学四则运算结对项目报告(GUI)
  5. object怎么转list_PaddleOCR识别模型转Pytorch全流程记录
  6. 51 单片机串口烧录程序方法
  7. DSP28335 Flash烧写
  8. 机房服务器存放位置要求,服务器机房建设设计要求规范.doc
  9. 图片、照片相似度批量对比
  10. 面对tomatserver使用的webrequest
  11. 海康威视摄像头密码重置方法
  12. 衣服尺码自定义排序sql
  13. sk_buff 剖析
  14. A53系统移植、内核、文件系统
  15. css3 border边框斜线,CSS3 斜线分割布局
  16. RGB图转为灰度图的方法
  17. 树模型(四):随机森林
  18. Centos8.3 nfs-ganesha使用ceph后端
  19. 网线/双绞线上各标识CAT, AWG, PR, UTP/STP/FTP/SFTP的含义
  20. 水星路由器wan服务器无响应,水星路由器常见故障

热门文章

  1. 网易教育线终于『并轨』
  2. 【申博攻略】一.北交计算机学院学术型博士“申请-考核”攻略(招生简章篇)
  3. 计算机设备管理器里面没有图像,设备管理器里没有图像设备怎么办?
  4. JavaScript基础复习之数据类型,解读数据类型不为人知的一面
  5. 使用Dhtml和poi导出excle表格出现Error Type:LoadXMl Incorrect Json错误
  6. 让你越来越值钱的秘密:目标清单
  7. 通过企业微信或者微信公众号发送小程序消息推送功能
  8. 安卓端身份证识别与云端服务器识别
  9. 绕过SSL双向校验抓取Soul App的数据包
  10. 5种经典的数据分析思维和方法