在前面完成了数据库操作、异步图片加载和缓存、新浪微博认证后,就可以进行登录界面的功能开发了,登录界面功能代码如下:

package com.xhq.xweibo.ui;import java.util.ArrayList;
import java.util.List;import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuth;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.net.AsyncWeiboRunner;
import com.sina.weibo.sdk.net.RequestListener;
import com.sina.weibo.sdk.net.WeiboParameters;
import com.sina.weibo.sdk.constant.WBConstants;
import com.sina.weibo.sdk.openapi.UsersAPI;
import com.sina.weibo.sdk.openapi.models.User;
import com.sina.weibo.sdk.exception.WeiboException;
import com.sina.weibo.sdk.utils.LogUtil;
import com.sina.weibo.sdk.utils.UIUtils;import com.xhq.common.AsyncImageLoader;
import com.xhq.common.ImageUtil;
import com.xhq.common.NetUtil;
import com.xhq.xweibo.logic.Constants;
import com.xhq.xweibo.logic.CurUserKeeper;
import com.xhq.xweibo.logic.UserInfo;
import com.xhq.xweibo.logic.XDBHelper;
import com.xhq.xweibo.R;import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.Toast;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;public class LoginActivity extends Activity
{private static final String TAG = "LoginActivity";private static final String WEIBO_DEMO_APP_SECRET = "4e47e691a516afad0fc490e05ff70ee5";private static final String OAUTH2_ACCESS_TOKEN_URL = "https://open.weibo.cn/oauth2/access_token";// UI references.private static ImageView mHeaderView;private static Spinner mAccountView;private static Button mLoginBotton;private static Button mAuthBotton;private static Button mExitBotton;private static Button mLogoutBotton;private static ProgressDialog pd;private static XDBHelper mDBHelper;private static List<UserInfo> mUserList;private static UserInfo mCurUser;private ArrayAdapter<String> mAdapter;private List<String> mUserNameList;private static long m_nExitTime;private AsyncImageLoader  mImageLoader;private AsyncImageLoader.onLoadCompleteListener mLoadCompleteListener;private WeiboAuth mWeiboAuth;private String mCode;private Oauth2AccessToken mAccessToken;private UsersAPI mUsersAPI;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);//this.requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_login);// Set up the login form.mHeaderView = (ImageView) findViewById(R.id.login_header);mAccountView = (Spinner) findViewById(R.id.login_account);mLoginBotton = (Button) findViewById(R.id.login_button);mAuthBotton = (Button) findViewById(R.id.login_auth);mExitBotton = (Button) findViewById(R.id.login_exit);mLogoutBotton = (Button) findViewById(R.id.login_logout);mImageLoader = new AsyncImageLoader(this.getApplicationContext());mDBHelper = new XDBHelper(LoginActivity.this);mUserNameList = new ArrayList<String>();mAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, mUserNameList);initUser();mLoginBotton.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View view){CharSequence error;if (mUserList.isEmpty()){error = getString(R.string.login_error_noneaccount);Toast.makeText(LoginActivity.this, error, Toast.LENGTH_LONG).show();} else{if (mCurUser != null){  pd = new ProgressDialog(LoginActivity.this);pd.setMessage("登录服务器....");pd.show();CurUserKeeper.saveCurUser(getApplicationContext(), mCurUser);Intent it = new Intent();it.setClass(LoginActivity.this, TabHostActivity.class);startActivity(it);pd.dismiss();finish();}else{Toast.makeText(getApplicationContext(), "无用户账号", Toast.LENGTH_SHORT).show();}}}});mAuthBotton.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){mWeiboAuth = new WeiboAuth(LoginActivity.this,Constants.APP_KEY, Constants.REDIRECT_URL,Constants.SCOPE);mWeiboAuth.authorize(new AuthListener(),WeiboAuth.OBTAIN_AUTH_CODE);}});mExitBotton.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){// TODO 自动生成的方法存根finish();System.exit(0);}});mLogoutBotton.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){}});}@Overrideprotected void onResume(){// TODO Auto-generated method stubsuper.onResume();init();}public boolean onKeyDown(int keyCode, KeyEvent event){if (keyCode == KeyEvent.KEYCODE_BACK&& event.getAction() == KeyEvent.ACTION_DOWN){if ((System.currentTimeMillis() - m_nExitTime) > 2000) //{Toast.makeText(getApplicationContext(), "再按一次退出程序",Toast.LENGTH_SHORT).show();m_nExitTime = System.currentTimeMillis();} else{finish();System.exit(0);}return true;}return super.onKeyDown(keyCode, event);}public void initUser(){Log.d(TAG, "initUser");mDBHelper.createUserTable();mUserList = mDBHelper.getUserList(false);if (!mUserList.isEmpty()){// 获取用户名列表,并关联到spinner控件for (UserInfo ui : mUserList){mUserNameList.add(ui.getUserName());}mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);mAccountView.setAdapter(mAdapter);mAccountView.setOnItemSelectedListener(new SpinnerSelectedListener());// 获取最近登录的用户SharedPreferences sp = getSharedPreferences("lastUser",Activity.MODE_PRIVATE);String name = sp.getString("lastUser", "");if (name != ""){mAccountView.setSelection(mUserNameList.indexOf(name), true);} else{mAccountView.setSelection(0, true);}} else{Log.d(TAG, "Have 0 user");}}public void init(){Log.d(TAG, "init");Intent it = new Intent("com.xhq.xweibo.logic.XService");startService(it);}public void fetchTokenAsync(String authCode, String appSecret){WeiboParameters requestParams = new WeiboParameters();requestParams.put(WBConstants.AUTH_PARAMS_CLIENT_ID, Constants.APP_KEY);requestParams.put(WBConstants.AUTH_PARAMS_CLIENT_SECRET, appSecret);requestParams.put(WBConstants.AUTH_PARAMS_GRANT_TYPE,"authorization_code");requestParams.put(WBConstants.AUTH_PARAMS_CODE, authCode);requestParams.put(WBConstants.AUTH_PARAMS_REDIRECT_URL,Constants.REDIRECT_URL);// 异步请求,获取 TokenAsyncWeiboRunner.requestAsync(OAUTH2_ACCESS_TOKEN_URL, requestParams,"POST", new RequestListener(){@Overridepublic void onComplete(String response){LogUtil.d(TAG, "Response: " + response);Oauth2AccessToken token = Oauth2AccessToken.parseAccessToken(response);if (token != null && token.isSessionValid()){LogUtil.d(TAG, "Success! " + token.toString());mCurUser = new UserInfo();mAccessToken = token;mCurUser.setUserId(mAccessToken.getUid());mCurUser.setToken(mAccessToken.getToken());mCurUser.setUserExpiresin(mAccessToken.getExpiresTime());mUsersAPI = new UsersAPI(mAccessToken);long uid = Long.parseLong(mAccessToken.getUid());mUsersAPI.show(uid, mListener);} else{LogUtil.d(TAG, "Failed to receive access token");}}@Overridepublic void onWeiboException(WeiboException e){LogUtil.e(TAG, "onWeiboException: " + e.getMessage());Toast.makeText(LoginActivity.this, "获取Token失败",Toast.LENGTH_SHORT).show();}});}/*** 微博 OpenAPI 回调接口。*/private RequestListener mListener = new RequestListener(){@Overridepublic void onComplete(String response){if (!TextUtils.isEmpty(response)){LogUtil.i(TAG, response);User user = User.parse(response);if (user != null){LogUtil.d(TAG, "Success to get screen_name: "+ user.screen_name);mCurUser.setUserName(user.screen_name);mCurUser.setUserIcon(user.profile_image_url);                 mDBHelper.SaveUserInfo(mCurUser);initUser();mImageLoader.loadImage(mHeaderView,user.profile_image_url, mLoadCompleteListener);} else{Toast.makeText(LoginActivity.this, response,Toast.LENGTH_LONG).show();}}}@Overridepublic void onWeiboException(WeiboException e){LogUtil.e(TAG, e.getMessage());}};class SpinnerSelectedListener implements OnItemSelectedListener{public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,long arg3){Log.d("LoginActivity", "spinner item selected");mCurUser = mDBHelper.getUserByName(mUserNameList.get(arg2),mUserList);if (null != mCurUser){mImageLoader.loadImage(mHeaderView,mCurUser.getUserIcon(), new AsyncImageLoader.onLoadCompleteListener(){@Overridepublic void onLoadSuccess(View view, Bitmap bmp, String url){// TODO 自动生成的方法存根((ImageView)view).setImageDrawable(ImageUtil.BMP2Drawable(bmp));}@Overridepublic void onLaodFail(View view, String url){// TODO 自动生成的方法存根((ImageView)view).setImageResource(R.drawable.login_user_ic);}});}}public void onNothingSelected(AdapterView<?> arg0){}}class AuthListener implements WeiboAuthListener{@Overridepublic void onComplete(Bundle values){if (null == values){Toast.makeText(LoginActivity.this, "授权失败", Toast.LENGTH_SHORT).show();return;}String code = values.getString("code");if (TextUtils.isEmpty(code)){Toast.makeText(LoginActivity.this, "授权失败", Toast.LENGTH_SHORT).show();return;}LogUtil.d(TAG, "Success to get code");mCode = code;fetchTokenAsync(mCode, WEIBO_DEMO_APP_SECRET);}@Overridepublic void onCancel(){Toast.makeText(LoginActivity.this, "授权取消", Toast.LENGTH_LONG).show();}@Overridepublic void onWeiboException(WeiboException e){UIUtils.showToast(LoginActivity.this,"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG);}}}

主要逻辑如下:

(1)初始化:登录界面载入时,先到数据库中取出用户列表,把用户名加入到Spinner中,然后通过 SharedPreferences 获取最近登录过的用户,

SharedPreferences sp = getSharedPreferences("lastUser",Activity.MODE_PRIVATE);
                        String name = sp.getString("lastUser", "");

然后让Spinner选中相应的用户,然后在SpinnerSelectedListener  中保存获取当前用户信息,异步加载用户头像。
(2)添加授权: 点击添加授权按钮后,就进入授权界面了,获取到code后,再获取token,然后保存用户的相应信息到数据库,然后把当前用户选择为刚刚授权成功的账号。

(3)退出  :点击退出按钮直接退出程序或者在2秒内点击返回键。

(4)注销账号:功能还没实现。

(5)登录 :点击登录按钮后就会进入到微博的主界面了。

仿新浪微博2014之登陆界面四(总体功能)相关推荐

  1. 仿新浪微博2014之登陆界面一(sqlite操作)

    上一贴介绍了简单的欢迎界面后,我们进入了登陆界面的设计 由于我使用的是新浪微博的第三方授权登陆,所以并不需要账号输入框和密码输入框 登陆界面有一个新浪微博logo(imageview).用户头像(im ...

  2. 新浪微博发布文章html,JS实现仿新浪微博发布内容为空时提示功能代码

    本文实例讲述了JS实现仿新浪微博发布内容为空时提示功能.分享给大家供大家参考.具体如下: 这里使用JavaScript模拟新浪微博的一个功能,在发布微博的内容为空时,文本框提醒用户这里没有输入内容,本 ...

  3. 仿果壳网手机登陆界面源代码

    这是效果 代码如下所示: <head><title>仿果壳网html5手机登陆界面源代码模板-懒人模板[http://www.lanrenmb.com/zt/]</tit ...

  4. 仿新浪微博滚动,无文字渐显功能

    又一款仿新浪微博的文字滚动功能,去掉了滚动开始时候的文字渐显效果,似乎更明淅了,又一种风格的新浪微博大厅文字滚动,要的就复制代码吧. <!DOCTYPE HTML> <html la ...

  5. .Net语言 APP开发平台——Smobiler学习日志:仿12306的APP登陆界面

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的"S ...

  6. 仿QQ概念版的登陆界面

    先上图 实现了太阳的转动,云的飘动,叶子的摆动,以及彩虹由左到右的出现. 代码很简单,动画直接看代码,很好理解 以下是全部代码(表示不会上传文件啊啊啊啊啊~~) <Window x:Class= ...

  7. 如何使用MFC编写自定义UI界面【附高仿QQ 2014登陆界面范例程序】

    地址: http://blog.csdn.net/hujkay作者:Jekkay Hu(34538980@qq.com)关键词:MFC, 编写异行窗体,自定义UI控件,VC++,异形控件,高仿QQ登陆 ...

  8. Android仿新浪微博弹出界面动画,Android仿新浪微博启动界面或登陆界面(1)

    本文为大家分享了Android模仿新浪微博启动界面&登陆界面的具体实现代码,供大家参考,具体内容如下 启动界面 主要有两个功能: 1.加载启动动画 2.判断网络,有者直接进入登陆界面,否则去设 ...

  9. Android仿QQ微信开场导航以及登陆界面

    相信大家对于微信等社交应用的UI界面已经都很熟悉了,该UI最值得借鉴的莫过于第一次使用的时候一些列产品介绍的图片,可以左右滑动浏览,最后进入应用,这一效果适用于多种项目中,相信今后开发应用一定会用得到 ...

最新文章

  1. 惠斯通电桥信号调理芯片_用惠斯通电桥测电阻
  2. 为什么只有128KB的魂斗罗,可以那么长的剧情?
  3. 全局唯一递增的id_分布式ID生成方法-趋势有序的全局唯一ID
  4. SQL语句来查询今天、昨天、7天内、30天的数据,经典!
  5. angularJs select绑定的model 取不到值
  6. LeetCode 769. 最多能完成排序的块
  7. 陌生人交友IM即时聊天系统-得推交友系统v3.0源码
  8. iOS项目的完整重命名方法图文教程
  9. java语音播放事例
  10. 专访徐勇州:腾讯云全球化布局势如破竹,构建全球24小时无差别服务︱大咖访谈录...
  11. Android Studio简介
  12. c4d打开没反应_(图文+视频)C4D野教程:总结四种制作漩涡样条的方法
  13. 如何在Nintendo交换机上设置家长控制
  14. Html之 图像标记
  15. 我的世界 服务器 无限载入地形,我的世界:奇特地形被官方隐藏,群系无限重复,你能发现规律吗?...
  16. Help Hanzo LightOJ - 1197
  17. java怎么比较两个list是否相同?
  18. 《ZigBee开发笔记》第五部分 外设篇 - 基础实验 第4章 CC2530热释电红外传感器
  19. [羊城杯 2020]easyre
  20. 计算机系统里绘图基本操作,计算机的基本操作

热门文章

  1. macbook 最小化程序
  2. 岭南学院python课程作业5-2
  3. C++ Armadillo矩阵库的安装与基本用法
  4. 纪念币收藏价值和含义
  5. 常用网络图片url地址
  6. Redis安装、配置与相关优化
  7. 外企面试最常见的八大英文问题
  8. 如何禁用新浪直播插件
  9. 基于PHP+MySQL的健身俱乐部网站的设计与实现
  10. layui 点击保存延迟几秒跳转页面