Android - 底部菜单架构设计及封装实现

 

<?xml version="1.0"encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical" android:layout_width="64px"

    android:layout_height="wrap_content" android:id="@+id/bottom_menu_template_button_id"

    android:background="@drawable/tab_one_normal">

    <ImageView android:id="@+id/bottom_menu_template_img_id"   android:paddingTop="5px"android:layout_gravity="center"

    android:layout_width="wrap_content" android:layout_height="wrap_content"android:src="@drawable/image" />

    <TextView android:layout_width="wrap_content"android:id="@+id/bottom_menu_template_text_id"

       android:layout_height="wrap_content" android:layout_gravity="center"

       android:gravity="center" android:textSize="11sp"android:paddingBottom="5px"  />

</LinearLayout>

 

3.      自定义封装按钮的JAVA类:BottomButton,封装底部菜单按钮的基本信息:图片、文字、按钮事件、是否当前被选中的按钮等。

 

public class BottomButton

{

     // 按钮菜单文字

    private String text;

   

     // 按钮菜单图片

    private int backgroundResource;

   

     // 点击事件。

    private View.OnClickListener clickListener;

   

    // 是否当前已经选中的按钮,如果是则高亮,并且忽略点击事件。

    private boolean isCurrent = false;

4.      自定义底部菜单Layout 类:BottomMenuLayout,该类继承自LinearLayout,用来处理按钮的展示,该类负责以下三件事情:

a)  将底部菜单layout加入到整个大视图页面中。

b)  绑定每一个菜单按钮。

c)  重新计算整个布局的大小,将菜单固定在底部。

 

public class BottomMenuLayout extends LinearLayout {

 

    //实例化layout使用的类   

    private LayoutInflater mInflater;    

 

    //保存菜单按钮的集合,每一个集合元素代表一个按钮,包含了按钮所需要的信息:图片,文字,按键处理事件。

    private List<BottomButton> bottomButtons;   

   

    //封装菜单按钮的布局。

    private View bottomMenuLayout;  

 

    public void processInitButton()

    {

       //初始化布局,将底部菜单layout加入到视图中。

       initLayout(this.getContext());   

      

       //绑定每一个菜单按钮

       bindingButton();                 

 

       //重新计算整个布局的大小,使用整个屏幕的高度减去底部菜单的高度,

       //得出并设置中间页面部分的高度,就能够将菜单固定在底部。

       resizeLayout();                  

    } 

注:这里屏蔽了实现细节,具体参考附件代码。

5.      当以上每一个零散的部分都完成以后,就需要一个组装者,来负责将各个部分组装在一起,使之能够正常运作起来,这里定义一个继承自Activity的类:BaseBottomMenuActivity ,用来充当组装者的角色,开发业务时需要更改方式,原来直接继承自Activity的类改为继承该类。该类主要完成以下工作:

a) 创建出整个大视图页面。

b) 创建出中间内容部分页面,也就是由开发者定义的实际layout内容。并加到整个大视图的页面中来。

c) 创建出底部菜单,并将底部菜单加入到整个大视图的页面中来。

d) 需要得知子类继承该类后,具体使用的layout页面的ID,定义抽象方法由子类实现以提供该ID。

e) 需要得知子类继承该类后,具体需要哪些菜单按钮,定义抽象方法由子类实现以提供按钮的列表。

f) 需要得知子类继承该类后,还需要做哪些页面初始化的工作,定义抽象方法由子类实现以便在页面初始过程中调用。

 

public abstract class BaseBottomMenuActivity extends Activity

{

    private LayoutInflater mInflater;   //实例化layout使用的类   

    protected BottomMenuLayout bottomMenuLayout;   //底部菜单UI部分

    protected View contentView;                   //页面中间UI部分

   

    final protected void onCreate(Bundle savedInstanceState)

    {

       //a) 创建出整个大视图页面。

       //b) 创建出中间内容部分页面,也就是由开发者定义的实际layout内容。并加到整个大视图的页面中来。

        //c) 创建出底部菜单,并将底部菜单加入到整个大视图的页面中来。

    }

   

    /**

     * 子类实现后,在原来的onCreate方法中内容移到这里来操作。

     * @paramsavedInstanceState

     */

    protected abstract void onCreatOverride(Bundle savedInstanceState);

   

    /**

     * 返回layout xml的ID

     * 原本在Activity的onCreate方法中调用的setContentView(R.layout.xxxxLayoutId); 现在从该方法返回。

     * @return

     */

    public abstract int getContentViewLayoutResId();

   

 

    /**

     * 创建底部菜单,需要子类实现,在此方法中,

     * 创建多个BottomButton对象并放置到List中返回即可。

     * 如果需要哪一个按钮当前被选中,则设置BottomButton的isCurrent属性为ture.

     * @param bottomButtons

     * @param bottomMenuLayout

     * @return

     */

    public abstractList<BottomButton> getButtonList(); 

注:这里屏蔽了实现细节,具体参考附件代码。

实现及使用

具体实现代码见附件。

在上述设计的各部分都实现后,就可以进行使用了,使用时,与平常开发正常页面的步骤一样,首先画layout.xml,然后定义activity,进行绑定并配置AndroidManifest.xml文件,不同的地方在于定义的Activity需要继承BaseBottomMenuActivity。并且根据以下步骤开发该Activity:

 1. 在子类中继承实现getButtonList方法,在方法中封装BottomButton对象返回,每一个BottomButton代表一个菜单项,具体属性见BottomButton定义。

2. 在子类中继承实现getContentViewLayoutResId方法,返回layout xml的ID。

3. 在子类中继承实现onCreatOverride方法,原先在onCreat方法中完成的事情挪到这里,super.onCreate(savedInstanceState);和setContentView就不需要调用了。 

测试

让我们来写一个简单的Demo来进行测试,该Demo中,除了底部菜单,只有一个TextView文本,该类继承了BaseBottomMenuActivity:

 

public class Demo extends BaseBottomMenuActivity {

 

    public List<BottomButton> getButtonList() {

       Map<String,String> buttonMaps =  new HashMap<String,String>();

       buttonMaps.put("Menu1", String.valueOf(R.drawable.home));

     buttonMaps.put("Menu2", String.valueOf(R.drawable.home));

     buttonMaps.put("Menu3", String.valueOf(R.drawable.home));

     buttonMaps.put("Menu4", String.valueOf(R.drawable.home));

     buttonMaps.put("主菜单", String.valueOf(R.drawable.home));

 

 

     List<BottomButton>buttons = new ArrayList<BottomButton>();

        Iterator<String> itKey =buttonMaps.keySet().iterator();

        while(itKey.hasNext())

        {

         Stringkey = itKey.next();

         StringvalueRes = buttonMaps.get(key);

         BottomButtononeBottomButton = new BottomButton();

         oneBottomButton.setText(key);

         oneBottomButton.setBackgroundResource(Integer.parseInt(valueRes));

         buttons.add(oneBottomButton);

        }

        return buttons;

    }

 

    public int getContentViewLayoutResId() { return R.layout.main; }

 

    protected void onCreatOverride(Bundle savedInstanceState) { }

在返回按钮的getButtonList方法中,返回了5个按钮。

其布局文件如下:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

七大模块学习资料:如NDK模块开发、Android框架体系架构…

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

里恰好有为什么,不来领取!说不定能改变你现在的状态呢!

由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值