【商城开发九】登录设计

这次登录篇可是一把辛酸泪啊!简单说一下功能页:首页、分类、购物车、我(个人中心)

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处理,简化了逻辑还容易管理。

猜你喜欢

转载自blog.csdn.net/luckkissmo/article/details/70550666