1. 程式人生 > 其它 >Android studio課程設計——記事本APP

Android studio課程設計——記事本APP

技術標籤:安卓

前言

該設計是一款輕量級的便籤工具,使用Android Studio開發,風格簡練,可實現便籤的新增、刪除、修改、檢視功能。為保證一定的安全性,設定了進入口令,類似於應用鎖,使用者可以修改口令。主要使用的技術有共享引數、資料庫、SwipeRefreshLayout控制元件。

功能概述

使用者開啟應用後,啟動頁會判斷使用者是否第一次開啟,如果是第一次開啟,跳轉至引導頁,引導使用者設定進入口令;如果不是第一次開啟,則跳轉至口令確認介面,為保證應用幹練簡潔,啟動頁不設佈局,不設延時,使用者是感覺不到啟動頁的存在的。在口令確認介面,設定了“確認”和“更改”兩個按鈕,點選確認,如果口令正確會進入主介面;點選修改,則會跳轉到修改口令介面。主介面實現了便籤的預覽和新增功能,底部有一個“新增”按鈕,點選會進入便籤編輯介面,編輯完成後點選右上角儲存,會退出編輯介面,回到主介面,然後下拉重新整理,就會出現剛剛編輯過的便籤。再次點選便籤,會進入編輯介面,可修改便籤或刪除便籤。

系統設計

啟動介面

啟動頁面的功能是用於判斷使用者是否第一次開啟應用,如果是第一次開啟應用,則跳轉至引導頁,引導使用者設定進入口令;如果不是第一次開啟應用,則跳轉至口令確認介面。該設計是一款輕量級的便籤工具,旨在方便、快捷,因此啟動頁不設延時和佈局,僅用於實現判斷使用者是否第一次進入這一個功能。
這一功能實現的思路是,用共享引數儲存一個布林型變數,用true表示使用者第一次進入,false表示使用者不是第一次進入。每一次開啟應用,都需要判斷一次布林型變數的真假。
在第一次進入啟動頁面時,為該布林型變數賦初值true,if語句判斷為真,執行如下操作:修改布林型變數的值為false;跳轉至引導頁面。在第二次進入時,該布林型變數的值為false,執行操作:跳轉至口令確認介面。這樣就實現了只在第一次開啟應用時進入引導介面,不是第一次開啟則進入口令確認介面。

程式碼如下:

public class LaunchActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_launch);
        firstRun();  //用於判斷使用者是否第一次進入
    }
    private void firstRun(){
        SharedPreferences sharedPreferences=
getSharedPreferences("FirstRun",0); Boolean first_run=sharedPreferences.getBoolean("First",true); //第一次進入,修改布林變數值,跳轉至引導頁 if(first_run){ sharedPreferences.edit().putBoolean("First",false).commit(); Intent intent=new Intent(LaunchActivity.this,GuideActivity.class); startActivity(intent); finish(); } //不是第一次進入,跳轉至口令確認介面 else { Intent intent=new Intent(LaunchActivity.this, LoginActivity.class); startActivity(intent); finish(); } } }

引導介面

引導介面的功能是,在使用者第一次使用應用時,引導使用者設定一個進入口令,也就是應用鎖,旨在提供一定的安全性、私密性。
這一功能實現的思路是,在佈局頁面使用線性佈局設定三個控制元件,第一個是TextView控制元件,設定文字“歡迎使用便籤 請為自己設定一個進入口令吧!”,用於提示使用者。第二個是EditText控制元件,設定提示文字“請輸入由4位數字組成的口令”,讓使用者輸入口令。第三個是Button控制元件,設定文字“確認”。在程式碼檔案中,新建共享引數變數,新增鍵值對,key命名為”password”,用以儲存使用者口令。設定Button控制元件的點選事件,當用戶點選確認按鈕時,獲取EditText控制元件的字串並賦給共享引數,然後跳轉至主介面。這樣就實現了引導使用者設定口令,並儲存口令。
佈局如下:
在這裡插入圖片描述
程式碼如下:

public class LoginActivity extends AppCompatActivity {

    //宣告控制元件
    private Button mBtnConfirm;
    private Button mBtnAlter;
    private EditText mEt;
    private SharedPreferences mSharePreferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        //找到控制元件
        mBtnConfirm = findViewById(R.id.btn_Confirm);
        mBtnAlter = findViewById(R.id.btn_Alter);
        mEt = findViewById(R.id.et_main);

        //獲取共享引數
        mSharePreferences = getSharedPreferences("data",MODE_PRIVATE);
        mBtnConfirm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //獲取輸入口令
                String input = mEt.getText().toString();
                //判斷口令正誤
                if(input.equals(mSharePreferences.getString("password",""))) {
                    Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                    startActivity(intent);
                    Toast.makeText(LoginActivity.this, "歡迎進入!", Toast.LENGTH_SHORT).show();
                    LoginActivity.this.finish();  //跳轉到主介面後銷燬該介面
                }
                else{
                    Toast.makeText(LoginActivity.this, "口令錯誤!", Toast.LENGTH_SHORT).show();
                }
            }
        });
        //跳轉到修改口令介面
        mBtnAlter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(LoginActivity.this,AlterActivity.class);
                startActivity(intent);
                LoginActivity.this.finish();
            }
        });
    }
}

更改口令介面

該頁面實現的功能是更改口令。實現該功能的思路是,在佈局中設定兩個EditText控制元件,第一個id為et_alter_1,並新增提示文字“請輸入原口令”,第二個id為et_alter_2,新增提示文字“請輸入修改後口令”,然後設定Button控制元件,新增文字“確認”。在程式碼檔案中,設定Button控制元件的點選事件,當用戶點選確認按鈕時,獲取et_alter_1的字串並與共享引數password比較,相同說明原口令正確,然後獲取et_alter_2的字串並賦給password,並跳轉至主介面;如果不同,說明原口令錯誤,彈出提示。
佈局如下:
在這裡插入圖片描述
程式碼如下:

public class AlterActivity extends AppCompatActivity {

    //宣告控制元件
    private Button mBtn;
    private EditText mEt_1;
    private EditText mEt_2;
    private EditText mEt_main;

    private SharedPreferences mSharePreferences;//讀出
    private SharedPreferences.Editor mEditor;//存入

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alter);
        //找到控制元件
        mBtn = findViewById(R.id.btn_alter_confirm);
        mEt_1 = findViewById(R.id.et_alter_1);
        mEt_2 = findViewById(R.id.et_alter_2);
        mEt_main = findViewById(R.id.et_main);
        //獲取共享引數
        mSharePreferences = getSharedPreferences("data",MODE_PRIVATE);
        mEditor = mSharePreferences.edit();
        //修改口令
        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //匹配原口令是否正確,如果正確,點選修改後跳轉到主介面
                String input = mEt_1.getText().toString(); //獲取輸入口令
                if(mSharePreferences.getString("password","").equals(input)) {
                    mEditor.putString("password",mEt_2.getText().toString());//儲存修改後口令
                    mEditor.commit();
                    Toast.makeText(AlterActivity.this, "修改成功! 歡迎進入!", Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(AlterActivity.this, MainActivity.class);
                    startActivity(intent);
                    AlterActivity.this.finish();
                }
                else{
                    Toast.makeText(AlterActivity.this, "原口令錯誤!", Toast.LENGTH_SHORT).show();
                }

            }
        });
    }
}

主介面和編輯介面

主介面的功能是新增便籤、檢視便籤。點選新增按鈕,會跳轉至編輯介面,編輯完成點選儲存會自動回到主介面,下拉重新整理會出現剛剛編輯過的便籤。點選該便籤會再次進入編輯介面,可以進行修改和刪除操作。
這兩個介面的功能實現起來比較複雜,需要多個控制元件組合以及資料庫的使用,並且功能之間相互聯絡,不能分開敘述。下面以“新增便籤→在主介面顯示便籤→再次編輯該便籤”為主線介紹這兩個介面的功能實現。

1 建表

首先新建一個DatabaseHelper類,在這裡定義建表語句:

public static final String CREATE_DIARY="create table Diary(" +
        "id integer primary key autoincrement," +
        "title text," +
        "content text)";

表名為Diary,有兩列值,一列為title,表示便籤的標題,一列為content,表示便籤的內容。同時重寫onCreate方法:

public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_DIARY);
}

2 新增便籤

首先設定新增按鈕的點選事件:

add.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent=new Intent(MainActivity.this,Detail.class);
        intent.putExtra("TAG",TAG_INSERT);
        startActivity(intent);
    }
});

在編輯介面,設定儲存按鈕的點選事件,當用戶點選儲存時,要將兩個EditText控制元件的內容儲存到資料庫中,然後返回到主介面。注:編輯介面的佈局用的menu佈局。

public 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;
	  }

3 在主介面顯示便籤

回到主介面後,需要把剛剛新增的便籤顯示出來。這裡需要用到SwipeRefreshLayout控制元件、ListView控制元件和陣列介面卡ArrayAdapter。
首先需要查詢資料庫,將便籤的標題新增到列表專案中:

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);
}
然後通過SwipeRefreshLayout控制元件下拉重新整理,讓便籤標題在主介面顯示出來:
swipeRefresh=(SwipeRefreshLayout)findViewById(R.id.swipe_refresh);
swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout
        .OnRefreshListener() {
    @Override
    public void onRefresh() {
        refresh();
    }
});
private void refresh(){
    new Thread(new Runnable(){
        @Override
        public void run() {
            try{
                Thread.sleep(1000);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    init();
                    swipeRefresh.setRefreshing(false);
                }
            });
        }
    }).start();
}

4 再次編輯該便籤

標題在主介面顯示之後,需要通過點選標題,再次進入編輯介面,進行修改或刪除操作。
首先要設定列表專案點選事件:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public 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 int getDiaryId(int position){
        //獲取所點選的日記的title
        int Id;
        select_item=diary.get(position);
        //獲取id
        db=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;
    }
}

然後在編輯介面,要呈現出使用者點選的便籤對應的內容,這一功能通過資料庫查詢id實現。在編輯介面程式碼中,獲得主介面傳過來的id,查詢該id對應的表,並將該表的title列和content列賦值給對應的兩個EditText控制元件:

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);
}

在編輯完成後,使用者點選儲存,即可儲存修改後的內容。因為儲存按鈕實際上執行了兩個功能,一個是新建便籤時,實際上執行的是資料庫的insert功能,一個是修改便籤時,實際上執行的是資料庫的update功能,所以儲存按鈕的點選事件需要用if語句來區分這兩種情況:

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和content
    String 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;
}

使用者點選刪除,即可刪除便籤。實際上就是設定刪除按鈕的點選事件,讓其執行資料庫delete操作:

if(tag==TAG_UPDATE) {
    db.delete(TABLE_NAME,"id=?",new String[]{String.valueOf(id)});
}
Toast.makeText(this,"Delete",Toast.LENGTH_SHORT).show();
finish();

這樣,就完成主介面和編輯介面的所有功能。

5 主介面和編輯介面佈局

主介面
編輯介面