註冊與登陸界面
設計思路前端
當咱們面臨製做登陸和註冊功能的實現時,咱們須要先設計登陸界面的佈局和註冊界面的佈局,作到有完整的思路時纔開始實現其功能效果會更好。java
咱們須要作個標題欄,登錄界面,實現登錄界面的功能代碼塊,註冊界面,實現測試界面的功能模塊便可完成。android
學習目標
掌握註冊和登陸模塊的開發,可以實現用戶登陸功能。web
項目實操
註冊界面知識點算法
標題欄的建立,ImageView、EditText、Button控件的使用,haredPreferences的使用,setResult(RESULT_OK,data)方法的使用,MD5加密算法segmentfault
技能點
掌握註冊界面的設計和邏輯構思,掌握標題欄的建立以及經常使用控件的使用數組
經過SharedPreferences實現數據的存取功能,經過setResult(RESULT_OK,data)方法實現界面間數據的回傳,經過MD5加密算法實現密碼加密功能,實現註冊功能安全
任務實施
標題欄,建立標題欄界面佈局文件,建立背景選擇器,註冊界面,建立註冊界面Activity ,導入圖片資源到drawable中,編寫佈局文件 activity_register.xml,建立背景選擇器register_selector.xml,MD5加密算法,建立utils包,建立MDUtils類網絡
註冊界面邏輯代碼
聲明用於操做控件的Activity私有屬性,獲取界面控件,保存註冊信息到SharedPreferences中,Activity的onCreate中調用init()數據結構
登陸界面
標題欄的引用
EditText、Button控件
SharedPreferences的使用
setResult(RESULT_OK,data)使用
Intent使用
技能點
掌握登陸界面的設計和邏輯構思
經過SharedPreferences實現數據的存取功能
經過setResult(RESULT_DATA,data)方法實現界面間數據傳遞
經過Intent實現Actitivty間跳轉
挑戰任務
展現一下包結構
綠色表示新的添加哦~
項目實操
註冊界面主要用於輸入用戶註冊信息,在註冊界面中用戶須要輸入用戶名、密碼、再次輸入密碼,當點擊「註冊」按鈕時進行註冊。使用本地數據存儲用戶信息,註冊成功後將用戶名和密碼保存在SharedPrefereces中,以便於後續用戶登陸。爲保證帳戶的安全,在保存密碼時採用MD5加密算法,這種算法不可逆,具備必定的安全性。
標題欄
鼠標右鍵點擊res/layout,new->xml-layout XML file,建立main_title_bar.xml
<?xml version="1.0" encoding="utf-8"?> <!--標題欄與返回鍵的建立,獨立在main_title_bar.xml中--> <!--標題欄設置高度爲50dp,寬度爲match_parent,設置背景顏色爲通明爲@android:color/transparent--> <!--RelativeLayout爲相對佈局--> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/title_bar" android:layout_width="match_parent" android:layout_height="50dp" android:background="@android:color/transparent"> <!--設置返回鍵TextView爲高度50dp,寬度爲50dp;id爲android:id="@+id/tv_back"--> <!--layout_alignParentLeft爲與父控件左對齊--> <!--layout_centerVertical爲控件垂直居中--> <!--標題欄界面中的返回鍵在按下與彈起時,返回鍵會有明顯的區別,這種效果經過背景選擇器進行實現--> <TextView android:id="@+id/tv_back" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:background="@drawable/go_back_selector"/> <!--設置id爲android:id="@+id/tv_main_title--> <!--該TextView爲顯示文本--> <!--layout_centerInparent爲居中顯示--> <TextView android:id="@+id/tv_main_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/white" android:textSize="20sp" android:layout_centerInParent="true"/> <!--到main_title_bar.xml中tv_main_title按鈕的下方,加個「保存」--> <TextView android:id="@+id/tv_save" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_centerVertical="true" android:layout_marginRight="20dp" android:layout_marginTop="20dp" android:layout_alignParentRight="true" android:visibility="gone" android:text="保存" android:textColor="@android:color/white" android:textSize="16sp"/> </RelativeLayout>
將圖片iv_back_selected.png和iv_back.png 粘貼到drawable中
鼠標右鍵drawable,new->drawable resource file,建立go_back_selector.xml。
<?xml version="1.0" encoding="utf-8"?> <!--創建go_back_selector.xml背景選擇器--> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!--android:state_pressed="true"爲是否按下,如一個按鈕觸摸或者點擊--> <!--當按下時顯示灰色圖片(iv_back_selected.png),當按鈕彈起時顯示白色圖片(iv_back.png)--> <item android:drawable="@drawable/iv_back_selected" android:state_pressed="true"/> <item android:drawable="@drawable/iv_back"/> </selector>
註冊界面
建立註冊界面Activity
鼠標右鍵activity包,new->activity->Empty Activity,建立RegisterActivity
導入圖片資源到drawable中
register_bg.png
default_icon.png
user_name_icon.png
psw_icon.png
register_user_name_bg.png
register_psw_bg.png
register_psw_again_bg.png
編寫佈局文件 activity_register.xml
<?xml version="1.0" encoding="utf-8"?> <!--註冊界面--> <!--這裏的佈局是放置 1 個 ImageView 控件,用於顯示用戶頭像;3 個 EditText 控件,用於輸入用戶名、密碼、再次輸入密碼;1 個 Button 控件做爲註冊按鈕--> <!--修改 activity_register.xml 爲 LinearLayout 佈局--> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_register" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/register_bg" android:orientation="vertical"> <include layout="@layout/main_title_bar"></include><!--引入標題欄--> <ImageView android:layout_width="70dp" android:layout_height="70dp" android:layout_gravity="center_horizontal" android:layout_marginTop="25dp" android:src="@drawable/default_icon"/> <!--三個編輯框--> <EditText android:id="@+id/et_user_name" android:layout_width="fill_parent" android:layout_height="48dp" android:layout_gravity="center_horizontal" android:layout_marginLeft="35dp" android:layout_marginRight="35dp" android:layout_marginTop="35dp" android:background="@drawable/register_user_name_bg" android:drawableLeft="@drawable/user_name_icon" android:drawablePadding="10dp" android:gravity="center_vertical" android:hint="請輸入用戶名" android:paddingLeft="8dp" android:singleLine="true" android:textColor="#000000" android:textColorHint="#a3a3a3" android:textSize="14sp"/> <EditText android:id="@+id/et_psw" android:layout_width="fill_parent" android:layout_gravity="center_horizontal" android:layout_height="48dp" android:layout_marginLeft="35dp" android:layout_marginRight="35dp" android:background="@drawable/register_psw_bg" android:drawableLeft="@drawable/psw_icon" android:drawablePadding="10dp" android:hint="請輸入密碼" android:inputType="textPassword" android:paddingLeft="8dp" android:singleLine="true" android:textColor="#000000" android:textColorHint="#a3a3a3" android:textSize="14sp"/> <EditText android:id="@+id/et_psw_again" android:layout_width="fill_parent" android:layout_height="48dp" android:layout_gravity="center_horizontal" android:layout_marginLeft="35dp" android:layout_marginRight="35dp" android:background="@drawable/register_psw_again_bg" android:drawableLeft="@drawable/psw_icon" android:drawablePadding="10dp" android:hint="請再次輸入密碼" android:inputType="textPassword" android:paddingLeft="8dp" android:singleLine="true" android:textColor="#000000" android:textColorHint="#a3a3a3" android:textSize="14sp"/> <Button android:id="@+id/btn_register" android:layout_width="fill_parent" android:layout_height="40dp" android:layout_gravity="center_horizontal" android:layout_marginLeft="35dp" android:layout_marginRight="35dp" android:layout_marginTop="15dp" android:background="@drawable/register_selector" android:text="注 冊" android:textColor="@android:color/white" android:textSize="18sp"/> </LinearLayout>
建立背景選擇器register_selector.xml
將register_icon_normal.png,register_icon_selected.png貼入drawable中
在drawable建立register_selector.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!--register_icon_normal.png爲按鈕不點擊的樣式,點擊顯示灰色圖片register_icon_selected.png--> <item android:drawable="@drawable/register_icon_selected" android:state_pressed="true"/> <item android:drawable="@drawable/register_icon_normal"/> </selector>
MD5加密算法
MD5的全稱是Message_Digest Algorithm 5(信息-摘要算法第5版),MD5簡單來講就是吧任意長度的字符串變成固定長度(一般是128位)的十六進制字符串。
建立utils包
鼠標右鍵utils包,new->java class,建立MD5Utils類
package cn.edu.gdmec.android.boxuegu.utils; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * Created by Jack on 2018/3/27. * 建立一個md5()方法 * 過 MessageDigest 的 getInstance()方法 * 獲取數據加密對象 digest,而後經過該對象的 digest()方法對密碼進行加密 * 因爲註冊登陸涉及密碼 * 咱們須要對用戶的密碼進行 MD5 算法加密 * MD5 的全稱是 Message-Digest Algorithm 5(信息--摘要算法) * MD5 算法簡單來講就是把任意長度的字符串變換成固定長度(一般是128位)的16進制字符串 * 且此算法不可逆 */ public class MD5Utils { // md5 加密的算法 public static String md5(String text){ MessageDigest digest = null; try { //獲取數據指紋對象 digest = MessageDigest.getInstance("md5"); //字節數組 byte[] result = digest.digest(text.getBytes()); //16進制轉換 StringBuffer sb = new StringBuffer(); //獲取全部字節進行轉換 for (byte b: result){ //使用『與算法』,java使用unicode字符,因此每一個字符佔位兩個 // 須要與兩位16進制最大值進行與運算,獲取number值 int number = b & 0xff; //number值轉換字符串 String hex = Integer.toHexString(number); if (hex.length() == 1){ //若轉換後的字符長度等於1則進行字符串拼接 sb.append("0"+hex); }else { sb.append(hex); } } return sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); //發送異常return空字符串 return ""; } } }
註冊界面邏輯代碼
聲明用於操做控件的Activity私有屬性
//標題 private TextView tv_main_title; //返回按鈕 private TextView tv_back; //註冊按鈕 private Button btn_register; //用戶名,密碼,再次輸入的密碼的控件 private EditText et_user_name,et_psw,et_psw_again; //用戶名,密碼,再次輸入的密碼的控件的獲取值 private String userName,psw,pswAgain; //標題佈局 private RelativeLayout rl_title_bar;
獲取界面控件
在RegisterAcitivity中建立界面控件的初始化方法init(),用於獲取註冊界面鎖要用到的控件以及實現控件的點擊事件。注意有兩個私有類方法getEditString()和isExistUserName(String userName)寫在init()後面的。
private void init() { //從main_title_bar.xml 頁面佈局中獲取對應的UI控件 tv_main_title=findViewById(R.id.tv_main_title); tv_main_title.setText("註冊"); tv_back=findViewById(R.id.tv_back); //佈局根元素 rl_title_bar=findViewById(R.id.title_bar); rl_title_bar.setBackgroundColor(Color.TRANSPARENT); //從activity_register.xml 頁面中獲取對應的UI控件 btn_register=findViewById(R.id.btn_register); et_user_name=findViewById(R.id.et_user_name); et_psw=findViewById(R.id.et_psw); et_psw_again=findViewById(R.id.et_psw_again); tv_back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //返回鍵 RegisterActivity.this.finish(); } }); //註冊按鈕 btn_register.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //獲取輸入在相應控件中的字符串 getEditString(); //判斷輸入框內容 if(TextUtils.isEmpty(userName)){ Toast.makeText(RegisterActivity.this, "請輸入用戶名", Toast.LENGTH_SHORT).show(); return; }else if(TextUtils.isEmpty(psw)){ Toast.makeText(RegisterActivity.this, "請輸入密碼", Toast.LENGTH_SHORT).show(); return; }else if(TextUtils.isEmpty(pswAgain)){ Toast.makeText(RegisterActivity.this, "請再次輸入密碼", Toast.LENGTH_SHORT).show(); return; }else if(!psw.equals(pswAgain)){ Toast.makeText(RegisterActivity.this, "輸入兩次的密碼不同", Toast.LENGTH_SHORT).show(); return; /** *從SharedPreferences中讀取輸入的用戶名,判斷SharedPreferences中是否有此用戶名 */ }else if(isExistUserName(userName)){ Toast.makeText(RegisterActivity.this, "此帳戶名已經存在", Toast.LENGTH_SHORT).show(); return; }else{ Toast.makeText(RegisterActivity.this, "註冊成功", Toast.LENGTH_SHORT).show(); //把帳號、密碼和帳號標識保存到sp裏面 /** * 保存帳號和密碼到SharedPreferences中 */ saveRegisterInfo(userName, psw); //註冊成功後把帳號傳遞到LoginActivity.java中 // 返回值到loginActivity顯示 Intent data = new Intent(); data.putExtra("userName", userName); setResult(RESULT_OK, data); //RESULT_OK爲Activity系統常量,狀態碼爲-1, //表示此頁面下的內容操做成功將data返回到上一頁面,若是是用back返回過去的則不存在用setResult傳遞data值 RegisterActivity.this.finish(); } } }); } /** * 獲取控件中的字符串 */ private void getEditString(){ userName=et_user_name.getText().toString().trim(); psw=et_psw.getText().toString().trim(); pswAgain=et_psw_again.getText().toString().trim(); } /** * 從SharedPreferences中讀取輸入的用戶名,判斷SharedPreferences中是否有此用戶名 */ private boolean isExistUserName(String userName){ boolean has_userName=false; //mode_private SharedPreferences sp = getSharedPreferences( ); // "loginInfo", MODE_PRIVATE SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE); //獲取密碼 String spPsw=sp.getString(userName, "");//傳入用戶名獲取密碼 //若是密碼不爲空則確實保存過這個用戶名 if(!TextUtils.isEmpty(spPsw)) { has_userName=true; } return has_userName; }
保存註冊信息到SharedPreferences中
在REgisterActivity中建立一個saveRegisterInfo()方法,講註冊成功的用戶名和密碼(通過MD5加密)保存到SharedPreferences中。
private void saveRegisterInfo(String userName,String psw){ String md5Psw = MD5Utils.md5(psw);//把密碼用MD5加密 //loginInfo表示文件名, mode_private SharedPreferences sp = getSharedPreferences( ); SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE); //獲取編輯器, SharedPreferences.Editor editor -> sp.edit(); SharedPreferences.Editor editor=sp.edit(); //以用戶名爲key,密碼爲value保存在SharedPreferences中 //key,value,如鍵值對,editor.putString(用戶名,密碼); editor.putString(userName, md5Psw); //提交修改 editor.commit(); editor.commit(); }
Activity的onCreate中調用init()
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //設置頁面佈局 ,註冊界面 setContentView(R.layout.activity_register); //設置此界面爲豎屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); init(); }
RegisterActivity 完整代碼以下
package cn.edu.gdmec.android.boxuegu.activity; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.graphics.Color; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import cn.edu.gdmec.android.boxuegu.R; import cn.edu.gdmec.android.boxuegu.utils.MD5Utils; public class RegisterActivity extends AppCompatActivity { //標題 private TextView tv_main_title; //返回按鈕 private TextView tv_back; //註冊按鈕 private Button btn_register; //用戶名,密碼,再次輸入的密碼的控件 private EditText et_user_name,et_psw,et_psw_again; //用戶名,密碼,再次輸入的密碼的控件的獲取值 private String userName,psw,pswAgain; //標題佈局 private RelativeLayout rl_title_bar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //設置頁面佈局 ,註冊界面 setContentView(R.layout.activity_register); //設置此界面爲豎屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); init(); } private void init() { //從main_title_bar.xml 頁面佈局中獲取對應的UI控件 tv_main_title=findViewById(R.id.tv_main_title); tv_main_title.setText("註冊"); tv_back=findViewById(R.id.tv_back); //佈局根元素 rl_title_bar=findViewById(R.id.title_bar); rl_title_bar.setBackgroundColor(Color.TRANSPARENT); //從activity_register.xml 頁面中獲取對應的UI控件 btn_register=findViewById(R.id.btn_register); et_user_name=findViewById(R.id.et_user_name); et_psw=findViewById(R.id.et_psw); et_psw_again=findViewById(R.id.et_psw_again); tv_back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //返回鍵 RegisterActivity.this.finish(); } }); //註冊按鈕 btn_register.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //獲取輸入在相應控件中的字符串 getEditString(); //判斷輸入框內容 if(TextUtils.isEmpty(userName)){ Toast.makeText(RegisterActivity.this, "請輸入用戶名", Toast.LENGTH_SHORT).show(); return; }else if(TextUtils.isEmpty(psw)){ Toast.makeText(RegisterActivity.this, "請輸入密碼", Toast.LENGTH_SHORT).show(); return; }else if(TextUtils.isEmpty(pswAgain)){ Toast.makeText(RegisterActivity.this, "請再次輸入密碼", Toast.LENGTH_SHORT).show(); return; }else if(!psw.equals(pswAgain)){ Toast.makeText(RegisterActivity.this, "輸入兩次的密碼不同", Toast.LENGTH_SHORT).show(); return; /** *從SharedPreferences中讀取輸入的用戶名,判斷SharedPreferences中是否有此用戶名 */ }else if(isExistUserName(userName)){ Toast.makeText(RegisterActivity.this, "此帳戶名已經存在", Toast.LENGTH_SHORT).show(); return; }else{ Toast.makeText(RegisterActivity.this, "註冊成功", Toast.LENGTH_SHORT).show(); //把帳號、密碼和帳號標識保存到sp裏面 /** * 保存帳號和密碼到SharedPreferences中 */ saveRegisterInfo(userName, psw); //註冊成功後把帳號傳遞到LoginActivity.java中 // 返回值到loginActivity顯示 Intent data = new Intent(); data.putExtra("userName", userName); setResult(RESULT_OK, data); //RESULT_OK爲Activity系統常量,狀態碼爲-1, //表示此頁面下的內容操做成功將data返回到上一頁面,若是是用back返回過去的則不存在用setResult傳遞data值 RegisterActivity.this.finish(); } } }); } /** * 獲取控件中的字符串 */ private void getEditString(){ userName=et_user_name.getText().toString().trim(); psw=et_psw.getText().toString().trim(); pswAgain=et_psw_again.getText().toString().trim(); } /** * 從SharedPreferences中讀取輸入的用戶名,判斷SharedPreferences中是否有此用戶名 */ private boolean isExistUserName(String userName){ boolean has_userName=false; //mode_private SharedPreferences sp = getSharedPreferences( ); // "loginInfo", MODE_PRIVATE SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE); //獲取密碼 String spPsw=sp.getString(userName, "");//傳入用戶名獲取密碼 //若是密碼不爲空則確實保存過這個用戶名 if(!TextUtils.isEmpty(spPsw)) { has_userName=true; } return has_userName; } /** * 保存帳號和密碼到SharedPreferences中SharedPreferences */ private void saveRegisterInfo(String userName,String psw){ String md5Psw = MD5Utils.md5(psw);//把密碼用MD5加密 //loginInfo表示文件名, mode_private SharedPreferences sp = getSharedPreferences( ); SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE); //獲取編輯器, SharedPreferences.Editor editor -> sp.edit(); SharedPreferences.Editor editor=sp.edit(); //以用戶名爲key,密碼爲value保存在SharedPreferences中 //key,value,如鍵值對,editor.putString(用戶名,密碼); editor.putString(userName, md5Psw); //提交修改 editor.commit(); editor.commit(); } }
登陸界面
登陸界面主要用輸入登陸信息,當點擊「登陸」按鈕時須要在ShatredPreferences中查詢輸入的用戶名是否有對應的密碼,若是有則用此密碼與當前輸入的密碼(須要MD5加密)進行比對,若是信息一致,則登陸成功,並吧登陸成功的狀態和用戶名保存到SharedPreferences中,便於後續判斷登陸狀態和獲取用戶名。
建立登陸界面
鼠標右鍵activity包,new->activity->Empty Activity,建立LoginAcitivity
導入圖片資源到drawable中
login_bg.png
login_user_name_bg.png
login_psw_bg.png
編寫界面佈局 activity_login.xml
<?xml version="1.0" encoding="utf-8"?> <!--登陸界面--> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/login_bg" android:orientation="vertical"> <!--標題欄--> <include layout="@layout/main_title_bar"></include> <ImageView android:id="@+id/iv_head" android:layout_width="70dp" android:layout_height="70dp" android:layout_marginTop="25dp" android:layout_gravity="center_horizontal" android:background="@drawable/default_icon"/> <EditText android:id="@+id/et_user_name" android:layout_width="fill_parent" android:layout_height="48dp" android:layout_marginTop="35dp" android:layout_marginLeft="35dp" android:layout_marginRight="35dp" android:layout_gravity="center_horizontal" android:background="@drawable/login_user_name_bg" android:drawableLeft="@drawable/user_name_icon" android:drawablePadding="10dp" android:paddingLeft="8dp" android:gravity="center_vertical" android:hint="請輸入用戶名" android:singleLine="true" android:textColor="#000000" android:textColorHint="#a3a3a3" android:textSize="14sp"/> <EditText android:id="@+id/et_psw" android:layout_width="fill_parent" android:layout_height="48dp" android:layout_gravity="center_horizontal" android:layout_marginLeft="35dp" android:layout_marginRight="35dp" android:background="@drawable/login_psw_bg" android:drawableLeft="@drawable/psw_icon" android:drawablePadding="10dp" android:paddingLeft="8dp" android:gravity="center_vertical" android:hint="請輸入密碼" android:inputType="textPassword" android:singleLine="true" android:textColor="#000000" android:textColorHint="#a3a3a3" android:textSize="14sp"/> <Button android:id="@+id/btn_login" android:layout_width="fill_parent" android:layout_height="40dp" android:layout_marginTop="15dp" android:layout_marginLeft="35dp" android:layout_marginRight="35dp" android:layout_gravity="center_horizontal" android:background="@drawable/register_selector" android:text="登 錄" android:textColor="@android:color/white" android:textSize="18sp"/> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_marginTop="8dp" android:layout_marginLeft="35dp" android:layout_marginRight="35dp" android:gravity="center_horizontal" android:orientation="horizontal"> <TextView android:id="@+id/tv_register" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center_horizontal" android:padding="8dp" android:text="當即註冊" android:textColor="@android:color/white" android:textSize="14sp" /> <!--layout_weight="1" layout_width="0dp"實現均分效果--> <TextView android:id="@+id/tv_find_psw" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center_horizontal" android:padding="8dp" android:text="找回密碼?" android:textColor="@android:color/white" android:textSize="14sp" /> </LinearLayout> </LinearLayout>
登陸界面的邏輯代碼
聲明用於操做控件的Activity私有屬性
//標題 private TextView tv_main_title; //返回鍵,顯示的註冊,找回密碼 private TextView tv_back,tv_register,tv_find_psw; //登陸按鈕 private Button btn_login; //獲取的用戶名,密碼,加密密碼 private String userName,psw,spPsw; //用戶名和密碼的輸入框 private EditText et_user_name,et_psw;
獲取界面控件
建立初始化方法init(),用於獲取登陸界面所要用的空間,並設置登陸按鈕、返回按鈕、馬上註冊、找回密碼點擊事件
//獲取界面控件 private void init() { //從main_title_bar中獲取的id tv_main_title=findViewById(R.id.tv_main_title); tv_main_title.setText("登陸"); tv_back=findViewById(R.id.tv_back); //從activity_login.xml中獲取的 tv_register=findViewById(R.id.tv_register); tv_find_psw=findViewById(R.id.tv_find_psw); btn_login=findViewById(R.id.btn_login); et_user_name=findViewById(R.id.et_user_name); et_psw=findViewById(R.id.et_psw); //返回鍵的點擊事件 tv_back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //登陸界面銷燬 LoginActivity.this.finish(); } }); //當即註冊控件的點擊事件 tv_register.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //爲了跳轉到註冊界面,並實現註冊功能 Intent intent=new Intent(LoginActivity.this,RegisterActivity.class); startActivityForResult(intent, 1); } }); //找回密碼控件的點擊事件 tv_find_psw.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //跳轉到找回密碼界面(此頁面暫未建立) /*Intent intent=new Intent(LoginActivity.this,FindPwdActivity.class); startActivity(intent);*/ } }); //登陸按鈕的點擊事件 btn_login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //開始登陸,獲取用戶名和密碼 getText().toString().trim(); userName=et_user_name.getText().toString().trim(); psw=et_psw.getText().toString().trim(); //對當前用戶輸入的密碼進行MD5加密再進行比對判斷, MD5Utils.md5( ); psw 進行加密判斷是否一致 String md5Psw= MD5Utils.md5(psw); // md5Psw ; spPsw 爲 根據從SharedPreferences中用戶名讀取密碼 // 定義方法 readPsw爲了讀取用戶名,獲得密碼 spPsw=readPsw(userName); // TextUtils.isEmpty if(TextUtils.isEmpty(userName)){ Toast.makeText(LoginActivity.this, "請輸入用戶名", Toast.LENGTH_SHORT).show(); return; }else if(TextUtils.isEmpty(psw)){ Toast.makeText(LoginActivity.this, "請輸入密碼", Toast.LENGTH_SHORT).show(); return; // md5Psw.equals(); 判斷,輸入的密碼加密後,是否與保存在SharedPreferences中一致 }else if(md5Psw.equals(spPsw)){ //一致登陸成功 Toast.makeText(LoginActivity.this, "登陸成功", Toast.LENGTH_SHORT).show(); //保存登陸狀態,在界面保存登陸的用戶名 定義個方法 saveLoginStatus boolean 狀態 , userName 用戶名; saveLoginStatus(true, userName); //登陸成功後關閉此頁面進入主頁 Intent data=new Intent(); //datad.putExtra( ); name , value ; data.putExtra("isLogin",true); data.putExtra("userName",userName); //RESULT_OK爲Activity系統常量,狀態碼爲-1 // 表示此頁面下的內容操做成功將data返回到上一頁面,若是是用back返回過去的則不存在用setResult傳遞data值 setResult(RESULT_OK,data); //銷燬登陸界面 LoginActivity.this.finish(); //跳轉到主界面,登陸成功的狀態傳遞到 MainActivity 中 //startActivity(new Intent(LoginActivity.this, MainActivity.class)); return; }else if((spPsw!=null&&!TextUtils.isEmpty(spPsw)&&!md5Psw.equals(spPsw))){ Toast.makeText(LoginActivity.this, "輸入的用戶名和密碼不一致", Toast.LENGTH_SHORT).show(); return; }else{ Toast.makeText(LoginActivity.this, "此用戶名不存在", Toast.LENGTH_SHORT).show(); } } }); } 從SharedPreferences中根據用戶名讀取密碼 /** *從SharedPreferences中根據用戶名讀取密碼 */ private String readPsw(String userName){ //getSharedPreferences("loginInfo",MODE_PRIVATE); //"loginInfo",mode_private; MODE_PRIVATE表示能夠繼續寫入 SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE); //sp.getString() userName, ""; return sp.getString(userName , ""); }
保存登陸狀態到SharedPreferences中
因爲在後續建立主界面時,須要根據登陸狀態來設置界面的圖標和用戶名,所以須要建立saveLogiinStatus()方法,在登陸成功後吧登陸狀態和用戶名保存到SharedPrefereces中。
private void saveLoginStatus(boolean status,String userName){ //saveLoginStatus(true, userName); //loginInfo表示文件名 SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE); SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE); //獲取編輯器 SharedPreferences.Editor editor=sp.edit(); //存入boolean類型的登陸狀態 editor.putBoolean("isLogin", status); //存入登陸狀態時的用戶名 editor.putString("loginUserName", userName); //提交修改 editor.commit(); }
獲取回傳數據
重寫onActivityResult()方法,經過data.getStringExtra()方法獲取註冊成功的一個用戶名,並將其顯示在用戶名控件上。
重寫類方法的便捷操做:
選擇菜單Code->Override Methods 或者按快捷鍵Ctrl+o,而後輸入方法名onActivityResult,Android Studio會智能查找到,按回車自動把衝寫代碼加入。
/** * 註冊成功的數據返回至此 * @param requestCode 請求碼 * @param resultCode 結果碼 * @param data 數據 */ @Override //顯示數據, onActivityResult //startActivityForResult(intent, 1); 從註冊界面中獲取數據 //int requestCode , int resultCode , Intent data // LoginActivity -> startActivityForResult -> onActivityResult(); protected void onActivityResult(int requestCode, int resultCode, Intent data) { //super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data); if(data!=null){ //是獲取註冊界面回傳過來的用戶名 // getExtra().getString("***"); String userName=data.getStringExtra("userName"); if(!TextUtils.isEmpty(userName)){ //設置用戶名到 et_user_name 控件 et_user_name.setText(userName); //et_user_name控件的setSelection()方法來設置光標位置 et_user_name.setSelection(userName.length()); } } }
LoginActivity 完整代碼以下
package cn.edu.gdmec.android.boxuegu.activity; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import cn.edu.gdmec.android.boxuegu.R; import cn.edu.gdmec.android.boxuegu.utils.MD5Utils; public class LoginActivity extends AppCompatActivity { //標題 private TextView tv_main_title; //返回鍵,顯示的註冊,找回密碼 private TextView tv_back,tv_register,tv_find_psw; //登陸按鈕 private Button btn_login; //獲取的用戶名,密碼,加密密碼 private String userName,psw,spPsw; //用戶名和密碼的輸入框 private EditText et_user_name,et_psw; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); //設置此界面爲豎屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); init(); } //獲取界面控件 private void init() { //從main_title_bar中獲取的id tv_main_title=findViewById(R.id.tv_main_title); tv_main_title.setText("登陸"); tv_back=findViewById(R.id.tv_back); //從activity_login.xml中獲取的 tv_register=findViewById(R.id.tv_register); tv_find_psw=findViewById(R.id.tv_find_psw); btn_login=findViewById(R.id.btn_login); et_user_name=findViewById(R.id.et_user_name); et_psw=findViewById(R.id.et_psw); //返回鍵的點擊事件 tv_back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //登陸界面銷燬 LoginActivity.this.finish(); } }); //當即註冊控件的點擊事件 tv_register.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //爲了跳轉到註冊界面,並實現註冊功能 Intent intent=new Intent(LoginActivity.this,RegisterActivity.class); startActivityForResult(intent, 1); } }); //找回密碼控件的點擊事件 tv_find_psw.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //跳轉到找回密碼界面(此頁面暫未建立) /*Intent intent=new Intent(LoginActivity.this,FindPwdActivity.class); startActivity(intent);*/ } }); //登陸按鈕的點擊事件 btn_login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //開始登陸,獲取用戶名和密碼 getText().toString().trim(); userName=et_user_name.getText().toString().trim(); psw=et_psw.getText().toString().trim(); //對當前用戶輸入的密碼進行MD5加密再進行比對判斷, MD5Utils.md5( ); psw 進行加密判斷是否一致 String md5Psw= MD5Utils.md5(psw); // md5Psw ; spPsw 爲 根據從SharedPreferences中用戶名讀取密碼 // 定義方法 readPsw爲了讀取用戶名,獲得密碼 spPsw=readPsw(userName); // TextUtils.isEmpty if(TextUtils.isEmpty(userName)){ Toast.makeText(LoginActivity.this, "請輸入用戶名", Toast.LENGTH_SHORT).show(); return; }else if(TextUtils.isEmpty(psw)){ Toast.makeText(LoginActivity.this, "請輸入密碼", Toast.LENGTH_SHORT).show(); return; // md5Psw.equals(); 判斷,輸入的密碼加密後,是否與保存在SharedPreferences中一致 }else if(md5Psw.equals(spPsw)){ //一致登陸成功 Toast.makeText(LoginActivity.this, "登陸成功", Toast.LENGTH_SHORT).show(); //保存登陸狀態,在界面保存登陸的用戶名 定義個方法 saveLoginStatus boolean 狀態 , userName 用戶名; saveLoginStatus(true, userName); //登陸成功後關閉此頁面進入主頁 Intent data=new Intent(); //datad.putExtra( ); name , value ; data.putExtra("isLogin",true); data.putExtra("userName",userName); //RESULT_OK爲Activity系統常量,狀態碼爲-1 // 表示此頁面下的內容操做成功將data返回到上一頁面,若是是用back返回過去的則不存在用setResult傳遞data值 setResult(RESULT_OK,data); //銷燬登陸界面 LoginActivity.this.finish(); //跳轉到主界面,登陸成功的狀態傳遞到 MainActivity 中 //startActivity(new Intent(LoginActivity.this, MainActivity.class)); return; }else if((spPsw!=null&&!TextUtils.isEmpty(spPsw)&&!md5Psw.equals(spPsw))){ Toast.makeText(LoginActivity.this, "輸入的用戶名和密碼不一致", Toast.LENGTH_SHORT).show(); return; }else{ Toast.makeText(LoginActivity.this, "此用戶名不存在", Toast.LENGTH_SHORT).show(); } } }); } /** *從SharedPreferences中根據用戶名讀取密碼 */ private String readPsw(String userName){ //getSharedPreferences("loginInfo",MODE_PRIVATE); //"loginInfo",mode_private; MODE_PRIVATE表示能夠繼續寫入 SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE); //sp.getString() userName, ""; return sp.getString(userName , ""); } /** *保存登陸狀態和登陸用戶名到SharedPreferences中 */ private void saveLoginStatus(boolean status,String userName){ //saveLoginStatus(true, userName); //loginInfo表示文件名 SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE); SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE); //獲取編輯器 SharedPreferences.Editor editor=sp.edit(); //存入boolean類型的登陸狀態 editor.putBoolean("isLogin", status); //存入登陸狀態時的用戶名 editor.putString("loginUserName", userName); //提交修改 editor.commit(); } /** * 註冊成功的數據返回至此 * @param requestCode 請求碼 * @param resultCode 結果碼 * @param data 數據 */ @Override //顯示數據, onActivityResult //startActivityForResult(intent, 1); 從註冊界面中獲取數據 //int requestCode , int resultCode , Intent data // LoginActivity -> startActivityForResult -> onActivityResult(); protected void onActivityResult(int requestCode, int resultCode, Intent data) { //super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data); if(data!=null){ //是獲取註冊界面回傳過來的用戶名 // getExtra().getString("***"); String userName=data.getStringExtra("userName"); if(!TextUtils.isEmpty(userName)){ //設置用戶名到 et_user_name 控件 et_user_name.setText(userName); //et_user_name控件的setSelection()方法來設置光標位置 et_user_name.setSelection(userName.length()); } } } }
回顧包結構哦~
挑戰任務
檢驗登陸和註冊模塊。
請修改MainActivity和LoginActivity,歡迎界面調轉入主界面後,自動跳轉入登陸界面,登陸成功後,返回主界面,在主界面的Hello World位置顯示:用戶名+「登陸成功」。
總結
這是走好Android的第二步!
做者Info:
【做者】:Jeskson
【原創公衆號】:達達前端小酒館。
【福利】:公衆號回覆 「資料」 送自學資料大禮包(進羣分享,想要啥就說哈,看我有沒有)!
【轉載說明】:轉載請說明出處,謝謝合做!~
大前端開發,定位前端開發技術棧博客,PHP後臺知識點,web全棧技術領域,數據結構與算法、網絡原理等通俗易懂的呈現給小夥伴。謝謝支持,承蒙厚愛!!!
若本號內容有作得不到位的地方(好比:涉及版權或其餘問題),請及時聯繫咱們進行整改便可,會在第一時間進行處理。
這是一個有質量,有態度的博客