1、項(xiàng)目需求分析
1.1、記事功能需求分析:
1.1.1、顯示記事
用戶打開記事本可以看到之前所寫的所有記事內(nèi)容,進(jìn)入主頁后,軟件應(yīng)該從數(shù)據(jù)庫中搜索出該用戶所寫的全部記事,并將所有的數(shù)據(jù)進(jìn)行顯示。
1.1.2、添加記事
設(shè)置添加按鈕,點(diǎn)擊添加按鈕之后可以編輯記事的標(biāo)題和內(nèi)容。
1.1.3、編輯記事
在主界面的記事列表中,點(diǎn)擊一條記事,能夠進(jìn)行編輯,包括更改記事和刪除記事。
1.1.4、查詢記事
在主界面中設(shè)置查詢功能,使用戶可以通過對(duì)標(biāo)題進(jìn)行模糊查詢。
1.2、賬戶管理
為了保護(hù)用戶的隱私,在使用記事本時(shí)首先需要進(jìn)行用戶的登錄,在登錄賬號(hào)之后才可以使用記事本的功能。
1.2.1、注冊賬號(hào)
使用記事本功能首先需要進(jìn)行用戶的注冊,在注冊過程中應(yīng)注意用戶名以及密碼的正確輸入才可注冊成功。
1.2.2、登錄
登錄時(shí)需要對(duì)賬號(hào)以及密碼進(jìn)行檢測,如果賬號(hào)密碼正確即可進(jìn)入記事本頁面,使用記事本功能。
1.3、數(shù)據(jù)庫需求分析
在該項(xiàng)目中使用了兩個(gè)數(shù)據(jù)庫表,分別為存儲(chǔ)用戶信息的users表以及存儲(chǔ)記事本內(nèi)容的note表。
1.4、界面需求分析
在該項(xiàng)目中,一個(gè)有六個(gè)頁面,分別是用戶界面activity_user、注冊頁面activity_register、記事本主頁面activity_main、添加頁面activity_add、編輯頁面activity_edit、刪除頁面List_item_dialog。
總體布局以及背景色調(diào)使用簡約風(fēng)格。
2、項(xiàng)目的設(shè)計(jì)
2.1、注冊功能
圖 1 注冊功能
2.2、登錄功能
?
圖 2 登錄功能
2.3、記事功能
圖 3 記事功能
3、關(guān)鍵的代碼
3.1、頁面代碼(部分)
3.1.1、用戶界面activity_user.xml
<LinearLayout xmlns: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"
????tools:context=".MainActivity"
????android:orientation="vertical">
????<androidx.appcompat.widget.Toolbar
????????android:id="@+id/toolbar"
????????android:layout_width="match_parent"
????????android:layout_height="?attr/actionBarSize"
????????android:background="?attr/colorPrimary"
????????android:elevation="4dp"
????????app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
????????app:title="@string/app_name">
????</androidx.appcompat.widget.Toolbar>
????<LinearLayout
????????android:layout_width="match_parent"
????????android:layout_height="wrap_content"
????????android:orientation="horizontal"
????????android:layout_marginLeft="20dp"
????????android:layout_marginRight="20dp"
????????android:layout_marginTop="40dp"
????????android:gravity="center_vertical"
????????>
????????<TextView
????????????android:layout_width="wrap_content"
????????????android:layout_height="wrap_content"
????????????android:text="賬號(hào):"
????????????android:textSize="25sp"
????????????/>
????????<EditText
????????????android:id="@+id/et_account"
????????????android:layout_width="match_parent"
????????????android:hint="請(qǐng)輸入用戶名或手機(jī)號(hào)"
????????????android:layout_marginLeft="10dp"
????????????style="@style/MyEditStyle"
????????????android:inputType="text"
????????????/>
????</LinearLayout>
????<LinearLayout
????????android:layout_width="match_parent"
????????android:layout_height="wrap_content"
????????android:orientation="horizontal"
????????android:layout_marginLeft="20dp"
????????android:layout_marginRight="20dp"
????????android:layout_marginTop="20dp"
????????android:gravity="center_vertical"
????????>
????????<TextView
????????????android:layout_width="wrap_content"
????????????android:layout_height="wrap_content"
????????????android:text="密碼:"
????????????android:textSize="25sp"
????????????/>
????????<EditText
????????????android:id="@+id/et_password"
????????????android:layout_width="match_parent"
????????????android:layout_height="50dp"
????????????android:hint="請(qǐng)輸入密碼"
????????????android:textSize="18sp"
????????????android:layout_marginLeft="10dp"
????????????android:paddingLeft="5dp"
????????????android:inputType="numberPassword"
????????????android:background="@drawable/edit_text_bg"
????????????/>
????</LinearLayout>
????<LinearLayout
????????android:layout_width="match_parent"
????????android:layout_height="wrap_content"
????????android:orientation="horizontal"
????????android:gravity="center"
????????android:layout_marginTop="20dp"
????????android:layout_marginLeft="20dp"
????????android:layout_marginRight="20dp"
????????>
????????<CheckBox
????????????android:layout_width="wrap_content"
????????????android:layout_height="wrap_content"
????????????android:text="記住密碼"
????????????/>
????????<CheckBox
????????????android:layout_width="wrap_content"
????????????android:layout_height="wrap_content"
????????????android:text="自動(dòng)登錄"
????????????android:layout_marginLeft="40dp"
????????????/>
????</LinearLayout>
????<Button
????????style="@style/MyBtnStyle"
????????android:id="@+id/btn_login"
????????android:layout_width="match_parent"
????????android:layout_height="wrap_content"
????????android:text="登錄"
????????/>
????<Button
????????style="@style/MyBtnStyle"
????????android:id="@+id/btn_register"
????????android:layout_width="match_parent"
????????android:layout_height="wrap_content"
????????android:text="注冊"
????????/>
????<TextView
????????android:layout_width="wrap_content"
????????android:layout_height="wrap_content"
????????android:textColor="@color/colorPrimary"
????????android:text="還沒有賬號(hào)?"
????????android:layout_gravity="right"
????????android:layout_marginRight="20dp"
????????android:layout_marginTop="10dp"
????????/>
</LinearLayout>
3.1.2、記事本頁面activity.main.xml
<LinearLayout xmlns: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"
????tools:context=".MainActivity"
????android:orientation="vertical">
????<androidx.appcompat.widget.Toolbar
????????android:id="@+id/toolbar"
????????android:layout_width="match_parent"
????????android:layout_height="?attr/actionBarSize"
????????android:background="?attr/colorPrimary"
????????android:elevation="4dp"
????????app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
????????app:title="@string/app_name">
????</androidx.appcompat.widget.Toolbar>
????<FrameLayout
????????android:layout_width="match_parent"
????????android:layout_height="match_parent">
????????<androidx.recyclerview.widget.RecyclerView
????????????android:layout_width="match_parent"
????????????android:layout_height="match_parent"
????????????android:id="@+id/rlv"/>
???<com.google.android.material.floatingactionbutton.FloatingActionButton
????????????android:layout_width="wrap_content"
????????????android:layout_height="wrap_content"
????????????android:src="@android:drawable/ic_input_add"
????????????android:layout_gravity="right|bottom"
????????????android:layout_margin="20dp"
????????????android:onClick="add"
????????????/>
????</FrameLayout>
</LinearLayout>
3.1.3、注冊頁面activity_register.xml
<LinearLayout xmlns: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"
????tools:context=".RegisterActivity"
????android:orientation="vertical">
????<androidx.appcompat.widget.Toolbar
????????android:id="@+id/toolbar"
????????android:layout_width="match_parent"
????????android:layout_height="?attr/actionBarSize"
????????android:background="?attr/colorPrimary"
????????android:elevation="4dp"
????????app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
????????app:title="@string/app_name">
????</androidx.appcompat.widget.Toolbar>
????<LinearLayout
????????android:layout_width="match_parent"
????????android:layout_height="wrap_content"
????????android:layout_marginLeft="20dp"
????????android:layout_marginTop="40dp"
????????android:layout_marginRight="20dp"
????????android:gravity="center_vertical"
????????android:orientation="horizontal">
????????<TextView
????????????android:layout_width="wrap_content"
????????????android:layout_height="wrap_content"
????????????android:text="賬 號(hào):"
????????????android:textSize="25sp" />
????????<EditText
????????????android:id="@+id/et_account1"
????????????style="@style/MyEditStyle"
????????????android:layout_width="match_parent"
????????????android:layout_marginLeft="10dp"
????????????android:hint="請(qǐng)輸入用戶名"
????????????android:inputType="text" />
????</LinearLayout>
????<LinearLayout
????????android:layout_width="match_parent"
????????android:layout_height="wrap_content"
????????android:layout_marginLeft="20dp"
????????android:layout_marginTop="20dp"
????????android:layout_marginRight="20dp"
????????android:gravity="center_vertical"
????????android:orientation="horizontal">
????????<TextView
????????????android:layout_width="wrap_content"
????????????android:layout_height="wrap_content"
????????????android:text="密 碼:"
????????????android:textSize="25sp"
????????????/>
????????<EditText
????????????android:id="@+id/et_password1"
????????????style="@style/MyEditStyle"
????????????android:layout_width="match_parent"
????????????android:layout_marginLeft="10dp"
????????????android:hint="請(qǐng)輸入密碼"
????????????android:inputType="numberPassword" />
????</LinearLayout>
????<LinearLayout
????????android:layout_width="match_parent"
????????android:layout_height="wrap_content"
????????android:layout_marginLeft="20dp"
????????android:layout_marginTop="20dp"
????????android:layout_marginRight="20dp"
????????android:gravity="center_vertical"
????????android:orientation="horizontal">
????</LinearLayout>
????<Button
????????android:id="@+id/btn_register1"
????????style="@style/MyBtnStyle"
????????android:layout_width="match_parent"
????????android:layout_height="wrap_content"
????????android:text="注冊"
????????android:onClick="register"
????????/>
????<CheckBox
????????android:id="@+id/cb_agree"
????????android:layout_width="wrap_content"
????????android:layout_height="wrap_content"
????????android:layout_gravity="left"
????????android:layout_marginLeft="20dp"
????????android:layout_marginTop="10dp"
????????android:text="還沒有賬號(hào)?"
????????android:textColor="@color/colorPrimary" />
</LinearLayout>
3.2、實(shí)現(xiàn)類代碼(部分)
3.2.1、用戶登錄類UserActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class UserActivity extends AppCompatActivity implements View.OnClickListener {
????private Button login,register;
????private EditText name,password;
????private UserDbHelper userDbHelper;
????@Override
????protected void onCreate(Bundle savedInstanceState) {
????????super.onCreate(savedInstanceState);
????????setContentView(R.layout.activity_user);
????????userDbHelper = new UserDbHelper(this);
????????find();
????}
????private void find(){
????????login = findViewById(R.id.btn_login);
????????register = findViewById(R.id.btn_register);
????????name = findViewById(R.id.et_account);
????????password = findViewById(R.id.et_password);
????????login.setOnClickListener(this);
????????register.setOnClickListener(this);
????}
????@Override
????public void onClick(View view) {
????????int id = view.getId();
????????if (id == R.id.btn_login){
????????????String s = name.getText().toString();
????????????String s1 = password.getText().toString();
????????????????boolean login = userDbHelper.login(s,s1);
????????????????if (login) {
????????????????????Toast.makeText(this, "登陸成功!", Toast.LENGTH_SHORT).show();
????????????????????Intent i = new Intent(this, MainActivity.class);
????????????????????startActivity(i);
????????????????}else {
????????????????????Toast.makeText(this, "登陸失??!", Toast.LENGTH_SHORT).show();
????????????????}
????????}else if (id == R.id.btn_register){
????????????Intent i1 = new Intent(this,RegisterActivity.class);
????????????????startActivity(i1);
????????}
????}
}
3.2.2、記事本主頁面MainActivity.java,在activity首先創(chuàng)建出來的時(shí)候,先進(jìn)行onCreate方法,調(diào)用initData方法,調(diào)用之后會(huì)在數(shù)據(jù)庫中查詢數(shù)據(jù);查詢完數(shù)據(jù)之后,在調(diào)用initEvent方法,將數(shù)據(jù)存放渲染列表;接下來調(diào)用onResume方法,在refreshDataFromDb刷新數(shù)據(jù)庫之后進(jìn)行數(shù)據(jù)庫查詢;最后調(diào)用initEvent方法,渲染一個(gè)空的列表,重新進(jìn)行上述過程。
package com.example.myapplication;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.LinearLayout;
import com.example.myapplication.adaper.MyAdapter;
import com.example.myapplication.bean.Note;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class MainActivity extends AppCompatActivity {
????private RecyclerView mRecyclerView;
????private FloatingActionButton mBtnAdd;
????private List<Note> mNotes;
????private MyAdapter mMyAdapter;
????private NoteDbOpenHelper mNoteDbOpenHelper;
????@Override
????protected void onCreate(Bundle savedInstanceState) {
????????super.onCreate(savedInstanceState);
????????setContentView(R.layout.activity_main);
????????Toolbar toolbar = findViewById(R.id.toolbar);
????????// 設(shè)置Toolbar為ActionBar
????????setSupportActionBar(toolbar);
????????initView();
????????initData();
????????initEvent();
????}
????protected void onResume(){
????????super.onResume();
????????refreshDataFromDb();
????}
????//重新拿到數(shù)據(jù)庫中的信息
????private void refreshDataFromDb() {
????????mNotes = getDataFromDB();
????????mMyAdapter.refreshData(mNotes);
????}
????private void initEvent() {
????????mMyAdapter = new MyAdapter(this,mNotes);
????????mRecyclerView.setAdapter(mMyAdapter);
????????LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
????????mRecyclerView.setLayoutManager(linearLayoutManager);
????}
????private void initData() {
????????mNotes = new ArrayList<>();
????????mNoteDbOpenHelper = new NoteDbOpenHelper(this);
????}
????private List<Note> getDataFromDB() ?{
????????return mNoteDbOpenHelper.queryAllFromDb();
????}
????private String getCurrentTimeFormat(){
????????SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd HH:mm:ss");
????????Date date = new Date();
????????return simpleDateFormat.format(date);
????}
????private void initView(){
????????mRecyclerView = findViewById(R.id.rlv);
????}
????public void add(View view) {
????????Intent intent =new ?Intent(this,AddActivity.class);
????????startActivity(intent);
????}
????@Override
????public boolean onCreateOptionsMenu(Menu menu){
????????getMenuInflater().inflate(R.menu.menu_main,menu);
????????SearchView searchView = (SearchView) menu.findItem(R.id.menu_serch).getActionView();
????????//監(jiān)聽器
????????searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
????????????@Override
????????????public boolean onQueryTextSubmit(String query){
????????????????return false;
????????????}
????????????@Override
????????????public boolean onQueryTextChange(String newText){
????????????????mNotes = mNoteDbOpenHelper.queryFromDbByTitle(newText);
????????????????mMyAdapter.refreshData(mNotes);
????????????????return true;
????????????}
????????});
????????return super.onCreateOptionsMenu(menu);
????}
????@Override
????public boolean onOptionsItemSelected(@NonNull MenuItem item){
????????return super.onOptionsItemSelected(item);
????}
}
3.2.3、用戶數(shù)據(jù)庫類UserDbHelper.java
package com.example.myapplication;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
import com.example.myapplication.bean.User;
public class UserDbHelper extends SQLiteOpenHelper {
????private static final String DB_NAME = "users.db";
????private static final String create_users = "create table users(name varchar(32),password varchar(32))";
????public UserDbHelper(@Nullable Context context) {
????????super(context, DB_NAME, null, 1);
????}
????@Override
????public void onCreate(SQLiteDatabase sqLiteDatabase) {
????????sqLiteDatabase.execSQL(create_users);
????}
????@Override
????public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
????}
????public long register(User u){
????????SQLiteDatabase db = getWritableDatabase();
????????ContentValues cv = new ContentValues();
????????cv.put("name",u.getName());
????????cv.put("password",u.getPassword());
????????long users = db.insert("users",null,cv);
????????return users;
????}
????public boolean login(String name,String password){
????????SQLiteDatabase db1 = getWritableDatabase();
????????boolean result = false;
????????Cursor users = db1.query("users",null," name like ?",new String[]{name},null,null,null);
????????if (users != null){
????????????while(users.moveToNext()){
????????????????String password1 = users.getString(1);
????????????????result = password1.equals(password);
????????????????return result;
????????????}
????????}
????????return false;
????}
}
4、頁面展示以及測試用例
4.1、頁面展示
4.1.1、用戶登錄界面
圖 4 登錄頁面
4.1.2、用戶注冊頁面
????????
?
圖 5 注冊頁面
4.1.3、記事本主頁面
?
?
圖 6 記事本主頁面
4.1.4、添加頁面
???????
?
?????圖 7 添加頁面
4.1.5、編輯頁面
?
圖 8 編輯頁面
4.1.6、刪除頁面
?????
?
圖 9 刪除頁面
4.2、測試用例
4.2.1、登錄注冊用例
?
圖 10 登錄用例
4.2.2、注冊用例
?
圖 11 注冊用例
?
圖 12 注冊后數(shù)據(jù)庫中的變化
4.2.3、添加記事測試用例
圖 13 添加記事測試用例
4.2.4、刪除記事測試用例
?
?
?
圖 14 刪除記事測試用例
5、項(xiàng)目及課程總結(jié)
通過本次項(xiàng)目實(shí)踐,將Android課程中的重點(diǎn)進(jìn)行了運(yùn)用,對(duì)Activity之間的通信、SQLite數(shù)據(jù)庫操作、Service、和ListView等知識(shí)點(diǎn)有了更深入的了解,也讓自己對(duì)這些要點(diǎn)的實(shí)踐運(yùn)用更加得心應(yīng)手。
在本次項(xiàng)目中也出現(xiàn)了一些問題。再實(shí)現(xiàn)點(diǎn)擊按鈕進(jìn)行登錄注冊操作中,R.id.XXX出現(xiàn)報(bào)錯(cuò),無法進(jìn)行頁面的跳轉(zhuǎn)。查找資料后發(fā)現(xiàn),在ADT14之后,無法使用switch的case進(jìn)行頁面跳轉(zhuǎn)。最后我使用了if-else語句將該問題解決。文章來源:http://www.zghlxwxcb.cn/news/detail-774462.html
通過本次項(xiàng)目,簡單實(shí)現(xiàn)了一個(gè)記事本的功能,但是該項(xiàng)目還是較為簡單,希望在日后對(duì)Android的不斷學(xué)習(xí)中可以對(duì)該項(xiàng)目進(jìn)行完善,增加一些額外的功能。文章來源地址http://www.zghlxwxcb.cn/news/detail-774462.html
到了這里,關(guān)于Android記事本的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!