教育系統APP(二)

註冊與登陸界面
設計思路前端

當咱們面臨製做登陸和註冊功能的實現時,咱們須要先設計登陸界面的佈局和註冊界面的佈局,作到有完整的思路時纔開始實現其功能效果會更好。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間跳轉

挑戰任務
展現一下包結構
綠色表示新的添加哦~

file

file

項目實操
註冊界面主要用於輸入用戶註冊信息,在註冊界面中用戶須要輸入用戶名、密碼、再次輸入密碼,當點擊「註冊」按鈕時進行註冊。使用本地數據存儲用戶信息,註冊成功後將用戶名和密碼保存在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>

file

file

將圖片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>

file

註冊界面

file

建立註冊界面Activity

鼠標右鍵activity包,new->activity->Empty Activity,建立RegisterActivity

file

導入圖片資源到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>

file

file

file

建立背景選擇器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>

file

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 ""; } } }

file

file

file

註冊界面邏輯代碼
聲明用於操做控件的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;

file

獲取界面控件
在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; }

file

file

file

file
保存註冊信息到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(); }

file

Activity的onCreate中調用init()

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //設置頁面佈局 ,註冊界面
        setContentView(R.layout.activity_register);
        //設置此界面爲豎屏
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        init();
    }

file

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中,便於後續判斷登陸狀態和獲取用戶名。

file

建立登陸界面
鼠標右鍵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());
            }
        }
    }
}

回顧包結構哦~

file

file

挑戰任務
檢驗登陸和註冊模塊。
請修改MainActivity和LoginActivity,歡迎界面調轉入主界面後,自動跳轉入登陸界面,登陸成功後,返回主界面,在主界面的Hello World位置顯示:用戶名+「登陸成功」。

總結
這是走好Android的第二步!

❤️ 不要忘記留下你學習的腳印 [點贊 + 收藏 + 評論]

做者Info:

【做者】:Jeskson
【原創公衆號】:達達前端小酒館。
【福利】:公衆號回覆 「資料」 送自學資料大禮包(進羣分享,想要啥就說哈,看我有沒有)!
【轉載說明】:轉載請說明出處,謝謝合做!~

大前端開發,定位前端開發技術棧博客,PHP後臺知識點,web全棧技術領域,數據結構與算法、網絡原理等通俗易懂的呈現給小夥伴。謝謝支持,承蒙厚愛!!!


若本號內容有作得不到位的地方(好比:涉及版權或其餘問題),請及時聯繫咱們進行整改便可,會在第一時間進行處理。


請點贊!由於大家的贊同/鼓勵是我寫做的最大動力!

歡迎關注達達的CSDN!

這是一個有質量,有態度的博客

前端技術棧

相關文章
相關標籤/搜索