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();
}
}
网友评论