需要在登录界面完成下面的功能。
1.注册和登录按钮的响应的事件
2.用户名改变时,EditText应该监听到,将用户名置为空;
3.onCreate未加载(setContentView)之前,如果用户名和密码均存在,则直接登录到主界面。
4.登录按钮点击的时候弹出AlertDialog,设置nickname.
5.设置完nickname之后,通过startActivityForResult把值传入onActivityResult
分别看下:
注册事件:
/**
* 按钮的点击响应事件
*
* @param view
*/
public void register(View view){
startActivity(new Intent(LoginActivity.this,RegisterActivity.class));
}
登录事件:
public void login(View view) {
if (!CommonUtils.isNetWorkConnected(this)) {
Toast.makeText(LoginActivity.this,
R.string.network_isnot_available, Toast.LENGTH_SHORT)
.show();
return;
}
Intent intent = new Intent(LoginActivity.this, AlertDialog.class);
intent.putExtra("editTextShow", true);// 作用?
intent.putExtra("titleIsCancel", true);// 作用?
intent.putExtra("msg", "请设置当前用户的昵称\n为了ios离线推送不是userid而是nick,详情见注释");
startActivityForResult(intent, REQUEST_CODE_SETNICK);
}
2.用户名改变时,EditText应该监听到,将用户名置为空;此处的代码当时调试的时候,出现了空指针异常,加上判断条件之后,解决了。
usernameEditText = (EditText) findViewById(R.id.username);
passwordEditText = (EditText) findViewById(R.id.password);
if (usernameEditText != null) {
// 如果用户名改变,清空密码
usernameEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
passwordEditText.setText(null);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
3.onCreate未加载(setContentView)之前,如果用户名和密码均存在,则直接登录到主界面。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 如果用户名和密码都有,直接进入主界面
if (IMApplication.getInstance().getUserName() != null
&& IMApplication.getInstance().getPassword() != null) {
autoLogin = true;
startActivity(new Intent(LoginActivity.this, MainActivity.class));
return;
}
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_login);
onActivityResult方法比较长,先分析下他的功能。
1.获取登录的用户名和密码,显示“正在登录”对话框:
IMApplication.currentUserNick = data.getStringExtra("edittext");
final String username = usernameEditText.getText().toString();
final String password = passwordEditText.getText().toString();
if (!TextUtils.isEmpty(username)
&& !TextUtils.isEmpty(password)) {
progressShow = true;
final ProgressDialog pd = new ProgressDialog(
LoginActivity.this);
pd.setCanceledOnTouchOutside(false);
pd.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
progressShow = false;
}
});
pd.setMessage("正在登陆...");
pd.show();
2.EMChatManager实例的登录接口的三个方法的实现:如图:
先看简单的:处理登录失败的:
通过runOnUiThread在主线程中让对话框消失,弹出吐司,代码如下:
@Override
public void onError(int code,
final String message) {
if (!progressShow) {
return;
}
runOnUiThread(new Runnable() {
@Override
public void run() {
pd.dismiss();
Toast.makeText(
getApplicationContext(),
"登录失败:" + message,
Toast.LENGTH_SHORT).show();
}
});
}
登录成功之后,保存下用户名和密码,通过runOnUiThread在UI上通知用户在加载消息列表,
@Override
public void onSuccess() {
if (!progressShow) {
return;
}
// 登陆成功,保存用户名和密码
IMApplication.getInstance().setUserName(
username);
IMApplication.getInstance().setPassword(
password);
runOnUiThread(new Runnable() {
@Override
public void run() {
pd.setMessage("正在获取好友和群聊列表");
}
});
第一次登陆或者之前logout后,加载所有本地群和会话
EMGroupManager.getInstance()
.loadAllGroups();
EMChatManager.getInstance()
.loadAllConversations();
List<String> usernames = EMContactManager
.getInstance()
.getContactUserNames();
Log.i(TAG, usernames.size() + "");
Map<String, User> userlist = new HashMap<String, User>();
for (String username : usernames) {
User user = new User();
user.setUsername(username);
setUserHeader(username, user);
userlist.put(username, user);
}
// 添加user"申请与通知"
User newFriends = new User();
newFriends
.setUsername(Constant.NEW_FRIENDS_USERNAME);
newFriends.setNick("申请与通知");
newFriends.setHeader("");
userlist.put(
Constant.NEW_FRIENDS_USERNAME,
newFriends);
// 添加群聊
User groupUser = new User();
groupUser
.setUsername(Constant.GROUP_USERNAME);
groupUser.setNick("群聊");
groupUser.setHeader("");
userlist.put(Constant.GROUP_USERNAME,
groupUser);
// 存入内存
IMApplication.getInstance()
.setContactList(userlist);
// 存入db
UserDao dao = new UserDao(
LoginActivity.this);
List<User> users = new ArrayList<User>(
userlist.values());
dao.saveContactList(users);
// 获取群聊列表(群聊只有groupid和groupname的简单信息)
EMGroupManager.getInstance()
.getGroupsFromServer();
} catch (Exception e) {
e.printStackTrace();
}
boolean updatenick = EMChatManager
.getInstance()
.updateCurrentUserNick(
IMApplication.currentUserNick);
if (!updatenick) {
Log.e(TAG,
"update current user nick fail");
}
if (!LoginActivity.this.isFinishing()) {
pd.dismiss();
}
跳转:
// 进入主界面
startActivity(new Intent(
LoginActivity.this,
MainActivity.class));
finish();
全部的代码:
package com.dy.ustc.im.ui;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.dy.ustc.im.Constant;
import com.dy.ustc.im.R;
import com.dy.ustc.im.application.IMApplication;
import com.dy.ustc.im.db.UserDao;
import com.dy.ustc.im.domain.User;
import com.dy.ustc.im.utils.CommonUtils;
import com.easemob.EMCallBack;
import com.easemob.chat.EMChatManager;
import com.easemob.chat.EMContactManager;
import com.easemob.chat.EMGroupManager;
import com.easemob.chat.core.g;
import com.easemob.exceptions.EaseMobException;
import com.easemob.util.HanziToPinyin;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.EditText;
import android.widget.Toast;
public class LoginActivity extends BaseActivity {
public static final int REQUEST_CODE_SETNICK = 1;
protected static final String TAG = "LoginActivity";
private boolean progressShow;
private EditText usernameEditText;
private EditText passwordEditText;
private boolean autoLogin = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 如果用户名和密码都有,直接进入主界面
if (IMApplication.getInstance().getUserName() != null
&& IMApplication.getInstance().getPassword() != null) {
autoLogin = true;
startActivity(new Intent(LoginActivity.this, MainActivity.class));
return;
}
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_login);
usernameEditText = (EditText) findViewById(R.id.username);
passwordEditText = (EditText) findViewById(R.id.password);
if (usernameEditText != null) {
// 如果用户名改变,清空密码
usernameEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
passwordEditText.setText(null);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
}
public void login(View view) {
if (!CommonUtils.isNetWorkConnected(this)) {
Toast.makeText(LoginActivity.this,
R.string.network_isnot_available, Toast.LENGTH_SHORT)
.show();
return;
}
Intent intent = new Intent(LoginActivity.this, AlertDialog.class);
intent.putExtra("editTextShow", true);// 作用?
intent.putExtra("titleIsCancel", true);// 作用?
intent.putExtra("msg", "请设置当前用户的昵称\n为了ios离线推送不是userid而是nick,详情见注释");
startActivityForResult(intent, REQUEST_CODE_SETNICK);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == REQUEST_CODE_SETNICK) {
IMApplication.currentUserNick = data.getStringExtra("edittext");
final String username = usernameEditText.getText().toString();
final String password = passwordEditText.getText().toString();
if (!TextUtils.isEmpty(username)
&& !TextUtils.isEmpty(password)) {
progressShow = true;
final ProgressDialog pd = new ProgressDialog(
LoginActivity.this);
pd.setCanceledOnTouchOutside(false);
pd.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
progressShow = false;
}
});
pd.setMessage("正在登陆...");
pd.show();
EMChatManager.getInstance().login(username, password,
new EMCallBack() {
@Override
public void onSuccess() {
if (!progressShow) {
return;
}
// 登陆成功,保存用户名和密码
IMApplication.getInstance().setUserName(
username);
IMApplication.getInstance().setPassword(
password);
runOnUiThread(new Runnable() {
@Override
public void run() {
pd.setMessage("正在获取好友和群聊列表");
}
});
try {
// 第一次登陆或者之前logout后,加载所有本地群和会话
EMGroupManager.getInstance()
.loadAllGroups();
EMChatManager.getInstance()
.loadAllConversations();
List<String> usernames = EMContactManager
.getInstance()
.getContactUserNames();
Log.i(TAG, usernames.size() + "");
Map<String, User> userlist = new HashMap<String, User>();
for (String username : usernames) {
User user = new User();
user.setUsername(username);
setUserHeader(username, user);
userlist.put(username, user);
}
// 添加user"申请与通知"
User newFriends = new User();
newFriends
.setUsername(Constant.NEW_FRIENDS_USERNAME);
newFriends.setNick("申请与通知");
newFriends.setHeader("");
userlist.put(
Constant.NEW_FRIENDS_USERNAME,
newFriends);
// 添加群聊
User groupUser = new User();
groupUser
.setUsername(Constant.GROUP_USERNAME);
groupUser.setNick("群聊");
groupUser.setHeader("");
userlist.put(Constant.GROUP_USERNAME,
groupUser);
// 存入内存
IMApplication.getInstance()
.setContactList(userlist);
// 存入db
UserDao dao = new UserDao(
LoginActivity.this);
List<User> users = new ArrayList<User>(
userlist.values());
dao.saveContactList(users);
// 获取群聊列表(群聊只有groupid和groupname的简单信息)
EMGroupManager.getInstance()
.getGroupsFromServer();
} catch (Exception e) {
e.printStackTrace();
}
boolean updatenick = EMChatManager
.getInstance()
.updateCurrentUserNick(
IMApplication.currentUserNick);
if (!updatenick) {
Log.e(TAG,
"update current user nick fail");
}
if (!LoginActivity.this.isFinishing()) {
pd.dismiss();
}
// 进入主界面
startActivity(new Intent(
LoginActivity.this,
MainActivity.class));
finish();
}
@Override
public void onProgress(int arg0, String arg1) {
}
@Override
public void onError(int code,
final String message) {
if (!progressShow) {
return;
}
runOnUiThread(new Runnable() {
@Override
public void run() {
pd.dismiss();
Toast.makeText(
getApplicationContext(),
"登录失败:" + message,
Toast.LENGTH_SHORT).show();
}
});
}
});
}
}
}
}
/**
* 按钮的点击响应事件
*
* @param view
*/
public void register(View view){
startActivity(new Intent(LoginActivity.this,RegisterActivity.class));
}
@Override
protected void onResume() {
super.onResume();
if (autoLogin) {
return;
}
if (IMApplication.getInstance().getUserName() != null) {
usernameEditText.setText(IMApplication.getInstance().getUserName());
}
}
protected void setUserHeader(String username, User user) {
String headername = null;
if (!TextUtils.isEmpty(user.getNick())) {
headername = user.getNick();
} else {
headername = user.getUsername();
}
if (username.equals(Constant.NEW_FRIENDS_USERNAME)) {
user.setHeader("");
} else if (Character.isDigit(headername.charAt(0))) {
user.setHeader("#");
} else {
user.setHeader(HanziToPinyin.getInstance()
.get(headername.substring(0, 1)).get(0).target.substring(0,
1).toUpperCase());
char header = user.getHeader().toLowerCase().charAt(0);
if (header < 'a' || header > 'z') {
user.setHeader("#");
}
}
}
}
运行的效果:
下面讲AlertDialog和注册的Activity。
2014.11.27