博客
关于我
Android:一个通用的底部导航
阅读量:767 次
发布时间:2019-03-24

本文共 3751 字,大约阅读时间需要 12 分钟。

优化后的文章内容

现代应用的底部导航实现方案

在移动应用开发中,底部导航栏作为用户操作的重要组成部分,几乎无处不在。现有的许多底部导航实现方式使得开发者面临繁琐的代码重复工作。为了解决这一问题,我们可以打造一个通用的底部导航解决方案,帮助开发者快速实现个性化的导航功能。

我们的需求

构建一个能够灵活处理任意数量底部导航模块的通用解决方案。无需通过findViewById手动获取导航按钮,点击事件的管理也需自动化处理。

解决方案思路

  • 以 LinearLayout 为外层容器:设定一个最外层的线性布局,作为底部导航的容器。

  • 导航按钮使用 FrameLayout:每个导航按钮使用 FrameLayout 作为容器,以便于统一管理导航按钮的点击状态。

  • 状态管理:点击导航按钮时,统一修改该 FrameLayout 及其所有子控件的状态(启用/禁用),同时也切换其他导航按钮的状态。

  • 减少代码复杂度:通过动态获取导航按钮数量,统一设置点击事件,无需手动为每个导航按钮设置点击处理逻辑。

  • 实现代码

    MainActivity 布局文件

    MainActivity 代码示例

    public class MainActivity extends AppCompatActivity {    @InjectView(R.id.main_bottom_switcher_container)    LinearLayout mainBottomSwitcherContainer;    private List
    fragments = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.inject(this); initFragment(); initMainBottomSwitcher(); } private void initFragment() { fragments.add(new HomeFragment()); fragments.add(new OrderFragment()); fragments.add(new MeFragment()); fragments.add(new MoreFragment()); // 默认打开首页 onClickListener.onClick(mainBottomSwitcherContainer.getChildAt(0)); } private void initMainBottomSwitcher() { int childCount = mainBottomSwitcherContainer.getChildCount(); for (int i = 0; i < childCount; i++) { FrameLayout childAt = (FrameLayout) mainBottomSwitcherContainer.getChildAt(i); childAt.setOnClickListener(onClickListener); } } private View.OnClickListener onClickListener = new View.OnClickListener() { @Override public void onClick(View view) { int index = mainBottomSwitcherContainer.indexOfChild(view); changeUi(index); changeFragment(index); } }; private void changeUi(int index) { int childCount = mainBottomSwitcherContainer.getChildCount(); for (int i = 0; i < childCount; i++) { if (i == index) { setEnable(mainBottomSwitcherContainer.getChildAt(i), false); } else { setEnable(mainBottomSwitcherContainer.getChildAt(i), true); } } } private void changeFragment(int index) { Fragment fragment = fragments.get(index); getSupportFragmentManager() .beginTransaction() .replace(R.id.main_fragment_container, fragment) .commit(); } private void setEnable(View item, boolean b) { if (item instanceof ViewGroup) { ((ViewGroup) item).setEnabled(b); for (int i = 0; i < ((ViewGroup) item).getChildCount(); i++) { View child = ((ViewGroup) item).findViewByIdAt(i); if (child == null) continue; setEnable(child, b); } } else { item.setEnabled(b); } }}

    求索过程

  • 确定需要通用处理的最小单位:采用 FrameLayout 作为每个导航按钮的容器,这样我们可以统一管理所有导航按钮的状态。

  • 动态获取导航按钮数量:通过 mainBottomSwitcherContainer.getChildCount() 获取到所有导航按钮的数量,并遍历进行处理。

  • 设置统一点击事件:为每个导航按钮动态设置点击事件 listeners,无需手动为每个导航按钮设置 listener。

  • 状态切换逻辑:点击某导航按钮时,切换该导航按钮及其所有子控件的启用状态,同时切换其他导航按钮的状态。

  • �益

    这种通用底部导航解决方案具有以下优势:

    • 灵活性:无论底部导航有多少个模块,都能够轻松添加。

    • 代码简洁:通过动态获取导航按钮数量和统一设置点击事件,降低了代码的复杂性。

    • 维护方便:只需复制导航按钮的布局,添加 Fragment 即可,无需手动修改代码。

    • 性能优化:通过递归方式设置控件状态,保证了所有层级的状态都能正确切换。

    运用示例

  • 添加新导航按钮:复制现有导航按钮的布局,修改文字和图片,添加新的 Fragment 即可。

  • 自定义导航按钮样式:通过修改 FrameLayout 及其子控件的属性,实现个性化的导航按钮风格。

  • 状态切换:在 setEnable 方法中,通过传递 b 参数控制导航按钮的启用状态,实现状态切换的逻辑。

  • 这个通用底部导航解决方案不仅提高了开发效率,还为后续的维护和扩展提供了极大的便利。

    转载地址:http://hxikk.baihongyu.com/

    你可能感兴趣的文章
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0_Postgresql和Mysql同时指定库_指定多表_全量同步到Mysql数据库以及Hbase数据库中---大数据之Nifi工作笔记0060
    查看>>
    NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
    查看>>
    NIFI1.21.0最新版本安装_配置使用HTTP登录_默认是用HTTPS登录的_Https登录需要输入用户名密码_HTTP不需要---大数据之Nifi工作笔记0051
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增加修改实时同步_使用JsonPath及自定义Python脚本_03---大数据之Nifi工作笔记0055
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
    查看>>
    NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现update数据实时同步_实际操作05---大数据之Nifi工作笔记0044
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
    查看>>
    NIFI从Oracle11G同步数据到Mysql_亲测可用_解决数据重复_数据跟源表不一致的问题---大数据之Nifi工作笔记0065
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
    查看>>