基于SQLite的Android登錄APP
基于SQLite的Android登錄APP
該登錄APP主要包括三個(gè)模塊:
1、登錄:用戶(hù)選擇登錄方式、登錄身份,輸入賬號(hào)密碼,完成登錄。2、忘記密碼:用戶(hù)輸入新密碼及驗(yàn)證碼修改登錄密碼。3、個(gè)人信息:用戶(hù)完成登錄后設(shè)置個(gè)人信息并顯示。
使用控件:1、單選按鈕RadioButton:區(qū)分是密碼登錄還是驗(yàn)證碼登錄。2、下拉框Spinner:區(qū)分是個(gè)人用戶(hù)還是公司用戶(hù)。3、編輯框EditText:輸入手機(jī)號(hào)和密碼(或驗(yàn)證碼)。4、復(fù)選框CheckBox:判斷是否記住密碼。5、相對(duì)布局RelativeLayout:界面的整體布局,方便將各個(gè)控件按照相對(duì)位置擺放。6、框架布局FrameLayout:在框架布局中后面添加的子視圖會(huì)把之前的子視圖覆蓋掉,一般用于需要重疊顯示的場(chǎng)合。用于實(shí)現(xiàn)忘記密碼按鈕和密碼輸入框的疊加。
采用的存儲(chǔ)方式1、共享參數(shù)SharedPreferences:
是Android的一個(gè)輕量級(jí)存儲(chǔ)工具,采用的存儲(chǔ)結(jié)構(gòu)是Key-Value的鍵值對(duì)方式,類(lèi)似于Java的Properties類(lèi),都是把Key-Value的鍵值對(duì)保存在配置文件中,不同的是Properties的文件內(nèi)容是Key=Value的形式,而SharedPreferences的存儲(chǔ)介質(zhì)是符合XML規(guī)范的配置文件。本案例中用于保存用戶(hù)的賬號(hào)和密碼。
2、數(shù)據(jù)庫(kù)SQLite:
是一個(gè)小巧的嵌入式數(shù)據(jù)庫(kù)。本案例中用于存儲(chǔ)用戶(hù)的個(gè)人信息。
成果展示:
1. 登錄界面
<?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='.LoginActivity' android:paddingTop='10dp' android:padding='8dp'> <RadioGroup android: android:layout_width='match_parent' android:layout_height='wrap_content' android:orientation='horizontal' android:layout_marginTop='20dp'> <RadioButton android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='密碼登錄' android:textSize='25sp' /> <RadioButton android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='驗(yàn)證碼登錄' android:layout_marginLeft='50dp' android:textSize='25sp' /> </RadioGroup> <TextView android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='我是:' android:layout_below='@+id/rg_login_way' android:textSize='25sp' android:layout_marginTop='40dp' android:textColor='@color/black' android:layout_marginLeft='30dp' android:layout_alignRight='@+id/tv_phonenum'/> <Spinner android: android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_toRightOf='@+id/tv_shenfen' android:layout_alignBottom='@+id/tv_shenfen' android:spinnerMode='dialog'/> <TextView android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:layout_below='@+id/tv_shenfen' android:text='手機(jī)號(hào)碼:' android:textSize='25sp' android:textColor='@color/black' android:layout_marginTop='40dp'/> <EditText android: android:layout_width='match_parent' android:layout_height='50dp' android:layout_alignBaseline='@id/tv_phonenum' android:layout_toRightOf='@+id/tv_phonenum' android:background='@drawable/eb_selector' android:textSize='25sp' android:hint='請(qǐng)輸入手機(jī)號(hào)碼' android:inputType='number' /> <TextView android: android:layout_width='wrap_content' android:layout_height='40dp' android:text='登錄密碼:' android:layout_below='@id/tv_phonenum' android:textSize='25sp' android:layout_marginTop='40dp' android:textColor='@color/black'/> <FrameLayout android: android:layout_width='match_parent' android:layout_height='50dp' android:layout_toRightOf='@id/tv_psw' android:layout_alignBottom='@+id/tv_psw' android:layout_alignLeft='@+id/et_phone'> <EditText android: android:layout_width='match_parent' android:layout_height='match_parent' android:hint='請(qǐng)輸入密碼' android:textSize='25sp' android:background='@drawable/eb_selector' /> <Button android: android:layout_width='wrap_content' android:layout_height='match_parent' android:text='忘記密碼' android:textSize='25sp' android:background='@color/darkgray' android:padding='10dp' android:layout_gravity='end'/> </FrameLayout> <CheckBox android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:layout_below='@+id/tv_psw' android:text='記住密碼' android:textSize='25sp' android:layout_marginTop='30dp'/> <Button android: android:layout_width='match_parent' android:layout_height='60dp' android:layout_below='@id/cb_pswrmb' android:text='登錄' android:textSize='25sp' android:layout_marginTop='30dp' android:background='@color/darkgray'/></RelativeLayout>
2.忘記密碼界面
<?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' android:padding='8dp' android:paddingTop='10dp' tools:context='.PswForgetActivity'> <TextView android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='輸入新密碼:' android:textColor='@color/black' android:textSize='25sp' android:layout_marginTop='20dp'/> <EditText android: android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_toRightOf='@+id/tv_newpsw' android:background='@drawable/eb_selector' android:layout_alignBaseline='@+id/tv_newpsw' android:hint='請(qǐng)輸入新密碼' android:textSize='25sp' android:inputType='textPassword' /> <TextView android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:layout_marginTop='40dp' android:text='確認(rèn)新密碼:' android:layout_below='@+id/tv_newpsw' android:textSize='25sp' android:textColor='@color/black'/> <EditText android: android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_toRightOf='@+id/tv_chknewpsw' android:layout_alignBaseline='@+id/tv_chknewpsw' android:background='@drawable/eb_selector' android:textSize='25sp' android:hint='請(qǐng)?jiān)俅屋斎胄旅艽a' android:inputType='textPassword'/> <TextView android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='驗(yàn)證碼:' android:layout_below='@+id/tv_chknewpsw' android:textSize='25sp' android:textColor='@color/black' android:layout_marginTop='40dp'/> <FrameLayout android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_toRightOf='@+id/tv_checkcode' android:layout_below='@+id/et_chknewpsw' android:layout_marginTop='20dp'> <EditText android: android:layout_width='match_parent' android:layout_height='match_parent' android:textSize='25sp' android:hint='輸入驗(yàn)證碼' android:inputType='number' android:background='@drawable/eb_selector' android:maxLines='1'/> <Button android: android:layout_width='wrap_content' android:layout_height='match_parent' android:layout_gravity='right' android:text='獲取驗(yàn)證碼' android:textSize='25sp' android:padding='10dp' android:textColor='@color/black' android:background='@color/darkgray'/> </FrameLayout> <Button android: android:layout_width='match_parent' android:layout_height='60dp' android:layout_below='@id/tv_checkcode' android:text='確定' android:textSize='25sp' android:layout_marginTop='30dp' android:background='@color/darkgray' /></RelativeLayout>
3.個(gè)人信息填寫(xiě)界面
<?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='.SharedPreferencesActivity' android:padding='10dp'> <TextView android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='姓名:' android:textSize='25sp' android:textColor='@color/black' android:layout_marginTop='20dp'/> <EditText android: android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_toRightOf='@+id/tv_name' android:layout_alignBaseline='@+id/tv_name' android:background='@drawable/eb_selector' android:maxLines='1'/> <TextView android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='年齡:' android:textSize='25sp' android:textColor='@color/black' android:layout_below='@+id/tv_name' android:layout_marginTop='20dp'/> <EditText android: android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_toRightOf='@+id/tv_age' android:layout_alignBaseline='@+id/tv_age' android:background='@drawable/eb_selector' android:maxLines='1' android:inputType='number'/> <TextView android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='身高:' android:textSize='25sp' android:textColor='@color/black' android:layout_below='@+id/tv_age' android:layout_marginTop='20dp'/> <EditText android: android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_toRightOf='@+id/tv_height' android:layout_alignBaseline='@+id/tv_height' android:background='@drawable/eb_selector' android:maxLines='1' android:inputType='number'/> <TextView android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='體重:' android:textSize='25sp' android:textColor='@color/black' android:layout_below='@+id/tv_height' android:layout_marginTop='20dp'/> <EditText android: android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_toRightOf='@+id/tv_weight' android:layout_alignBaseline='@+id/tv_weight' android:background='@drawable/eb_selector' android:maxLines='1' android:inputType='number'/> <TextView android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='婚否:' android:layout_below='@+id/tv_weight' android:textSize='25sp' android:textColor='@color/black' android:layout_marginTop='20dp'/> <Spinner android: android:layout_width='match_parent' android:layout_height='40dp' android:spinnerMode='dropdown' android:layout_toRightOf='@+id/tv_married' android:layout_alignBottom='@+id/tv_married'/> <Button android: android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_below='@+id/tv_married' android:layout_marginTop='20dp' android:background='@drawable/selector' android:text='保存' android:textSize='25sp' android:textColor='@color/black'/></RelativeLayout>
4.個(gè)人信息顯示界面
<?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='.SharedPreferencesActivity2'> <TextView android: android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_below='@+id/btn_delete' android:textSize='25sp'/> <Button android: android:layout_width='match_parent' android:layout_height='wrap_content' android:text='刪除' android:textSize='25sp'/></RelativeLayout>代碼實(shí)現(xiàn)
UserDBHelper
package com.example.helloworld;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;import androidx.annotation.Nullable;import androidx.core.app.NavUtils;import java.util.ArrayList;import java.util.Locale;public class UserDBHelper extends SQLiteOpenHelper { private static final String TAG = 'UserDBHelper'; private static final String DB_NAME = 'user.db'; //數(shù)據(jù)庫(kù)名 private static final int DB_VERSION = 1; //數(shù)據(jù)庫(kù)版本 private static UserDBHelper mHelper = null; private SQLiteDatabase mDB = null; private static final String TABLE_NAME = 'user_info'; //表名 private UserDBHelper(Context context){ super(context,DB_NAME,null,DB_VERSION); } private UserDBHelper(Context context,int version){ super(context,DB_NAME,null,version); } public static UserDBHelper getInstance(Context context,int version){ if(version > 0 && mHelper == null){ mHelper = new UserDBHelper(context,version); }else if(mHelper == null){ mHelper = new UserDBHelper(context); } return mHelper; } public SQLiteDatabase openReadLink(){ if (mDB == null || !mDB.isOpen()){ mDB = mHelper.getReadableDatabase(); } return mDB; } public SQLiteDatabase openWriteLink(){ if (mDB == null || !mDB.isOpen()){ mDB = mHelper.getWritableDatabase(); Log.d(TAG, 'openWriteLink: 打開(kāi)了讀數(shù)據(jù)庫(kù)'); } return mDB; } public void closeLink(){ if (mDB != null && mDB.isOpen()){ mDB.close(); mDB = null; } } public String getDBName(){ if(mHelper != null){ return mHelper.getDatabaseName(); }else { return DB_NAME; } } @Override public void onCreate(SQLiteDatabase db) { Log.d(TAG, 'onCreate: 創(chuàng)建數(shù)據(jù)庫(kù)'); String drop_sql = 'DROP TABLE IF EXISTS ' + TABLE_NAME + ';'; db.execSQL(drop_sql); String create_sql = 'CREATE TABLE IF NOT EXISTS ' + TABLE_NAME + ' (' + '_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,' + 'name VARCHAR NOT NULL,' + 'age INTEGER NOT NULL,' + 'height LONG NOT NULL,' + 'weight FLOAT NOT NULL,' + 'married INTEGER NOT NULL,' + 'update_time VARCHAR NOT NULL,' + 'phone VARCHAR NOT NULL,' + 'password VARCHAR NOT NULL' + ');'; Log.d(TAG, 'create_sql' + create_sql); db.execSQL(create_sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.d(TAG, 'onUpgrade oldVersion=' +oldVersion+',newVersion=' + newVersion+'數(shù)據(jù)庫(kù)新舊版本號(hào)'); if (newVersion > 1){ String alter_sql = 'ALTER TABLE' + TABLE_NAME + 'ADD COLUMN' + 'phone VARCHAR;'; Log.d(TAG, 'alter_sql:' + alter_sql); db.execSQL(alter_sql); alter_sql = 'ALTER TABLE' + TABLE_NAME + 'ADD COLUMN' + 'password VARCHAR;'; Log.d(TAG, 'alter_sql:' + alter_sql); db.execSQL(alter_sql); } } public int delete(String condition){ int count = mDB.delete(TABLE_NAME,condition,null); return count; } public int deleteAll(){ int count = mDB.delete(TABLE_NAME,'1=1',null); return count; } public long insert(UserInfo info){ ArrayList<UserInfo> infoArray = new ArrayList<UserInfo>(); infoArray.add(info); return insert(infoArray); } public ArrayList<UserInfo>query(String condition) { String sql = String.format(Locale.CHINA,'select rowid,_id,name,age,height,weight,married,update_time,' + 'phone,password from %s where %s;', TABLE_NAME,condition); Log.d(TAG, 'query sql: ' + sql); ArrayList<UserInfo> infoArray = new ArrayList<UserInfo>(); Cursor cursor = mDB.rawQuery(sql, null); while (cursor.moveToNext()) { UserInfo info = new UserInfo(); info.rowid = cursor.getLong(0); info.xuhao = cursor.getInt(1); info.name = cursor.getString(2); info.age = cursor.getInt(3); info.height = cursor.getLong(4); info.weight = cursor.getFloat(5); info.married = (cursor.getInt(6) == 0) ? false : true; info.update_time = cursor.getString(7); info.phone = cursor.getString(8); info.password = cursor.getString(9); infoArray.add(info); } cursor.close(); return infoArray; } public long insert(ArrayList<UserInfo> infoArray) { long result = -1; for (int i = 0; i < infoArray.size(); i++) { UserInfo info = infoArray.get(i); ArrayList<UserInfo> tempArray = new ArrayList<UserInfo>(); if (info.name != null && info.name.length() > 0) { String condition = String.format('name=’%s’', info.name); tempArray = query(condition); if (tempArray.size() > 0) { update(info, condition); result = tempArray.get(0).rowid; continue; } } if (info.phone != null && info.phone.length() > 0) { String condition = String.format('phone=’%s’', info.phone); tempArray = query(condition); if (tempArray.size() > 0) { update(info, condition); result = tempArray.get(0).rowid; continue; } } Log.d(TAG, 'insert: 當(dāng)前版本號(hào)'+mDB.getVersion()); ContentValues cv = new ContentValues(); cv.put('name', info.name); cv.put('age', info.age); cv.put('height', info.height); cv.put('weight', info.weight); cv.put('married', info.married); cv.put('update_time', info.update_time); cv.put('phone', info.phone); cv.put('password', info.password); result = mDB.insert(TABLE_NAME, '', cv); if (result == -1) { return result; } } return result; } public int update(UserInfo info, String condition) { ContentValues cv = new ContentValues(); cv.put('name', info.name); cv.put('age', info.age); cv.put('height', info.height); cv.put('weight', info.weight); cv.put('married', info.married); cv.put('update_time', info.update_time); cv.put('phone', info.phone); cv.put('password', info.password); // 執(zhí)行更新記錄動(dòng)作,該語(yǔ)句返回記錄更新的數(shù)目 return mDB.update(TABLE_NAME, cv, condition, null); } public int update(UserInfo info) { return update(info, 'rowid=' + info.rowid); } public UserInfo queryByPhone(String phone){ UserInfo info = null; ArrayList<UserInfo> infoArray = query(String.format('phone=%s',phone)); if (infoArray.size() > 0 ){ info = infoArray.get(0); } return info; }}
UserInfo
package com.example.helloworld;public class UserInfo { public long rowid; public int xuhao; public String name; public int age; public long height; public float weight; public boolean married; public String update_time; public String phone; public String password; public UserInfo() { rowid = 0l; xuhao = 0; name = ''; age = 0; height = 0l; weight = 0.0f; married = false; update_time = ''; phone = ''; password = ''; }}
LoginActivity
package com.example.helloworld;import androidx.annotation.Nullable;import androidx.appcompat.app.AlertDialog;import androidx.appcompat.app.AppCompatActivity;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.content.SharedPreferences;import android.graphics.Rect;import android.os.Bundle;import android.text.InputType;import android.text.method.PasswordTransformationMethod;import android.text.method.TransformationMethod;import android.util.Log;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.EditText;import android.widget.RadioButton;import android.widget.RadioGroup;import android.widget.Spinner;import android.widget.Toast;import java.net.PasswordAuthentication;public class LoginActivity extends AppCompatActivity implements View.OnClickListener { private EditText et_phone; private RadioButton rb_psw; private RadioButton rb_checkcode; private EditText et_psw; private Button btn_pswforget; private String mPassword; private int mRequestcode; private String mCheckCode; private int mType; private String TAG = 'huahua'; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); rb_psw = findViewById(R.id.rb_password); rb_checkcode = findViewById(R.id.rb_checkcode); et_phone = findViewById(R.id.et_phone); et_psw = findViewById(R.id.et_psw); CheckBox cb_pswforget = findViewById(R.id.cb_pswrmb); Button btn_login = findViewById(R.id.btn_login); btn_pswforget = findViewById(R.id.btn_pswforget); btn_login.setOnClickListener(this); btn_pswforget.setOnClickListener(this); RadioGroup rg = findViewById(R.id.rg_login_way); mPassword = et_psw.getText().toString(); rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { RadioButton rb = findViewById(checkedId); Log.i(TAG, 'onCheckedChanged: 密碼登錄'+ rb_psw.isChecked()); Log.i(TAG, 'onCheckedChanged: 驗(yàn)證碼登錄'+rb_checkcode.isChecked()); if(rb_psw.isChecked()){ et_psw.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD | InputType.TYPE_CLASS_TEXT); } } }); cb_pswforget.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { } }); ArrayAdapter<String> typeAdapter = new ArrayAdapter<String>(this,R.layout.item_dropdown,typeArray); typeAdapter.setDropDownViewResource(R.layout.item_dropdown); Spinner sp_type = findViewById(R.id.sp_shenfen); sp_type.setAdapter(typeAdapter); sp_type.setSelection(0); sp_type.setPrompt('選擇你的登錄身份:'); sp_type.setOnItemSelectedListener(new MyOnItemSeclectedListener()); } private String[] typeArray = {'個(gè)人用戶(hù)','企業(yè)用戶(hù)'}; private class MyOnItemSeclectedListener implements AdapterView.OnItemSelectedListener{ @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { mType = position; } @Override public void onNothingSelected(AdapterView<?> parent) { } } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == mRequestcode && data != null) { mPassword = data.getStringExtra('newpsw'); } } @Override protected void onRestart() { et_psw.setText(''); super.onRestart(); } @Override public void onClick(View v) { String phone = et_phone.getText().toString(); switch (v.getId()){ case R.id.btn_pswforget: { Log.i(TAG, 'onClick: 點(diǎn)擊了忘記密碼'); if (phone == null || phone.length() < 11) { Toast.makeText(this, '請(qǐng)輸入正確的手機(jī)號(hào)', Toast.LENGTH_SHORT).show(); return; } if (rb_psw.isChecked()) { Log.i(TAG, 'onClick: 進(jìn)入忘記密碼界面'); Intent intent = new Intent(this, PswForgetActivity.class); intent.putExtra('phone', phone); startActivityForResult(intent, mRequestcode); } else if (rb_checkcode.isChecked()) { mCheckCode = String.format('%06d', (int) (Math.random() * 1000000 % 1000000)); Log.i(TAG, 'onClick: 發(fā)送驗(yàn)證碼'); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle('請(qǐng)記住驗(yàn)證碼!'); builder.setMessage('手機(jī)號(hào)' + phone + ',本次驗(yàn)證碼是:' + mCheckCode + ',請(qǐng)輸入驗(yàn)證碼'); builder.setPositiveButton('確定', null); AlertDialog alert = builder.create(); alert.show(); } } break; case R.id.btn_login: { if (phone == null || phone.length() < 11) { Toast.makeText(this, '請(qǐng)輸入正確的手機(jī)號(hào)!', Toast.LENGTH_SHORT).show(); Log.i(TAG, 'onClick: 驗(yàn)證密碼'); return; } if (rb_psw.isChecked()) { if (!et_psw.getText().toString().equals(mPassword) || et_psw.getText().toString().equals('')) { Toast.makeText(this, '請(qǐng)輸入正確的密碼', Toast.LENGTH_SHORT).show(); return; } else { loginSuccess(); } } else if (rb_checkcode.isChecked()) { if (!et_psw.getText().toString().equals(mCheckCode)) { Toast.makeText(this, '請(qǐng)輸入正確的驗(yàn)證碼', Toast.LENGTH_SHORT).show(); return; } else { loginSuccess(); } } } } } private void loginSuccess(){ String desc = String.format('您的手機(jī)號(hào)碼是%s,類(lèi)型是%s。恭喜你通過(guò)登錄驗(yàn)證,點(diǎn)擊“確定”按鈕返回上個(gè)頁(yè)面',et_phone.getText().toString(),typeArray[mType]); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle('登錄成功'); builder.setMessage(desc); builder.setPositiveButton('確定', new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(LoginActivity.this,SharedPreferencesActivity.class); startActivity(intent); SharedPreferences sps = getSharedPreferences('Login', Context.MODE_PRIVATE); SharedPreferences.Editor editor = sps.edit(); editor.putString('phone',et_phone.getText().toString()); editor.putString('password',et_psw.getText().toString()); editor.apply(); } }); builder.setNegativeButton('取消',null); AlertDialog alert = builder.create(); alert.show(); }}
PswForgetActivity
package com.example.helloworld;import androidx.appcompat.app.AlertDialog;import androidx.appcompat.app.AppCompatActivity;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.text.InputType;import android.view.View;import android.widget.AdapterView;import android.widget.EditText;import android.widget.Toast;public class PswForgetActivity extends AppCompatActivity implements View.OnClickListener { private EditText et_newpsw; private EditText et_chknewpsw; private EditText et_checkcode; private String mCheckCode; private String mPhone; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_psw_forget); et_newpsw = findViewById(R.id.et_newpsw); et_chknewpsw = findViewById(R.id.et_chknewpsw); et_checkcode = findViewById(R.id.et_checkcode); findViewById(R.id.btn_sendcheckcode).setOnClickListener(this); findViewById(R.id.btn_check).setOnClickListener(this); mPhone = getIntent().getStringExtra('phone'); et_newpsw.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD | InputType.TYPE_CLASS_TEXT); et_chknewpsw.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD | InputType.TYPE_CLASS_TEXT); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_sendcheckcode: if(mPhone == null || mPhone.length() < 11){ Toast.makeText(this,'請(qǐng)輸入正確的手機(jī)號(hào)',Toast.LENGTH_SHORT).show(); return; } mCheckCode = String.format('%06d',(int)(Math.random()*1000000%1000000)); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle('請(qǐng)記住驗(yàn)證碼'); builder.setMessage('手機(jī)號(hào)'+mPhone+',本次驗(yàn)證碼是'+mCheckCode+',請(qǐng)輸入驗(yàn)證碼'); builder.setPositiveButton('確定',null); AlertDialog alertDialog = builder.create(); alertDialog.show(); case R.id.btn_check: String newpsw = et_newpsw.getText().toString(); String chknewpsw = et_chknewpsw.getText().toString(); if(newpsw == null || newpsw.length() < 6 || chknewpsw == null || chknewpsw.length() < 6){ Toast.makeText(this,'請(qǐng)輸入正確的新密碼',Toast.LENGTH_SHORT).show(); return; }else if(!newpsw.equals(chknewpsw)){ Toast.makeText(this,'兩次輸入的新密碼不一致',Toast.LENGTH_SHORT).show(); return; }else if(!et_checkcode.getText().toString().equals(mCheckCode)){ Toast.makeText(this,'請(qǐng)輸入正確的驗(yàn)證碼',Toast.LENGTH_SHORT).show(); return; }else { Toast.makeText(this,'密碼修改成功',Toast.LENGTH_SHORT).show(); Intent intent = new Intent(); intent.putExtra('newpsw',newpsw); setResult(Activity.RESULT_OK,intent); finish(); } } }}
InfoWriteActivity
package com.example.helloworld;import androidx.appcompat.app.AppCompatActivity;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.EditText;import android.widget.Spinner;import android.widget.Toast;public class InfoWriteActivity extends AppCompatActivity implements View.OnClickListener { private static final String TAG = 'huahua'; private UserDBHelper mHelper; private EditText et_name; private EditText et_age; private EditText et_height; private EditText et_weight; private boolean Married = false; private String phone; private String password; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shared_preferences); et_name = findViewById(R.id.et_name); et_age = findViewById(R.id.et_age); et_height = findViewById(R.id.et_height); et_weight = findViewById(R.id.et_weight); findViewById(R.id.btn_save).setOnClickListener(this); SharedPreferences sps = getSharedPreferences('Login',Context.MODE_PRIVATE); SharedPreferences.Editor editor = sps.edit(); phone = sps.getString('phone',''); password = sps.getString('password',''); ArrayAdapter<String> typeAdapter = new ArrayAdapter<String>(this, R.layout.item_dropdown, typeArray); typeAdapter.setDropDownViewResource(R.layout.item_dropdown); Spinner sp_married = findViewById(R.id.sp_married); sp_married.setAdapter(typeAdapter); sp_married.setPrompt('請(qǐng)選擇婚姻狀況'); sp_married.setSelection(0); sp_married.setOnItemSelectedListener(new TypeSelectedListener()); } private String[] typeArray = {'未婚', '已婚'}; class TypeSelectedListener implements AdapterView.OnItemSelectedListener { public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { Married = (arg2 == 0) ? false : true; } public void onNothingSelected(AdapterView<?> arg0) { } } @Override protected void onStart() { super.onStart(); SQLiteDatabase mDB = getApplicationContext().openOrCreateDatabase('user.db', Context.MODE_PRIVATE, null); mHelper = UserDBHelper.getInstance(this, 1); mHelper.openWriteLink(); } @Override protected void onStop() { super.onStop(); mHelper.closeLink(); } @Override public void onClick(View v) { if (v.getId() == R.id.btn_save) { String name = et_name.getText().toString(); String age = et_age.getText().toString(); String height = et_height.getText().toString(); String weight = et_weight.getText().toString(); if (name == null || name.length() <= 0) { showToast('請(qǐng)先填寫(xiě)姓名'); return; } if (age == null || age.length() <= 0) { showToast('請(qǐng)先填寫(xiě)年齡'); return; } if (height == null || height.length() <= 0) { showToast('請(qǐng)先填寫(xiě)身高'); return; } if (weight == null || weight.length() <= 0) { showToast('請(qǐng)先填寫(xiě)體重'); return; } UserInfo info = new UserInfo(); info.name = name; info.age = Integer.parseInt(age); info.height = Long.parseLong(height); info.weight = Float.parseFloat(weight); info.married = Married; info.phone = phone; info.password = password; //info.update_time = DateUtil.getCurDateStr('yyyy-MM-dd HH:mm:ss'); info.update_time = DateUtil.getNowDate(DateUtil.DatePattern.ALL_TIME); Log.d(TAG, 'onClick: 手機(jī)號(hào)' + info.phone+info.password+info.name+info.update_time+info.married); mHelper.insert(info); Intent intent = new Intent(InfoWriteActivity.this, InfoReadActivity.class); startActivity(intent); showToast('數(shù)據(jù)已寫(xiě)入SQLite數(shù)據(jù)庫(kù)'); } } private void showToast(String desc) { Toast.makeText(this, desc, Toast.LENGTH_SHORT).show(); } public static void startHome(Context mContext) { Intent intent = new Intent(mContext, InfoWriteActivity.class); mContext.startActivity(intent); }}
InfoReadActivity
package com.example.helloworld;import androidx.appcompat.app.AppCompatActivity;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.EditText;import android.widget.Spinner;import android.widget.Toast;public class InfoWriteActivity extends AppCompatActivity implements View.OnClickListener { private static final String TAG = 'huahua'; private UserDBHelper mHelper; private EditText et_name; private EditText et_age; private EditText et_height; private EditText et_weight; private boolean Married = false; private String phone; private String password; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shared_preferences); et_name = findViewById(R.id.et_name); et_age = findViewById(R.id.et_age); et_height = findViewById(R.id.et_height); et_weight = findViewById(R.id.et_weight); findViewById(R.id.btn_save).setOnClickListener(this); SharedPreferences sps = getSharedPreferences('Login',Context.MODE_PRIVATE); SharedPreferences.Editor editor = sps.edit(); phone = sps.getString('phone',''); password = sps.getString('password',''); ArrayAdapter<String> typeAdapter = new ArrayAdapter<String>(this, R.layout.item_dropdown, typeArray); typeAdapter.setDropDownViewResource(R.layout.item_dropdown); Spinner sp_married = findViewById(R.id.sp_married); sp_married.setAdapter(typeAdapter); sp_married.setPrompt('請(qǐng)選擇婚姻狀況'); sp_married.setSelection(0); sp_married.setOnItemSelectedListener(new TypeSelectedListener()); } private String[] typeArray = {'未婚', '已婚'}; class TypeSelectedListener implements AdapterView.OnItemSelectedListener { public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { Married = (arg2 == 0) ? false : true; } public void onNothingSelected(AdapterView<?> arg0) { } } @Override protected void onStart() { super.onStart(); SQLiteDatabase mDB = getApplicationContext().openOrCreateDatabase('user.db', Context.MODE_PRIVATE, null); mHelper = UserDBHelper.getInstance(this, 1); mHelper.openWriteLink(); } @Override protected void onStop() { super.onStop(); mHelper.closeLink(); } @Override public void onClick(View v) { if (v.getId() == R.id.btn_save) { String name = et_name.getText().toString(); String age = et_age.getText().toString(); String height = et_height.getText().toString(); String weight = et_weight.getText().toString(); if (name == null || name.length() <= 0) { showToast('請(qǐng)先填寫(xiě)姓名'); return; } if (age == null || age.length() <= 0) { showToast('請(qǐng)先填寫(xiě)年齡'); return; } if (height == null || height.length() <= 0) { showToast('請(qǐng)先填寫(xiě)身高'); return; } if (weight == null || weight.length() <= 0) { showToast('請(qǐng)先填寫(xiě)體重'); return; } UserInfo info = new UserInfo(); info.name = name; info.age = Integer.parseInt(age); info.height = Long.parseLong(height); info.weight = Float.parseFloat(weight); info.married = Married; info.phone = phone; info.password = password; info.update_time = DateUtil.getNowDate(DateUtil.DatePattern.ALL_TIME); Log.d(TAG, 'onClick: 手機(jī)號(hào)' + info.phone+info.password+info.name+info.update_time+info.married); mHelper.insert(info); Intent intent = new Intent(InfoWriteActivity.this, InfoReadActivity.class); startActivity(intent); showToast('數(shù)據(jù)已寫(xiě)入SQLite數(shù)據(jù)庫(kù)'); } } private void showToast(String desc) { Toast.makeText(this, desc, Toast.LENGTH_SHORT).show(); } public static void startHome(Context mContext) { Intent intent = new Intent(mContext, InfoWriteActivity.class); mContext.startActivity(intent); }}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. Java GZip 基于內(nèi)存實(shí)現(xiàn)壓縮和解壓的方法2. idea配置jdk的操作方法3. SpringBoot+TestNG單元測(cè)試的實(shí)現(xiàn)4. IntelliJ IDEA設(shè)置默認(rèn)瀏覽器的方法5. python 浮點(diǎn)數(shù)四舍五入需要注意的地方6. Springboot 全局日期格式化處理的實(shí)現(xiàn)7. VMware中如何安裝Ubuntu8. Docker容器如何更新打包并上傳到阿里云9. 完美解決vue 中多個(gè)echarts圖表自適應(yīng)的問(wèn)題10. JAMon(Java Application Monitor)備忘記
