Android開(kāi)發(fā)學(xué)習(xí) -- Day14持久化技術(shù)實(shí)踐 -- 記住登陸名和密碼

我們?cè)谥暗膶W(xué)習(xí)中寫(xiě)過(guò)一個(gè)強(qiáng)制下線(xiàn)的demo虏等,其中涉及到了一個(gè)模擬的登陸功能食绿。那么今天梳凛,在原有的基礎(chǔ)上,我們通過(guò)SharedPreferences來(lái)實(shí)現(xiàn)一個(gè)能夠記住登錄名和密碼的功能疙教。

為了區(qū)分之前的登陸頁(yè)面棺聊,我們新建一個(gè)LoginAdvActivity表示更高級(jí)的登陸,修改布局文件:

<LinearLayout 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:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.johnhao.listviewdemo.activity.LoginActivity">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="用戶(hù)名"
            android:textSize="20sp"/>

        <EditText
            android:id="@+id/edit_name"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="3"
            android:hint="用戶(hù)名試試 tester"
            android:textSize="18sp"
            android:maxLength="20"/>

    </LinearLayout>


    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="密 碼"
            android:textSize="20sp"/>

        <EditText
            android:id="@+id/edit_password"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="3"
            android:hint="登陸密碼試試 123456"
            android:textSize="18sp"
            android:maxLength="20"/>

    </LinearLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:gravity="left"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <CheckBox
            android:id="@+id/checkbox"
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:text="remeber password"
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>

    <Button
        android:id="@+id/btn_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:background="#ffff00"
        android:text="Login"
        android:textAllCaps="false"
        android:textColor="#000000"/>

    <ImageView
        android:src="@drawable/qrcode"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"/>

</LinearLayout>

相對(duì)于原來(lái)的布局贞谓,我們?cè)黾恿艘粋€(gè)checkbox控件和一行文案限佩。checkbox是一個(gè)復(fù)選框,用戶(hù)可以通過(guò)點(diǎn)擊的方式進(jìn)行選中或取下裸弦,我們就用這個(gè)控件表示用戶(hù)是否勾選了記住密碼功能祟同。接下來(lái)修改LoginAdvActivity代碼:

public class LoginAdvActivity extends AppCompatActivity {

    private Button btn;
    private EditText editUserName;
    private EditText editserPassword;
    private CheckBox rememberPass;
    private SharedPreferences prefs;
    private SharedPreferences.Editor editor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login_adv);

        setTitle("登陸");
        btn = findViewById(R.id.btn_login);
        editUserName = findViewById(R.id.edit_name);
        editserPassword = findViewById(R.id.edit_password);
        rememberPass = findViewById(R.id.checkbox);

        prefs = PreferenceManager.getDefaultSharedPreferences(this);
        boolean isRemember = prefs.getBoolean("remeber_password", false);

        if (isRemember) {
            String account = prefs.getString("account", "");
            String password = prefs.getString("password", "");
            editUserName.setText(account);
            editserPassword.setText(password);
            rememberPass.setChecked(true);
        }

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String userName = editUserName.getText().toString();
                String userPassword = editserPassword.getText().toString();

                if (userName.equals("tester") && userPassword.equals("123456")) {
                    editor = prefs.edit();
                    if (rememberPass.isChecked()) {
                        editor.putBoolean("remeber_password", true);
                        editor.putString("account", userName);
                        editor.putString("password", userPassword);
                    } else {
                        editor.clear();
                    }
                    editor.apply();
                    // 登陸成功
                    Intent intent = new Intent(LoginAdvActivity.this, AfterLoginActivity.class);
                    startActivity(intent);
                    finish();
                } else if (TextUtils.isEmpty(userName) || TextUtils.isEmpty(userPassword)) {
                    // 用戶(hù)名或密碼為空
                    Toast.makeText(LoginAdvActivity.this, "請(qǐng)輸入用戶(hù)名或者密碼", Toast.LENGTH_SHORT).show();
                } else {
                    // 用戶(hù)名或密碼不符合
                    Toast.makeText(LoginAdvActivity.this, "請(qǐng)輸入正確的用戶(hù)名和密碼", Toast.LENGTH_SHORT).show();
                    editUserName.setText("");
                    editserPassword.setText("");
                }
            }
        });
    }
}

首先在onCreate()方法中通過(guò)getDefaultSharedPreferences()得到了SharedPreferences對(duì)象,然后通過(guò)getBoolean獲取remeber_password鍵對(duì)應(yīng)的值理疙。因?yàn)槭堑谝淮蔚顷懺纬牵隙](méi)有任何數(shù)據(jù),因此設(shè)置默認(rèn)的值的false窖贤。在點(diǎn)擊事件中砖顷,登陸成功后,我們先通過(guò)調(diào)用SharedPreferences的edit()得到一個(gè)SharedPreferences.Editor對(duì)象主之,然后判斷checkbox是否是被選中狀態(tài)择吊。如果被選中,說(shuō)明用戶(hù)想保存密碼槽奕,這樣我就調(diào)用一系列put方法將數(shù)據(jù)存到SharedPreferences并提交几睛。如果checkbox沒(méi)有被選中,我們則調(diào)用clear()方法將數(shù)據(jù)清空粤攒。

當(dāng)用戶(hù)保存了密碼并成功登錄后所森,remeber_password的值就為true了,這樣讓用戶(hù)再次到登陸頁(yè)面的時(shí)候夯接,就會(huì)自動(dòng)的從SharedPreferences讀取數(shù)據(jù)焕济,并將對(duì)應(yīng)的數(shù)據(jù)填充到輸入框中,由此實(shí)現(xiàn)簡(jiǎn)單的記住登陸密碼的功能盔几。

重新運(yùn)行下程序晴弃,記住登陸密碼:

取消記住登陸密碼:

簡(jiǎn)單的實(shí)例就這樣,但是在實(shí)際的項(xiàng)目中不能這么應(yīng)用逊拍。涉及到敏感的信息都需要進(jìn)行加密處理來(lái)保護(hù)數(shù)據(jù)的安全性上鞠。

關(guān)注獲取更多內(nèi)容
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芯丧,隨后出現(xiàn)的幾起案子芍阎,更是在濱河造成了極大的恐慌,老刑警劉巖缨恒,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谴咸,死亡現(xiàn)場(chǎng)離奇詭異轮听,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)岭佳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)血巍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人驼唱,你說(shuō)我怎么就攤上這事藻茂【允睿” “怎么了玫恳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)优俘。 經(jīng)常有香客問(wèn)我京办,道長(zhǎng),這世上最難降的妖魔是什么帆焕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任惭婿,我火速辦了婚禮,結(jié)果婚禮上叶雹,老公的妹妹穿的比我還像新娘财饥。我一直安慰自己,他們只是感情好折晦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布钥星。 她就那樣靜靜地躺著,像睡著了一般满着。 火紅的嫁衣襯著肌膚如雪谦炒。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天风喇,我揣著相機(jī)與錄音宁改,去河邊找鬼。 笑死魂莫,一個(gè)胖子當(dāng)著我的面吹牛还蹲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耙考,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谜喊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了琳骡?” 一聲冷哼從身側(cè)響起锅论,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎楣号,沒(méi)想到半個(gè)月后最易,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體怒坯,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年藻懒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剔猿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嬉荆,死狀恐怖归敬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鄙早,我是刑警寧澤汪茧,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站限番,受9級(jí)特大地震影響舱污,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弥虐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一扩灯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霜瘪,春花似錦珠插、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至惜互,卻和暖如春布讹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背训堆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工描验, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坑鱼。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓膘流,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鲁沥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呼股,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354