weex 使用 tabbar

2020-07-24 17:59:15 阅读:11 编辑
E:\edison\zhyshop_app\platforms\android\WeexFrameworkWrapper\wxframework\eros-framework\src\main\java\com\eros\framework\adapter\router\DefaultRouterAdapter.java
private MainActivity getTabActivityFromStack(String url) {

        Stack<Activity> activities = RouterTracker.getActivities();
        Log.i("newlog", "activitie length:" + activities.size());
        int size = activities.size();
        for(int i=0; i < size; ++i){
            MainActivity prev_activity = (MainActivity) activities.get(i);
            String  activity_url = prev_activity.getUrl();
            Log.i("newlog", "activitie_url:" + activity_url);
            if (url.equals(activity_url)) {
                return prev_activity;
            }
        }
        return  null;
    }
    private void removeNotTabActivity(String except){
        PlatformConfigBean.TabBar tabBar = BMWXEnvironment.mPlatformConfig.getTabBar();
        List<PlatformConfigBean.TabItem> items = tabBar.getList();
        Stack<Activity> activities = RouterTracker.getActivities();
        int size = activities.size();
        for(int i=0; i < size; ++i){
            MainActivity prev_activity = (MainActivity) activities.get(i);
            String  activity_url = prev_activity.getUrl();
           for(int j =0;j < items.size(); j++){
               PlatformConfigBean.TabItem item = items.get(j);
               String path = item.getPagePath();
               Log.i("newlog", "tab path:" + path);
               if (!path.equals(activity_url) && !activity_url.equals(except)) {
                   RouterTracker.removeActivity(prev_activity);
                   Log.i("newlog", "remove activity_url:" + activity_url);
                   break;
               }
           }
        }
    }
    private void switchTabActivity(String url) {

        Log.i("newlog", "current url:" + url);
        MainActivity prev_activity =(MainActivity) RouterTracker.peekActivity();
        while (prev_activity != null) {
            String  activity_url = prev_activity.getUrl();
            Log.i("newlog", "activity_url:" + activity_url);
            if(!activity_url.equals(url)){
                RouterTracker.removeActivity(prev_activity);
                prev_activity = (MainActivity) RouterTracker.peekActivity();
            }else{
                return;
            }

        }
    }
    private boolean performStartActivity(Activity activity, RouterModel routerModel, String
        bmpageCategory) {
        String pathUrl = routerModel.url;
        if (TextUtils.isEmpty(pathUrl)) return false;
        Uri pathUri = Uri.parse(pathUrl);
        if (!TextUtils.equals("http", pathUri.getScheme()) && !TextUtils.equals("https", pathUri
            .getScheme())) {
            pathUri = Uri.parse(BMWXEnvironment.mPlatformConfig.getUrl().getJsServer() +
                "/dist/js" + pathUrl);
        }
        MainActivity tabActivity = null;
        if (routerModel.gesBack && routerModel.canBack && routerModel.navTitle.equals("00")) {
            tabActivity = getTabActivityFromStack(routerModel.url);
        }
        Log.i("newlog", tabActivity != null ? "hasTabActivity" : "not hasTabActivity");
        if (tabActivity == null) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.putExtra(Constant.ROUTERPARAMS, routerModel);
            intent.setData(pathUri);
            intent.addCategory(bmpageCategory);
            activity.startActivity(intent);

            if (Constant.ACTIVITIES_ANIMATION.ANIMATION_PUSH.equals(routerModel.type)) {
                activity.overridePendingTransition(R.anim.right_in, R.anim.view_stay);
            } else if (Constant.ACTIVITIES_ANIMATION.ANIMATION_PRESENT.equals(routerModel
                .type)) {
                activity.overridePendingTransition(R.anim.bottom_in, R.anim.view_stay);
            } else if (Constant.ACTIVITIES_ANIMATION.ANIMATION_TRANSLATION.equals(routerModel
                .type)) {
                activity.overridePendingTransition(R.anim.left_in, R.anim.view_stay);
            } else {
                activity.overridePendingTransition(R.anim.right_in, R.anim.view_stay);
            }
        }

        if (routerModel.gesBack) {
            Log.i("newlog", "routerModel.gesBack=true");
            Log.i("newlog", routerModel.url);
            //reLaunch
            if (!routerModel.canBack) {
                Activity prev_activity = RouterTracker.peekActivity();
                while (prev_activity != null) {
                    RouterTracker.removeActivity(prev_activity);
                    prev_activity = RouterTracker.peekActivity();
                }
            } else {
                if (routerModel.navTitle.equals("00")) { //switchTab
                    Log.i("newlog", "switchTab");

                    if(tabActivity != null){
                        removeNotTabActivity(routerModel.url);
                        switchTabActivity(routerModel.url);
                    }
                } else {
                    //redirectTo
                    Activity prev_activity = RouterTracker.peekActivity();
                    if (prev_activity != null) {
                        RouterTracker.removeActivity(prev_activity);
                    }
                }

            }
        }
        return true;
    }

E:\edison\zhyshop_app\platforms\android\WeexFrameworkWrapper\wxframework\eros-framework\src\main\java\com\eros\framework\activity\MainActivity.java

 public String getUrl(){
        return routerModel.url;
    }
E:\edison\zhyshop_app\platforms\android\WeexFrameworkWrapper\nexus\nexus\src\main\java\com\eros\framework\adapter\router\RouterTracker.java
  /**
     * 新添加的
     * @return
     */
    public static Stack<Activity> getActivities(){
        if (mTotal.isEmpty()) return null;
        ActivityStackFrame peek = mTotal.peek();
       return peek.getActivities();
    }

JS端

E:\edison\zhyshop_app\src\js\mediator\index.vue
var tabbar = weex.requireModule('bmTabbar');
            var pages = [
              "/pages/home/home", "/base/electricitylist/electricitylist",
                "/pages/mine/mine", "/pages/guest/guest"
            ];
            var lists = [];
            for (var i = 0; i < pages; i++) {
                lists.push({pagePath: "/pages" + pages[i] + ".js"});
            }
            tabbar.setInfo({
                'list': lists
            })
E:\edison\zhyshop_app\src\js\pages\common\wx.js
function routerOpen(options,isSwitchTab) {
    _savePrevPagePath();
    var router = weex.requireModule('bmRouter');
    const currentPageInfo = getUrl(options.name)
    if (!currentPageInfo || !currentPageInfo.url) return
    if (options.navShow === true) {
        //setStorageSync("has_status_bar",0);
        pushPage(currentPageInfo.url, 0);
    } else {
        //  setStorageSync("has_status_bar",1);
        pushPage(currentPageInfo.url, 1);
    }
    let preOptions = {
        url: currentPageInfo.url,
        type: options.type || 'PUSH',
        params: options.params || {},
        canBack: options.canBack != undefined ? options.canBack : false,
        gesBack: options.gesBack || false,
        navShow: options.navShow != undefined ? options.navShow : !!currentPageInfo.title,
        navTitle: options.navTitle != undefined ? options.navTitle : currentPageInfo.title,
        isRunBackCallback: false,
    }
    if(isSwitchTab != undefined){
        preOptions.navTitle = preOptions.navTitle + "  ";
    }
    if (siteinfo.window.navigationBarTextStyle == "black") {
        preOptions.statusBarStyle = "Default";
    } else {
        preOptions.statusBarStyle = "LightContent";
    }
    router.open(preOptions, (data) => {
    })
}
function switchTab(obj) {
   // return reLaunch(obj);
    setStorageSync("w_system_navigation_bar", 0);
    obj = _getUrl(obj);
    var home = siteinfo.app_set.setting.home.replace(/\//g, ".");
    if (obj.name == home) {
        obj.navShow = false;
    } else {
        obj.navShow = true;
        setStorageSync("w_system_navigation_bar", 1);
    }
    obj.statusBarStyle = 'LightContent';
    obj.canBack = true;
    obj.gesBack = true;

    return routerOpen(obj,1);
}

demo

E:\edison\zhyshop_app\src\js\pages\pages\home\home.vue
<template>
    <scroller ref="list" :style="page_style">
        <refresh class="refresh" @refresh="onrefresh" :display="refreshing ?'show':'hide'">
            <text class="indicator-text">正在刷新 ...</text>
            <loading-indicator class="indicator"></loading-indicator>
        </refresh>
        <text @click="click" style="padding:20px;font-size:50px;">跳转第二页</text>
        <text v-for="(num, index) in arr" class="text">这是第 {{num}} 条数据</text>
    </scroller>
</template>
<style scoped>
    .text {
        font-size: 50px;
    }

    .refresh {
        width: 750px;
        position: absolute;
        height: 120px;
        top: 0;
        align-items: center;
    }

    .indicator-text {
        color: #888888;
        font-size: 42px;
        text-align: center;
    }

    .indicator {
        margin-top: 16px;
        height: 40px;
        width: 40px;
        color: blue;
    }
</style>
<script>
    import wx from './../../common/wx'
    import console from './../../common/console'

    export default {
        data() {
            return {
                arr: [],
                refreshing: false
            }
        },
        mixins: [require('./../../common/publish').publish],
        created() {

            this.getData();
        },
        computed: {
            page_style: function () {
                var statusBarHeight = weex.config.eros.statusBarHeight ? weex.config.eros.statusBarHeight : 40;
                return {paddingTop: statusBarHeight};
            }
        },
        methods: {
            click() {
                wx.switchTab({url: "/base/electricitylist/electricitylist"})
            },
            getData() {
                this.arr = [];
                var random = Math.random();
                for (let i = 0; i < 30; i++) {
                    this.arr.push(random + i + 1)
                }
            },
            onrefresh() {
                this.refreshing = true;
                setTimeout(() => {
                    this.getData();
                    this.refreshing = false;
                }, 1000)
            }
        }
    }
</script>
E:\edison\zhyshop_app\src\js\pages\base\electricitylist\electricitylist.vue
<template>
  <scroller ref="list" :style="page_style">
    <refresh class="refresh" @refresh="onrefresh" :display="refreshing ?'show':'hide'">
      <text class="indicator-text">正在刷新 ...</text>
      <loading-indicator class="indicator"></loading-indicator>
    </refresh>
    <text @click="click" style="padding:20px;font-size:50px;">跳转第一页</text>
    <text v-for="(num, index) in arr" class="text">这是第 {{num}} 条数据</text>
  </scroller>
</template>
<style scoped>
  .text {
    font-size: 50px;
  }
  .refresh{
    width: 750px;
    position: absolute;
    height: 120px;
    top: 0;
    align-items: center;
  }
  .indicator-text {
    color: #888888;
    font-size: 42px;
    text-align: center;
  }
  .indicator {
    margin-top: 16px;
    height: 40px;
    width: 40px;
    color: blue;
  }
</style>
<script>
    import wx from './../../common/wx'
    import console from './../../common/console'
    export default {
        data() {
            return {
                arr: [],
                refreshing: false
            }
        },
        mixins: [require('./../../common/publish').publish],
        created() {
            this.getData();
        },
        computed:{
            page_style:function(){
                var statusBarHeight = weex.config.eros.statusBarHeight ? weex.config.eros.statusBarHeight : 40;
                return {paddingTop: statusBarHeight};
            }
        },
        methods: {
            click(){
                wx.switchTab({url:"/pages/home/home"})
            },
            getData(){
                this.arr = [];
                var random = Math.random();
                for (let i = 0; i < 30; i++) {
                    this.arr.push(random + i + 2)
                }
            },
            onrefresh() {
                this.refreshing = true;
                setTimeout(() => {
                    this.getData();
                    this.refreshing = false;
                }, 1000)
            }
        }
    }
</script>