实现记住用户名密码的登录界面
效果图如下:
当用户点击登录按钮时,如果用户勾选CheckBox密码复选框时,用户名与密码都被自动保存起来。
MainActivity的布局文件:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 android:background="@drawable/loginbg" 7 android:paddingBottom="@dimen/activity_vertical_margin" 8 android:paddingLeft="@dimen/activity_horizontal_margin" 9 android:paddingRight="@dimen/activity_horizontal_margin" 10 android:paddingTop="@dimen/activity_vertical_margin" 11 tools:context=".LoginActivity" > 12 13 <include layout="@layout/login_top"/> 14 15 <include layout="@layout/login_bottom"/>" 16 17 </LinearLayout>
当中调用其他两个xml文件,其代码就不显示了。
MainActivity的代码:
1 public class MainActivity extends Activity { 2 3 private EditText uname; 4 private EditText upass; 5 private CheckBox cbkeep; 6 private Button btlogin; 7 8 private SharedPreferences mSpSettings=null; 9 private static final String PREFS_NAME="NamePwd"; 10 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 requestWindowFeature(Window.FEATURE_NO_TITLE); 15 setContentView(R.layout.activity_main); 16 findView();//得到布局中的控件 17 setListener();//绑定控件事件 18 getData();//获取数据 19 } 20 21 /*绑定控件*/ 22 private void findView() { 23 uname=(EditText) findViewById(R.id.etUsername); 24 upass=(EditText) findViewById(R.id.tvPassword); 25 cbkeep=(CheckBox) findViewById(R.id.ckname); 26 btlogin=(Button) findViewById(R.id.btnLogin); 27 } 28 29 /*为控件添加绑定事件*/ 30 private void setListener() { 31 btlogin.setOnClickListener(new OnClickListener(){ 32 33 @Override 34 public void onClick(View v) { 35 //判断用户名和密码 36 if("admin".equals(uname.getText().toString())&&"admin".equals(upass.getText().toString())){ 37 //判断复选框是否选中 38 if(cbkeep.isChecked()){ 39 mSpSettings=getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 40 //得到Editor对象 41 Editor edit=mSpSettings.edit(); 42 //记录保存标记 43 edit.putBoolean("isKeep",true); 44 //记录用户名 45 edit.putString("uname",uname.getText().toString()); 46 //记录密码 47 edit.putString("upass",upass.getText().toString()); 48 //提交数据 49 edit.commit(); 50 }else{ 51 mSpSettings=getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 52 //得到Editor对象 53 Editor edit=mSpSettings.edit(); 54 //记录保存标记 55 edit.putBoolean("isKeep",false); 56 //记录用户名 57 edit.putString("uname",""); 58 //记录密码 59 edit.putString("upass",""); 60 //提交数据 61 edit.commit(); 62 } 63 //跳转到首页 64 Intent intent=new Intent(MainActivity.this,SuccessActivity.class); 65 startActivity(intent); 66 }else{ 67 //显示错误提示 68 Toast.makeText(getApplicationContext(), "用户名或密码错误", Toast.LENGTH_SHORT).show(); 69 } 70 71 } 72 73 74 }); 75 } 76 77 protected void onResume(){ 78 //在界面显示数据之前得到之前存储的数据 79 super.onResume(); 80 getData(); 81 } 82 83 private void getData() { 84 //得到sharedpreferences对象 85 mSpSettings=getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 86 //判断是否之前存储过用户名密码 87 if(mSpSettings.getBoolean("idKeep", false)){ 88 //如果之前存储过,则显示在相应文本框内 89 uname.setText(mSpSettings.getString("uname", "")); 90 upass.setText(mSpSettings.getString("upass", "")); 91 }else{ 92 //否则显示为空 93 uname.setText(""); 94 upass.setText(""); 95 } 96 97 } 98 99 100 101 }
当用户点击登录按钮时,首先判断用户名与密码是否为合法用户,如果是合法用户并且用户勾选了记住密码,则写入用户名密码信息。确定保存这些信息,如用户名密码输入错误,则清空之前记录的用户名密码。然后转到SuccessActivity页面。
SuccessActivity页面的布局文件如下:
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:id="@+id/RelativeLayout1" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:background="@drawable/loginbg" 7 android:orientation="vertical" 8 android:paddingBottom="@dimen/activity_vertical_margin" 9 android:paddingLeft="@dimen/activity_horizontal_margin" 10 android:paddingRight="@dimen/activity_horizontal_margin" 11 android:paddingTop="@dimen/activity_vertical_margin" 12 tools:context=".MainActivity" > 13 14 <TextView 15 android:id="@+id/textView1" 16 android:layout_width="wrap_content" 17 android:layout_height="wrap_content" 18 android:layout_centerInParent="true" 19 android:text="TextView" 20 android:textSize="20sp" /> 21 22 </RelativeLayout>
SuccessActivity的代码:
1 package com.example.minitwittersimulate; 2 3 import android.os.Bundle; 4 import android.app.Activity; 5 public class SuccessActivity extends Activity { 6 7 8 @Override 9 protected void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.activity_success); 12 } 13 14 15 16 }
定义完SuccessActivity后,要在mainfest文件中注册Activity,否则打不开。
添加代码:<activity android:name=".SuccessActivity"></activity>
实际上SharedPreferences中的数据也是以文件的形式存储,只不过Android封装了这些文件的的过程和方式。可以在/data/data/PACKAGE_NAME/shared_prefs目录下查找,其中对应文件是使用xml来进行文件存储的,大致如下:
1 <?xml version='1.0' encoding='utf-8' standalone='yes'?> 2 <map> 3 <int name="isKeep" value="true"> 4 <string name="uname" value="zhangsan"> 5 <string name="upass" value="1234"> 6 </map>