上一贴介绍了简单的欢迎界面后,我们进入了登陆界面的设计
由于我使用的是新浪微博的第三方授权登陆,所以并不需要账号输入框和密码输入框
登陆界面有一个新浪微博logo(imageview)、用户头像(imageview)、用户账号选择(spinner)、登陆按钮(button)、授权按钮(button)
退出按钮(button)、注销账号按钮(button)
布局文件activity_login.xml 如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".LoginActivity" > <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="center" android:orientation="vertical" > <ImageView android:id="@+id/login_logo" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/login_logo" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1.5" android:gravity="center" android:orientation="vertical" > <ImageView android:id="@+id/login_header" android:layout_width="60dp" android:layout_height="60dp" android:layout_gravity="center_horizontal" android:layout_marginTop="10dip" android:src="@drawable/login_user_ic" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="center" android:orientation="vertical" > <Spinner android:id="@+id/login_account" android:layout_height="wrap_content" android:layout_width="fill_parent" android:gravity="center" android:background="@color/white" android:textAlignment="center" android:drawSelectorOnTop = "true" android:prompt="@string/login_spinner_prompt"> </Spinner> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="center" android:orientation="vertical" > <Button android:id="@+id/login_button" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_marginTop="10dip" android:background="@drawable/login_button_n" android:text="@string/login_button" android:textSize="15sp" android:textColor="@color/white" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="bottom" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:id="@+id/login_auth" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/login_button_other" android:layout_weight="1" android:text="@string/login_button_auth" /> <Button android:id="@+id/login_exit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/login_button_other" android:text="@string/login_button_exit" /> <Button android:id="@+id/login_logout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/login_button_other" android:layout_weight="1" android:text="@string/login_button_logout" /> </LinearLayout> </LinearLayout> </LinearLayout>
效果如下图
由于我们要存储用户的账号信息,所以需要建立一个数据库,在android 中我们用的是SQLITE数据库,android提供了一个SQLiteOpenHelper类,让我们很轻易的就可以操作sqlite数据库了。我们需要继承SQLiteOpenHelper,我们需要存储用户的ID,用户名,用户头像url,用户授权认证Token,和Expiresin,
代码如下
package com.xhq.xweibo.logic;
import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class XSqliteHelper extends SQLiteOpenHelper
{
public static final String TB_NAME = "users";
public XSqliteHelper(Context context, String name, CursorFactory factory,
int version)
{
super(context, name, factory, version);
// TODO 自动生成的构造函数存根
}
@Override
public void onCreate(SQLiteDatabase db)
{
// TODO 自动生成的方法存根
Log.d("XSqliteHelper", "create");
String sql;
sql = "CREATE TABLE IF NOT EXISTS " + TB_NAME + "("
+ UserInfo.ID+ " integer primary key autoincrement,"
+ UserInfo.USERID+ " varchar,"
+ UserInfo.TOKEN + " varchar,"
+ UserInfo.USERNAME+ " varchar,"
+ UserInfo.USERICON + " varchar,"
+ UserInfo.USEREXPIRESIN+ " integer" +")";
Log.d("XSqliteHelper", "sql:" + sql);
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
// TODO 自动生成的方法存根
db.execSQL("DROP TABLE IF EXISTS " + TB_NAME);
onCreate(db);
Log.e("XSqliteHelper", "update");
}
public void updateColumn(SQLiteDatabase db, String oldColumn,
String newColumn, String typeColumn)
{
try
{
Log.d("XSqliteHelper", "updatecolum");
db.execSQL("ALTER TABLE " + TB_NAME + " CHANGE " + oldColumn + " "
+ newColumn + " " + typeColumn);
} catch (Exception e)
{
e.printStackTrace();
}
}
}
我们还要一个用户信息类,代码如下:
package com.xhq.xweibo.logic;
import java.io.Serializable;
import android.graphics.drawable.Drawable;
public class UserInfo implements Serializable
{
public static final String ID = "_id";
public static final String USERID = "userId";
public static final String TOKEN = "token";
public static final String USERNAME = "userName";
public static final String USERICON = "userIcon";
public static final String USEREXPIRESIN = "userexpiresin";
private String id;
private String userId;// �û�id
private String token;
private String userName;
private String userIcon;
private Long userexpiresin;
public String getId()
{
return id;
}
public void setId(String id)
{
this.id = id;
}
public String getUserId()
{
return userId;
}
public void setUserId(String userId)
{
this.userId = userId;
}
public String getToken()
{
return token;
}
public void setToken(String token)
{
this.token = token;
}
public String getUserName()
{
return userName;
}
public void setUserName(String userName)
{
this.userName = userName;
}
public String getUserIcon()
{
return userIcon;
}
public void setUserIcon(String userIcon)
{
this.userIcon = userIcon;
}
public void setUserExpiresin(long ei)
{
this.userexpiresin = ei;
}
public long getUserExpiresin()
{
return this.userexpiresin;
}
}
通过XSqliteHelper我们就可以操作数据库了,我们在写一个类来封装XSqliteHelper的操作
代码如下
package com.xhq.xweibo.logic;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.Log;
public class XDBHelper
{
public static final String DB_NAME = "xweibo.db";
public static final int DB_VERSION = 2;
private SQLiteDatabase db;
private XSqliteHelper dbHelper;
public XDBHelper(Context context)
{
Log.d("XDBHelper", "construct");
dbHelper = new XSqliteHelper(context, DB_NAME, null, DB_VERSION);
db = dbHelper.getWritableDatabase();
}
public void Close()
{
Log.d("XDBHelper", "close");
db.close();
dbHelper.close();
}
public List<UserInfo> getUserList(boolean isSimple)
{
Log.d("XDBHelper", "getUserList");
List<UserInfo> userList = new ArrayList<UserInfo>();
Cursor cursor = db.query(XSqliteHelper.TB_NAME, null, null, null, null,
null, UserInfo.ID + " DESC");
cursor.moveToFirst();
while (!cursor.isAfterLast() && (cursor.getString(1)) != null)
{
UserInfo userInfo = new UserInfo();
userInfo.setId(cursor.getString(0));
userInfo.setUserId(cursor.getString(1));
userInfo.setToken(cursor.getString(2));
userInfo.setUserName(cursor.getString(3));
userInfo.setUserIcon(cursor.getString(4));
userInfo.setUserExpiresin(cursor.getLong(5));
userList.add(userInfo);
cursor.moveToNext();
}
cursor.close();
return userList;
}
public boolean haveUserInfo(String userID)
{
Log.d("XDBHelper", "haveuserinfo");
boolean b = false;
Cursor cursor = db.query(XSqliteHelper.TB_NAME, null, UserInfo.USERID
+ "=?", new String[] { userID }, null, null, null);
b = cursor.moveToFirst();
cursor.close();
return b;
}
public int UpdateUserInfo(String userName, Bitmap userIcon, String UserId)
{
Log.d("XDBHelper", "updateuserinfo");
ContentValues values = new ContentValues();
values.put(UserInfo.USERNAME, userName);
// BLOB����
final ByteArrayOutputStream os = new ByteArrayOutputStream();
// ��Bitmapѹ����PNG���룬����Ϊ100%�洢
userIcon.compress(Bitmap.CompressFormat.PNG, 100, os);
// ����SQLite��Content��������Ҳ����ʹ��raw
values.put(UserInfo.USERICON, os.toByteArray());
int id = db.update(XSqliteHelper.TB_NAME, values, UserInfo.USERID
+ "=?", new String[] { UserId });
Log.e("UpdateUserInfo2", id + "");
return id;
}
public int UpdateUserInfo(UserInfo user)
{
Log.d("XDBHelper", "updateuserinfo");
ContentValues values = new ContentValues();
values.put(UserInfo.USERID, user.getUserId());
values.put(UserInfo.TOKEN, user.getToken());
values.put(UserInfo.USEREXPIRESIN, user.getUserExpiresin());
int id = db.update(XSqliteHelper.TB_NAME, values, UserInfo.USERID + "="
+ user.getUserId(), null);
Log.e("UpdateUserInfo", id + "");
return id;
}
// ���users��ļ�¼
public Long SaveUserInfo(UserInfo user)
{
Log.d("XDBHelper", "saveuserinfo");
ContentValues values = new ContentValues();
Log.d(DB_NAME, "userid:" + user.getUserId());
values.put(UserInfo.USERID, user.getUserId());
values.put(UserInfo.TOKEN, user.getToken());
values.put(UserInfo.USERNAME, user.getUserName());
values.put(UserInfo.USERICON, user.getUserIcon());
values.put(UserInfo.USEREXPIRESIN, user.getUserExpiresin());
Long uid = db.insert(XSqliteHelper.TB_NAME, UserInfo.ID, values);
Log.e("SaveUserInfo", uid + "");
return uid;
}
// ���users��ļ�¼
public Long SaveUserInfo(UserInfo user, byte[] icon)
{
Log.d("XDBHelper", "saveuserinfo");
ContentValues values = new ContentValues();
values.put(UserInfo.USERID, user.getUserId());
values.put(UserInfo.USERNAME, user.getUserName());
values.put(UserInfo.TOKEN, user.getToken());
values.put(UserInfo.USEREXPIRESIN, user.getUserExpiresin());
if (icon != null)
{
values.put(UserInfo.USERICON, icon);
}
Long uid = db.insert(XSqliteHelper.TB_NAME, UserInfo.ID, values);
Log.e("SaveUserInfo", uid + "");
return uid;
}
// ɾ��users��ļ�¼
public int DelUserInfo(String UserId)
{
Log.d("XDBHelper", "deleteuserinfo");
int id = db.delete(XSqliteHelper.TB_NAME, UserInfo.USERID + "=?",
new String[] { UserId });
Log.e("DelUserInfo", id + "");
return id;
}
public UserInfo getUserByName(String userName,
List<UserInfo> userList)
{
Log.d("XDBHelper", "getuserbyname");
int size = userList.size();
for (int i = 0; i < size; i++)
{
if (userName.equals(userList.get(i).getUserName()))
{
Log.d("XDBHelper", "getuserbyname +size:" + size);
return userList.get(i);
}
}
return null;
}
}
这样我们就可以存取和获取用户的信息了
package com.xhq.xweibo.logic;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.Log;
public class XDBHelper
{
public static final String DB_NAME = "xweibo.db";
public static final int DB_VERSION = 2;
private SQLiteDatabase db;
private XSqliteHelper dbHelper;
public XDBHelper(Context context)
{
Log.d("XDBHelper", "construct");
dbHelper = new XSqliteHelper(context, DB_NAME, null, DB_VERSION);
db = dbHelper.getWritableDatabase();
}
public void Close()
{
Log.d("XDBHelper", "close");
db.close();
dbHelper.close();
}
public List<UserInfo> getUserList(boolean isSimple)
{
Log.d("XDBHelper", "getUserList");
List<UserInfo> userList = new ArrayList<UserInfo>();
Cursor cursor = db.query(XSqliteHelper.TB_NAME, null, null, null, null,
null, UserInfo.ID + " DESC");
cursor.moveToFirst();
while (!cursor.isAfterLast() && (cursor.getString(1)) != null)
{
UserInfo userInfo = new UserInfo();
userInfo.setId(cursor.getString(0));
userInfo.setUserId(cursor.getString(1));
userInfo.setToken(cursor.getString(2));
userInfo.setUserName(cursor.getString(3));
userInfo.setUserIcon(cursor.getString(4));
userInfo.setUserExpiresin(cursor.getLong(5));
userList.add(userInfo);
cursor.moveToNext();
}
cursor.close();
return userList;
}
public boolean haveUserInfo(String userID)
{
Log.d("XDBHelper", "haveuserinfo");
boolean b = false;
Cursor cursor = db.query(XSqliteHelper.TB_NAME, null, UserInfo.USERID
+ "=?", new String[] { userID }, null, null, null);
b = cursor.moveToFirst();
cursor.close();
return b;
}
public int UpdateUserInfo(String userName, Bitmap userIcon, String UserId)
{
Log.d("XDBHelper", "updateuserinfo");
ContentValues values = new ContentValues();
values.put(UserInfo.USERNAME, userName);
// BLOB����
final ByteArrayOutputStream os = new ByteArrayOutputStream();
// ��Bitmapѹ����PNG���룬����Ϊ100%�洢
userIcon.compress(Bitmap.CompressFormat.PNG, 100, os);
// ����SQLite��Content��������Ҳ����ʹ��raw
values.put(UserInfo.USERICON, os.toByteArray());
int id = db.update(XSqliteHelper.TB_NAME, values, UserInfo.USERID
+ "=?", new String[] { UserId });
Log.e("UpdateUserInfo2", id + "");
return id;
}
public int UpdateUserInfo(UserInfo user)
{
Log.d("XDBHelper", "updateuserinfo");
ContentValues values = new ContentValues();
values.put(UserInfo.USERID, user.getUserId());
values.put(UserInfo.TOKEN, user.getToken());
values.put(UserInfo.USEREXPIRESIN, user.getUserExpiresin());
int id = db.update(XSqliteHelper.TB_NAME, values, UserInfo.USERID + "="
+ user.getUserId(), null);
Log.e("UpdateUserInfo", id + "");
return id;
}
// ���users��ļ�¼
public Long SaveUserInfo(UserInfo user)
{
Log.d("XDBHelper", "saveuserinfo");
ContentValues values = new ContentValues();
Log.d(DB_NAME, "userid:" + user.getUserId());
values.put(UserInfo.USERID, user.getUserId());
values.put(UserInfo.TOKEN, user.getToken());
values.put(UserInfo.USERNAME, user.getUserName());
values.put(UserInfo.USERICON, user.getUserIcon());
values.put(UserInfo.USEREXPIRESIN, user.getUserExpiresin());
Long uid = db.insert(XSqliteHelper.TB_NAME, UserInfo.ID, values);
Log.e("SaveUserInfo", uid + "");
return uid;
}
// ���users��ļ�¼
public Long SaveUserInfo(UserInfo user, byte[] icon)
{
Log.d("XDBHelper", "saveuserinfo");
ContentValues values = new ContentValues();
values.put(UserInfo.USERID, user.getUserId());
values.put(UserInfo.USERNAME, user.getUserName());
values.put(UserInfo.TOKEN, user.getToken());
values.put(UserInfo.USEREXPIRESIN, user.getUserExpiresin());
if (icon != null)
{
values.put(UserInfo.USERICON, icon);
}
Long uid = db.insert(XSqliteHelper.TB_NAME, UserInfo.ID, values);
Log.e("SaveUserInfo", uid + "");
return uid;
}
// ɾ��users��ļ�¼
public int DelUserInfo(String UserId)
{
Log.d("XDBHelper", "deleteuserinfo");
int id = db.delete(XSqliteHelper.TB_NAME, UserInfo.USERID + "=?",
new String[] { UserId });
Log.e("DelUserInfo", id + "");
return id;
}
public void delAllUserInfo()
{
dbHelper.dropTable(db);
}
public void createUserTable()
{
dbHelper.createTable(db);
}
public UserInfo getUserByName(String userName,
List<UserInfo> userList)
{
Log.d("XDBHelper", "getuserbyname");
int size = userList.size();
for (int i = 0; i < size; i++)
{
if (userName.equals(userList.get(i).getUserName()))
{
Log.d("XDBHelper", "getuserbyname +size:" + size);
return userList.get(i);
}
}
return null;
}
}