06登录界面逻辑

需要在登录界面完成下面的功能。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值