这次登录篇可是一把辛酸泪啊!简单说一下功能页:首页、分类、购物车、我(个人中心)
PS:想要读懂这边文章需要先看【商城开发七】BaseActivity/BaseFragment篇 【商城开发八】Fragment篇:生命周期和懒加载
老大设计的逻辑是:
1、用户不登录可以直接看 首页和分类,如果点击购物车和我 就跳转登录
2、如果登录成功,进入刚才的fragment,取消登录就返回点击前的fragment
3、如果用户长时间不操作并且在购物车和我(包括里面的子页面),掉线,刷新数据 就跳转登录,逻辑同2。
4、如果用户被挤掉线,刷新数据就跳转登录,逻辑同2。
5、如果用户主动注销,跳转登录页,取消登录和登录成功都跳转首页。
OK逻辑说完了:如果真要这么做就需要用到很多startActivityForResult来回的跳,然后整个代码就看不懂了,之前就是这么设计的,代码完全读不懂。然后就有了这篇文章。
我是这么设计的,思路稍微改变一下,还是用startActivityForResult,不过fragment用MainActivit的startActivityForResult方法,然后切换我(个人中心)fragment的时候 setRequestCode(REQUEST_LOGIN_ME);调用BaseNetActivity的方法,在MainActivit里处理onActivityResult。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//取消登陆
if (resultCode == RESULT_CANCELED && (requestCode == REQUEST_LOGIN_ME || requestCode == REQUEST_LOGIN_CART)) {
index = HOMEPAGE;
getShopTabs().statusChaByPosition(index, currIndex);
getShopTabs().setFilPos(index);
selFrgByPos(index);
}
//点击我的,登陆成功
if (requestCode == REQUEST_LOGIN_ME && resultCode == RESULT_OK) {
index = ME;
selFrgByPos(index);
}
//点击购物车,登陆成功
if (requestCode == REQUEST_LOGIN_CART && resultCode == RESULT_OK) {
index = CART;
selFrgByPos(index);
}
}
inde记录当前的fragment位置, selFrgByPos(index);负责切换。
requestCode :记录是从哪个fragment跳转登录的。
resultCode:判断登录页的状态:RESULT_OK:用户登录成功;RESULT_CANCELED :用户取消登录
下面看登录页的关键代码:
取消登录,监听返回键。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK)) {
MyApplication.isLoad = false;
setResult(RESULT_CANCELED, getIntent());
finish();
return false;
} else {
return super.onKeyDown(keyCode, event);
}
}
MyApplication.isLoad = false;如果是在购物车或者我跳转过来的,取消登录不会形成死循环。
登录成功:成功后刷新购物车或我的数据。
setResult(RESULT_OK, getIntent());
MyApplication.isLoad = true;
finish();
这样fragment就不需要startActivityForResult,把逻辑都拿到MainAcitivty处理,简化了逻辑还容易管理。