本次實現的是有關登陸,註冊和總體頁面的改觀,實現下方選項致使頁面的切換效果。java
利用到的技術有Sqlite數據庫的增刪改查,與fragment實現。因爲暫時沒有找到合適的圖標,先借用微信的圖標暫代一下。android
①在數據庫這方面的學習後,我總結出三步走戰略sql
第一步:定義實體類。先創建好用戶對象,存儲數據。數據庫
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,從字面上來理解,就是在數據庫更新的時候調用的方法,須要傳入新老版本號。
app
第三步:定義數據庫操做類。方便咱們增刪改查操做的實現,沒必要再一個一個重寫。ide
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(); //提交事務 } };
最後來看看今天的成果展現:
登陸界面:
註冊界面:
登錄成功後的界面: