安卓開發實戰-記賬本APP(三)


本次實現的是有關登錄,注冊和整體頁面的改觀,實現下方選項導致頁面的切換效果。

利用到的技術有Sqlite數據庫的增刪改查,與fragment實現。由於暫時沒有找到合適的圖標,先借用微信的圖標暫代一下。

①在數據庫這方面的學習后,我總結出三步走戰略

第一步:定義實體類。先建立好用戶對象,存儲數據。

package com.example.fragment;

public class User {
    //username 用戶名
    //password 密碼
    public int id;
    public String username;
    public String password;

    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }
    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }
    public User(){}

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

 

第二步:創建數據庫管理類。建立DBHelper繼承extends SQLiteOpenHelper,然后創建表。

package com.example.fragment;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class UserDBHelper extends SQLiteOpenHelper {
    public UserDBHelper(Context context,String name, SQLiteDatabase.CursorFactory factory, int version){
        super(context,name,factory,1);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        String created="create table Users ("
                +"id integer primary key autoincrement, "
                +"username text, "
                +"password text)";
        db.execSQL(created);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

該類中,共有三個方法,一個是構造函數,剩下兩個是重寫的方法,onCreate和onUpgrade,主要關注onCreate方法,在這個方法中創建了數據表,我這里定義數據表名為Users。構造函數主要關注參數,因為等會兒要調用,參數一共有四個,分別為系統上下文Context,數據庫名,游標工廠(通常為null)以及數據庫版本號,都是比較直接的參數,然后最后的onUpgrade,從字面上來理解,就是在數據庫更新的時候調用的方法,需要傳入新老版本號。

第三步:定義數據庫操作類。方便我們增刪改查操作的實現,不必再一個一個重寫。

package com.example.fragment;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import java.util.ArrayList;
import java.util.List;

public class UserOperator {
    private UserDBHelper UserDBHelper;
    private SQLiteDatabase db;
    public UserOperator(Context context){
        UserDBHelper=new UserDBHelper(context,"db_user",null,1);
        db=UserDBHelper.getWritableDatabase();
    }
    //增加一條用戶信息
    public void addUser(User bean){
        db.execSQL("insert into Users (username,password) values(?,?)",new Object[]{bean.username,bean.password});
    }
    //更新用戶密碼
    public void updateUser(User bean){
        db.execSQL("update Users set password=? where username=?",new Object[]{bean.password,bean.username});
    }
    //刪除某位用戶
    public void deleteUser(String username){
        db.execSQL("delete from Users where username=?",new String[]{username});
    }
    //判斷用戶是否存在
    public User isExit(String name){
        User bean=null;
        Cursor c=db.rawQuery("select * from Users where username=?",new String[]{name});
        while(c.moveToNext()){
            bean=new User();
            bean.setUsername(c.getString(c.getColumnIndex("username")));
            bean.setPassword(c.getString(c.getColumnIndex("password")));
        }
        c.close();
        return bean;
    }
    //獲取所有用戶
    public List<User> getallUser(){
        List<User> list=new ArrayList<>();
        Cursor c=db.rawQuery("select * from Users",null);
        while(c.moveToNext()){
            User bean=new User();
            bean.setUsername(c.getString(c.getColumnIndex("username")));
            bean.setPassword(c.getString(c.getColumnIndex("password")));
            list.add(bean);
        }
        c.close();
        return list;
    }

}

數據庫操作類的構造方法是值得一提的,主要執行了如下兩步操作:

//數據庫名:db_user

UserDBHelper=new UserDBHelper(context,"db_user",null,1);

//初始化數據庫操作對象

db = UserDBHelper.getWritableDatabase();

第一步就是剛才講到創建數據庫管理類時提到的構造方法。可以觀察到傳入的四個參數:

1.上下文Context與調用數據庫操作類時傳入的上下文一致,2.定義了數據庫名稱為“db_user”,3.游標工廠為null,4.數據庫版本號為1。

第二步為初始化數據庫操作的對象。因為這里需要執行sql語句,所以必須要創建數據庫的對象。

另外還需要關注的地方就是增刪改查四類sql語句的寫法,主要有如下:

增:(add)

db.execSQL("insert into Users (username,password) values(?,?)",new Object[]{bean.username,bean.password});

刪:(delete)

db.execSQL("delete from Users where username=?",new String[]{username});

改:(update)

db.execSQL("update Users set password=? where username=?",new Object[]{bean.password,bean.username});

查:(select)

Cursor c=db.rawQuery("select * from Users where username=?",new String[]{name});

 

Cursor c=db.rawQuery("select * from Users",null);

說明:查詢語句我覺得是四種操作之中最為復雜的一個,也是與用戶需求最為貼合的一個需求。數據庫把查詢結果放入游標Cursor之中,然后通過遍歷Cursor,把結果再賦給實體類User的對象或者是實體類泛型集合List<User>的對象,最終實現數據從數據庫中到邏輯部分的傳遞。

那么,完成了這“三步走”之后,剩下的就是在Activity中的調用了。記得要在Activity中不僅要定義數據庫操作類的對象,更要對其進行初始化。這是很重要的。

一共兩個Activity:loginActivity和RegisterActivity

package com.example.fragment;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;

public class loginActivity extends Activity implements View.OnClickListener{
    private UserOperator muserOperator;
    private TextView mTvLoginactivityRegister;
    //private RelativeLayout mRlLoginactivityTop;
    private EditText mEtLoginactivityUsername;
    private EditText mEtLoginactivityPassword;
    //private LinearLayout mLlLoginactivityTwo;
    private Button mBtLoginactivityLogin;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        muserOperator=new UserOperator(this);
        initView();


    }

    private void initView() {
        mBtLoginactivityLogin = findViewById(R.id.bt_loginactivity_login);
        mTvLoginactivityRegister = findViewById(R.id.tv_loginactivity_register);
        mEtLoginactivityUsername = findViewById(R.id.et_loginactivity_username);
        mEtLoginactivityPassword = findViewById(R.id.et_loginactivity_password);

        mBtLoginactivityLogin.setOnClickListener(this);
        mTvLoginactivityRegister.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.tv_loginactivity_register:
                startActivity(new Intent(this,RegisterActivity.class));
                finish();
                break;
            case R.id.bt_loginactivity_login:
                String username=mEtLoginactivityUsername.getText().toString().trim();
                String password=mEtLoginactivityPassword.getText().toString().trim();
                User bean=muserOperator.isExit(username);
                if(!TextUtils.isEmpty(username)&&!TextUtils.isEmpty(password)){
                    User bean1=muserOperator.isExit(username);
                    if(bean.password.equals(password)){
                        Toast.makeText(this, "登錄成功", Toast.LENGTH_SHORT).show();
                        Intent intent = new Intent(this, MainActivity.class);
                        startActivity(intent);
                        finish();
                    }else{
                        Toast.makeText(this, "用戶名或密碼不正確,請重新輸入", Toast.LENGTH_SHORT).show();
                    }
                }else{
                    Toast.makeText(this, "請輸入你的用戶名或密碼", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
}

RegisterActivity

package com.example.fragment;

import android.content.Intent;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import java.util.List;

public class RegisterActivity extends AppCompatActivity implements View.OnClickListener{
    private List<User> userList;
    private String realCode;
    private UserOperator muserOperator;
    private Button mBtRegisteractivityRegister;
    //private RelativeLayout mRlRegisteractivityTop;
    private ImageView mIvRegisteractivityBack;
    //private LinearLayout mLlRegisteractivityBody;
    private EditText mEtRegisteractivityUsername;
    private EditText mEtRegisteractivityPassword1;
    private EditText mEtRegisteractivityPassword2;
    private EditText mEtRegisteractivityPhonecodes;
    private ImageView mIvRegisteractivityShowcode;
    //private RelativeLayout mRlRegisteractivityBottom;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        muserOperator=new UserOperator(this);
        init();
        //

        //將驗證碼用圖片的形式顯示出來
        mIvRegisteractivityShowcode.setImageBitmap(Code.getInstance().createBitmap());
        realCode = Code.getInstance().getCode().toLowerCase();

    }

    private void init() {
        mBtRegisteractivityRegister = findViewById(R.id.bt_registeractivity_register);
        mIvRegisteractivityBack = findViewById(R.id.iv_registeractivity_back);
        mEtRegisteractivityUsername = findViewById(R.id.et_registeractivity_username);
        mEtRegisteractivityPassword1 = findViewById(R.id.et_registeractivity_password1);
        mEtRegisteractivityPassword2 = findViewById(R.id.et_registeractivity_password2);
        mEtRegisteractivityPhonecodes = findViewById(R.id.et_registeractivity_phoneCodes);
        mIvRegisteractivityShowcode = findViewById(R.id.iv_registeractivity_showCode);
//按鈕的點擊事件,返回事件,點擊二維碼事件,注冊事件
        mIvRegisteractivityBack.setOnClickListener(this);
        mIvRegisteractivityShowcode.setOnClickListener(this);
        mBtRegisteractivityRegister.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
            switch (v.getId()){
                case R.id.iv_registeractivity_back:
                    Intent intent1=new Intent(this,loginActivity.class);
                    startActivity(intent1);
                    finish();
                    break;
                case R.id.iv_registeractivity_showCode:
                    mIvRegisteractivityShowcode.setImageBitmap(Code.getInstance().createBitmap());
                    realCode = Code.getInstance().getCode().toLowerCase();
                    break;
                case R.id.bt_registeractivity_register:
                    String username = mEtRegisteractivityUsername.getText().toString().trim();
                    String password = mEtRegisteractivityPassword1.getText().toString().trim();
                    String password2 = mEtRegisteractivityPassword2.getText().toString().trim();
                    String phoneCode = mEtRegisteractivityPhonecodes.getText().toString().toLowerCase();

                    if(!password.equals(password2)) {
                        Toast.makeText(this, "兩次密碼不一致,請重新注冊", Toast.LENGTH_SHORT).show();
                        break;
                    }

                    if(!TextUtils.isEmpty(username)&&!TextUtils.isEmpty(password)&&!TextUtils.isEmpty(phoneCode)){
                        if(phoneCode.equals(realCode)){
                            User bean=muserOperator.isExit(username);
                            if (bean!=null){
                                Toast.makeText(this, "該用戶已存在,請重新注冊", Toast.LENGTH_SHORT).show();
                            }else{
                                User bean2=new User(username,password);
                                muserOperator.addUser(bean2);
                                Intent intent2 = new Intent(this, loginActivity.class);
                                startActivity(intent2);
                                finish();
                                Toast.makeText(this,  "驗證通過,注冊成功", Toast.LENGTH_SHORT).show();
                            }
                        }else{
                            Toast.makeText(this,  "驗證碼錯誤,注冊失敗", Toast.LENGTH_SHORT).show();
                        }
                    }else{
                        Toast.makeText(this, "未完善信息,注冊失敗", Toast.LENGTH_SHORT).show();
                    }
                    break;
            }
    }
}

 

這樣第一部分登錄與注冊就完成了,接下來就是第二步的fragment的模塊:分四塊

第一塊:添加賬單

第二塊:顯示本月的賬單收支對比

第三塊:利用圖表來形象的展示

第四塊:個人信息的展示與修改

由於目前剛剛掌握fragment的使用,先做了一個小案例:使用的是微信的相關界面。

在activity_main的布局中加入fragment與四個圖片來控制這四塊的切換,並設置第一個展示的是WeChart_Fragment

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">

    <fragment
        android:id="@+id/fragment"
        android:name="com.example.fragment.WeChart_Fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
         />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/image1"
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:background="#ffffff"
            android:src="@drawable/bottom_1" />
        <ImageView
            android:id="@+id/image2"
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:background="#ffffff"
            android:src="@drawable/bottom_2"
            />
        <ImageView
            android:id="@+id/image3"
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:background="#ffffff"
            android:src="@drawable/bottom_3"
            />

        <ImageView
            android:id="@+id/image4"
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:background="#ffffff"
            android:src="@drawable/bottom_4" />

    </LinearLayout>


</RelativeLayout>

然后就是創建四個Fragment布局文件並通過對應的Java文件來展示view

最后在MainActivity中設置四個圖片的監聽事件,分被調用不同的Fragment

下面來簡單看一下如何啟動fragemnt

View.OnClickListener l = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentManager fm = getFragmentManager();   // 獲取Fragment
            FragmentTransaction ft = fm.beginTransaction(); // 開啟一個事務
            Fragment f = null; //為Fragment初始化
            switch (v.getId()) {    //通過獲取點擊的id判斷點擊了哪個張圖片
                case R.id.image1:
                    f = new WeChart_Fragment(); //創建第一個Fragment
                    break;
                case R.id.image2:
                    f = new Message_Fragment();//創建第二個Fragment
                    break;
                case R.id.image3:
                    f = new Find_Fragment();//創建第三個Fragment
                    break;
                case R.id.image4:
                    f = new Me_Fragment();//創建第四個Fragment
                    break;
                default:
                    break;
            }
            ft.replace(R.id.fragment,f); //替換Fragment
            ft.commit(); //提交事務
        }
    };

最后來看看今天的成果展示:

登錄界面:

 

 注冊界面:

 

 登陸成功后的界面:

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM