你們好,給你們帶來AndroidStudio製做登陸和註冊功能的實現,界面的佈局介紹
的概述,但願大家喜歡java
Success is connecting with the world and making people feel. - 《名揚四海》
android
當咱們面臨製做登陸和註冊功能的實現時,咱們須要先設計登陸界面的佈局和註冊界面的佈局,作到有完整的思路時纔開始實現其功能效果會更好。算法
咱們須要作個標題欄,登錄界面,實現登錄界面的功能代碼塊,註冊界面,實現測試界面的功能模塊便可完成。數組
每一個APP都基本上有個標題欄,便是顯示標題,標題欄的兩側大多數都有一個返回建。那麼標題欄便是一個返回鍵和一個標題欄的製做佈局。安全
爲了不大多數代碼的冗雜,咱們把這個標題欄的製做佈局獨立起來,標題的顯示咱們能夠在每塊主題模塊上,用setText()
方法來顯示不一樣的標題。app
接下來咱們建立main_title_bar.xml
佈局文件:
具體代碼以下:編輯器
<?xml version="1.0" encoding="utf-8"?> <!--這裏代碼的是建立一個標題欄,左邊是返回鍵--> <!--咱們設置RelativeLayout佈局,id = "title_bar"--> <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來顯示,id : tv_back , tv_main_title --> <TextView android:id="@+id/tv_back" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignParentLeft="true" android:background="@drawable/go_back_selector" /> <TextView android:id="@+id/tv_main_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textColor="@android:color/white" android:textSize="20sp"/> <!--其中android:background="@drawable/go_back_selector"爲點擊回退鍵時,會變化效果,其實就是一個點擊更換個圖片而已。--> <!--咱們先用這種老方法,接下來之後的文章才作代碼優化效果--> </RelativeLayout>
如今標題欄佈局作好了,咱們須要瞭解怎麼換圖片,就是在android:background="@drawable/go_back_selector"
,其實就是在drawable中建立這個go_back_selector.xml
文件而已,用到了android:state_pressed="true"
這個屬性,當點擊時就是變化的圖片效果,記住state_pressed就OK。ide
建立登陸界面,咱們須要標題欄顯示「登陸」,那麼就要經過
咱們須要設計想好美化登陸界面,須要如下圖片:登陸背景圖片login_bg.png
,默認的頭像圖片default_icon
,輸入用戶名的背景圖片login_user_name_bg
,在用戶名前須要一個小標圖user_name_icon
,同理,輸入密碼框須要圖片有login_psw_bg,psw_icon
,按鈕須要圖片加以美觀register_selector
,根據須要的圖片可自行製做。佈局
建立activity_login.xml佈局文件,具體代碼以下:
<?xml version="1.0" encoding="utf-8"?> <!--登陸界面,用LinearLayout--> <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> <!--顯示頭像,記得加入id iv_head --> <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"/> <!--顯示tv register , find_psw --> <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_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>
MD5 爲 Message-Digest Algorithm 5(信息--摘要算法),記住幾個要點就能夠了。
具體代碼以下:
package cn.edu.gdmec.android.androidstudiodemo.utils; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Utils { //md5 加密算法 public static String md5(String text) { MessageDigest digest = null; try { digest = MessageDigest.getInstance("md5"); // 數組 byte[] result -> digest.digest( ); 文本 text.getBytes(); byte[] result = digest.digest(text.getBytes()); //建立StringBuilder對象 而後建議StringBuffer,安全性高 //StringBuilder sb = new StringBuilder(); StringBuffer sb = new StringBuffer(); // result數組,digest.digest ( ); -> text.getBytes(); // for 循環數組byte[] result; for (byte b : result){ // 0xff 爲16進制 int number = b & 0xff; // number值 轉換 字符串 Integer.toHexString( ); String hex = Integer.toHexString(number); if (hex.length() == 1){ sb.append("0"+hex); }else { sb.append(hex); } } //sb StringBuffer sb = new StringBuffer();對象實例化 return sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); //發送異常return空字符串 return ""; } } }
完成註冊頁面的佈局與 MD5 工具類後,進行註冊界面的邏輯編寫。
當在註冊界面點擊註冊按鈕後,須要獲取用戶名,用戶密碼和再次確認密碼,當兩次密碼相同時,將用戶名和密碼(通過 MD5 加密)保存到 SharedPreferences 中,同時當註冊成功後,須要將用戶名傳遞到登陸界面中。
RegisterActivity.java具體代碼以下:
package cn.edu.gdmec.android.androidstudiodemo; 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.androidstudiodemo.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(); } }
完成登陸界面佈局後,來實現登陸界面的邏輯代碼。
當點擊登陸按鈕時,需判斷用戶名和密碼是否爲空。
若爲空,則提示請輸入用戶名或密碼,這裏的判斷事項比較一開始凌亂,須要細細品味;若不爲空,則獲取用戶輸入的用戶名,因爲用的是本地數據,須要根據用戶名在 SharedPreferences 中查詢是否有對應的密碼,如有對應的密碼且與用戶輸入的密碼(需經過 MD5 加密)比對一致狀況,則登陸成功。
LoginActivity.java具體代碼以下:
package cn.edu.gdmec.android.androidstudiodemo; 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.androidstudiodemo.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) { //跳轉到找回密碼界面(此頁面暫未建立) } }); //登陸按鈕的點擊事件 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); //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()); } } } }
如作了效果,須要在清單文件中實現該類,文件的跳轉,能夠本身瞭解一下。主要介紹註冊模塊,登陸模塊。裏面的註解我寫的若是有不全的或者錯誤點,能夠聯繫討論。
接下來你看到如上代碼有點多,那麼咱們能夠進行代碼的優化來減小代碼量。
Android
&Java
知識點,有興趣能夠繼續關注