美文网首页
2020-12-21

2020-12-21

作者: feng_斩月 | 来源:发表于2020-12-21 22:03 被阅读0次

Android 底部菜单动态配置及刷新机制

主体架构FragmentTabHost+FrameLayout

  • 初始化View
  • setup (Set up the FragmentTabHost to use the given FragmentManager)
  • setOnTabChangedListener
  • setDividerDrawable
  • addTab

注意:
id必须是android:id="@android:id/tabhost",里面的FrameLayout的id必须是android:id="@android:id/tabcontent"

        //注意这里一定要是fragmentArray 个数 防止服务器下发数据有问题导致数组越界
        int count = fragmentArray.size();
        TabSpec tabSpec = null;
        for (int i = 0; i < count; i++) {
            // 将每个fragment绑定到tabhost
            tabSpec = mainTabHost.newTabSpec(menuCodeArray.get(i)).setIndicator(getTabItemView(i));
            Class curFragmentCls = fragmentArray.get(i);
            if (curFragmentCls.isAssignableFrom(WebViewFragment.class)) { 
                //fragment 传递参数 需要再调用
                Bundle bundle = new Bundle();
                bundle.putString("menuCode", tabList.get(i).getMenuCode());
                mainTabHost.addTab(tabSpec, fragmentArray.get(i), bundle);
            }else {
                mainTabHost.addTab(tabSpec, fragmentArray.get(i), null);
            }
            mainTabHost.setTag(i);
        }

Tab菜单更新方式

  • 用户首次启动,加载本地预留一套菜单配置 (菜单ID、菜单图片、菜单地址)
 public MainBottomMenuBean(String menuCode, String lottieJson, String menuUrl) {
        this.menuCode = menuCode;
        this.lottieJson = lottieJson;
        this.menuUrl = menuUrl;
    }
  • 登录首页,获取最新菜单配置
  • 保存远端数据到本地SP
  • 用户冷启动,加载远端缓存数据,注意解析失败需要加载本地数据

更新Tab标签

 private void updateTab() {
        int tabCount = mainTabHost.getTabWidget().getChildCount();
        // 遍历设置选中状态
        for (int i = 0; i < tabCount; i++) {
            mainTabHost.getTabWidget().getChildAt(i).setOnTouchListener(tabTouchListener());
            setSelect(mainTabHost.getTabWidget().getChildAt(i), currentTabPosition == i);
        }
    }

传递参数
例:web页面,通过value获取对应数据

  Bundle bundle = new Bundle();
                bundle.putString("替换自己的KEY", tabList.get(i).getMenuCode());
                mainTabHost.addTab(tabSpec, fragmentArray.get(i), bundle);
   //获取数据 注意在onCreate之前
   String value = getArguments().getString("key");

tabHost点击

  private View.OnTouchListener tabTouchListener() {
        return new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
   if (event.getAction() == MotionEvent.ACTION_DOWN && v.equals(mainTabHost.getCurrentTabView())) {
     }else if (event.getAction() == MotionEvent.ACTION_DOWN) {
                }
 }

设置选中状态
使用Lottie加载动态图片,控制动画的播放和暂停

    private void setSelect(View view, boolean selected) {
        LottieAnimationView lavMenu = view.findViewById(R.id.lav_menu);
        lavMenu.setSelected(selected);
        if (lavMenu.isAnimating()) {
            lavMenu.cancelAnimation();
        }
        lavMenu.setProgress(0f);
        if (selected) {
            lavMenu.playAnimation();
        }
    }

相关文章

网友评论

      本文标题:2020-12-21

      本文链接:https://www.haomeiwen.com/subject/zowdnktx.html