- 完成内容:
(1)使用TextView、EditText、RadioButton和CheckBox组件显示用户注册UI
(2)使用SharedPreferences存储数据 - 需求说明:
(1)创建线性布局的XML文件
(2)在布局文件中添加TextView、EditText、RadioButton和CheckBox组件
(3)使用SharedPreferences实现数据存储。
参考了这篇👉传送门
1 定义SharedPreferences方法
MySharedPreferences.java
package cn.com.sgmsc.news;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.preference.PreferenceManager;
public class MySharedPreference {
private static SharedPreferences preContext = null;
private static SharedPreferences getPreference(Context cx) {
return PreferenceManager.getDefaultSharedPreferences(cx);
}
//注册
public static void register(Context cx, String username, String password) {
setValue(cx, username, password);
}
//设置用户ID
public static void saveNames(Context cx, String username, String password) {
setValue(cx, username, password);
}
//根据关键词key映射得到相应的字符串
public static String getStringValue(Context cx, String key) {
if (preContext == null) {
preContext = getPreference(cx);
}
return preContext.getString(key, "error");
}
//根据关键词key映射得到“记住我”标志位状态
public static int getFlag(Context cx, String key) {
if (preContext == null) {
preContext = getPreference(cx);
}
return preContext.getInt(key, 0);
}
//设置键值对<key,val>
private static void setValue(Context cx, String key, String val) {
if (preContext == null) {
preContext = getPreference(cx);
}
Editor ed = preContext.edit();
ed.putString(key, val);
boolean ret = ed.commit();
}
//设置键值对<key,val>
private static void setValue(Context cx, String key, int val) {
if (preContext == null) {
preContext = getPreference(cx);
}
Editor ed = preContext.edit();
ed.putInt(key, val);
boolean ret = ed.commit();
}
//保存人数
public static void saveCount(Context cx, String key, int count) {
setValue(cx, key, count);
}
//保存“记住我”标注位状态
public static void saveRemember(Context cx,int i) {
setValue(cx,"flag",i);
}
//根据关键词key映射得到相应的整型值
public static int getIntValue(Context cx, String key) {
if (preContext == null) {
preContext = getPreference(cx);
}
return preContext.getInt(key, 0);
}
}
2 定义登录和注册界面事件
LoginActivity.java
package cn.com.sgmsc.news;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.content.Intent;
import android.preference.PreferenceManager;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import cn.com.sgmsc.news.R;
public class LoginActivity extends Activity {
private static EditText etUid; //接收用户id组件
private static EditText etPwd; //接收用户密码组件
private static CheckBox cb; //"记住我"复选框组件
private static String uidstr; //用户帐号
private static String pwdstr; //用户密码
private int count; //统计注册人数
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Button login = (Button) findViewById(R.id.btnLogin);
Button register = (Button) findViewById(R.id.btnReg);
etUid=(EditText) findViewById(R.id.etUid); //获得帐号EditText
etPwd=(EditText) findViewById(R.id.etPwd); //获得密码EditText
final TextView tips = (TextView) findViewById(R.id.tips);
cb=(CheckBox) findViewById(R.id.cbRemember); //获得CheckBox对象
checkIfRemember(); //从SharedPreferences中读取用户的帐号和密码
count = MySharedPreference.getIntValue(LoginActivity.this, "count");
tips.setText("当前共有"+count+"人注册");
//登录
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String strUsername = etUid.getText().toString();
String strPassword = etPwd.getText().toString();
String defaultPass = MySharedPreference.getStringValue(LoginActivity.this, strUsername);
if(strUsername.equals("")||strPassword.equals("")){
showMessage("strnull");
}
if(defaultPass.equals(strPassword)) {
//匹配成功登录跳转
if(cb.isChecked()) {
for(int i=1;i<=count;i++) {
//为了实现”记住我“功能,这里i从1开始
String name = String.valueOf(i-1);
name = MySharedPreference.getStringValue(LoginActivity.this, name);
if(name.equals(strUsername)) {
//如果勾选了”记住我“,而且用户名存在,则标记此时需要记住的用户
MySharedPreference.saveRemember(LoginActivity.this, i);
}
}
}
else {
//如果没有勾选”记住我“。那么将标志置为0
MySharedPreference.saveRemember(LoginActivity.this, 0);
}
//跳转到菜单
Intent intent = new Intent(LoginActivity.this, MenuActivity.class);
startActivity(intent);
finish();
}
else {
showMessage("error");
etPwd.setText("");
}
}
});
//注册
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String strUsername = etUid.getText().toString();
String strPassword = etPwd.getText().toString();
boolean isNameRepeat = false;
Log.i("syxtest","strUsername="+strUsername+",strPassword="+strPassword);
if(!strUsername.equals("") && !strPassword.equals("")) {
//用户名和密码不能为空
String[] names = new String[10];
if(count > 0) {
for(int i = 0;i < count;i++){
//检测用户名是否已被注册
names[i] = String.valueOf(i);
String name = MySharedPreference.getStringValue(LoginActivity.this, names[i]);
if(name.equals(strUsername)) {
//如果用户名已存在
showMessage("exist");
isNameRepeat = true;
break;
}
}
}
//如果用户名还没有注册
if(!isNameRepeat) {
//键值对:<用户名,密码>
MySharedPreference.register(LoginActivity.this, strUsername, strPassword);
names[count] = String.valueOf(count);
//键值对:<用户号count,用户名>
MySharedPreference.saveNames(LoginActivity.this, names[count], strUsername);
count = count + 1;
//键值对:<count,当前注册人数>
MySharedPreference.saveCount(LoginActivity.this, "count", count);
tips.setText("当前共有"+count+"人注册");
showMessage("success");
}
}
else
showMessage("strnull");
}
});
}
//方法:从SharedPreferences中读取用户的帐号和密码
public void checkIfRemember(){
int i = MySharedPreference.getFlag(LoginActivity.this, "flag");
//如果最近登录的用户勾选了“记住我”,则自动填充用户名和密码
if(i!=0) {
String flag=String.valueOf(i-1);
uidstr=MySharedPreference.getStringValue(LoginActivity.this, flag);
pwdstr=MySharedPreference.getStringValue(LoginActivity.this, uidstr);
etUid.setText(uidstr);
etPwd.setText(pwdstr);
cb.setChecked(true);
}
}
//方法:显示提示信息
public void showMessage(String str) {
if(str.equals("error"))
Toast.makeText(LoginActivity.this, "用户名和密码不匹配!", Toast.LENGTH_SHORT).show();
else if(str.equals("success"))
Toast.makeText(LoginActivity.this, "注册成功!", Toast.LENGTH_SHORT).show();
else if(str.equals("exist"))
Toast.makeText(LoginActivity.this, "当前用户已被注册!", Toast.LENGTH_SHORT).show();
else if(str.equals("strnull"))
Toast.makeText(LoginActivity.this, "用户名或密码为空!", Toast.LENGTH_SHORT).show();
}
}
3 定义登录和注册界面的UI
activity_login.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:background="@drawable/back"
> <!-- 声明垂直分布的线性布局 -->
<TextView
android:id="@+id/TextView0"
android:text="@string/login"
style="@style/title"
android:paddingTop="20dip"
android:paddingBottom="20dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:password="false"
>
</TextView>
<LinearLayout
android:orientation="horizontal"
android:paddingTop="25px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
>
<TextView
android:text="@string/tvUid"
android:layout_width="100px"
style="@style/text"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
/>
<EditText
android:id="@+id/etUid"
android:singleLine="true"
style="@style/edit"
android:layout_width="150px"
android:layout_height="wrap_content"
/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
>
<TextView
android:text="@string/tvPwd"
style="@style/text"
android:layout_width="100px"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
/>
<EditText
android:id="@+id/etPwd"
style="@style/edit"
android:singleLine="true"
android:password="true"
android:layout_width="150px"
android:layout_height="wrap_content"
/>
</LinearLayout>
<!-- 新增加的LinearLayout -->
<LinearLayout
android:orientation="horizontal"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<CheckBox
android:id="@+id/cbRemember"
android:text="@string/cbRemember"
style="@style/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:checked="false"
/>
</LinearLayout>
<LinearLayout
android:paddingTop="20dip"
android:paddingBottom="20dip"
android:paddingRight="20dip"
android:orientation="horizontal"
android:gravity="right"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
> <!-- 声明于显示按钮的线性布局 -->
<TextView
android:id="@+id/tips"
android:alpha="1"
style="@style/tips"
android:gravity="center"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
/>
<Button
android:id="@+id/btnLogin"
android:text="@string/btnLogin"
style="@style/button"
android:minWidth="70dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/btnReg"
android:text="@string/btnReg"
style="@style/button"
android:minWidth="70dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
</LinearLayout>
4 定义UI名称和风格
包含全部UI的名称和风格,在后续功能中不再贴这些代码了
- string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">手机新闻系统开发(syx制作)</string>
<!-- login -->
<string name="login">用户登录</string>
<string name="tvUid">账 号:</string>
<string name="tvPwd">密 码:</string>
<string name="btnLogin">登录</string>
<string name="btnReg">注册</string>
<string name="cbRemember">记住我</string>
<string name="hello_world">Hello world!</string>
<!-- menu -->
<string name="btnAdd">添加新闻</string>
<string name="btnDelete">删除新闻</string>
<string name="btnDel">删除</string>
<string name="btnQuery">快速查询</string>
<string name="btnModify">修改新闻</string>
<string name="btnView">查看</string>
<string name="btnOk">确认</string>
<string name="btnCancel">取消</string>
<string name="dialog_message">确认删除此条新闻吗?</string>
<!-- detail -->
<string name="btnMod">更新</string>
<string name="tvTitle">标题</string>
<string name="tvType">类型</string>
<string name="hintNewsContent">编辑新闻...</string>
<string name="btnBack">返回</string>
<string name="title_activity_query">QueryActivity</string>
<!-- query -->
<string name="btnQuery1">查询</string>
</resources>
- style.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="tips">
<item name="android:textSize">16sp</item>
<item name="android:textColor">#FFB6C1</item>
<item name="android:textStyle">bold</item>
</style>
<style name="button">
<item name="android:textSize">20sp</item>
<item name="android:textColor">#F8F8FF</item>
<item name="android:textStyle">bold</item>
</style>
<style name="title">
<item name="android:textSize">22sp</item>
<item name="android:textColor">#2F4F4F</item>
<item name="android:textStyle">bold</item>
</style>
<style name="text">
<item name="android:textSize">18sp</item>
<item name="android:textColor">#A52A2A</item>
<item name="android:textStyle">bold</item>
</style>
<style name="edit">
<item name="android:textSize">22sp</item>
<item name="android:textColor">#000000</item>
<item name="android:textStyle">bold</item>
</style>
<style name="content">
<item name="android:textSize">16sp</item>
<item name="android:textColor">#003cda</item>
<item name="android:textStyle">bold</item>
</style>
<style name="detailTitle">
<item name="android:textSize">22sp</item>
<item name="android:textColor">#FFFFFF</item>
<item name="android:textStyle">bold</item>
</style>
<style name="query">
<item name="android:textSize">15sp</item>
<item name="android:textColor">#FFFFFF</item>
<item name="android:textStyle">bold</item>
</style>
</resources>