重新构建711的Android项目(一),巧妙的小屏菜单查询框架实现

时间:2022-07-22
本文章向大家介绍重新构建711的Android项目(一),巧妙的小屏菜单查询框架实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

结合前两篇,Android数据库存储模块封装,让操作记录更好用可复用

Android的配置文件操作封装,摒弃SharedPreference操作配置漫天乱飞

至此已经有了数据存储模块和操作配置管理模块。

这里介绍下A711的小屏管理框架实现,让设计出来的小屏界面菜单更简单,更好用。

看过原来A711上的小屏菜单代码,感觉有点儿复杂,不好用。要想用除非得把代码仔细分析一下,看懂才可以。

但是,如果连增加修改一个菜单都要花精力看透代码的话,哪还有精力去搞业务。

菜单这部分操作应该有一简单框架来负责,让增加菜单和改界面变得套用模板即可。

有多简单?有多好用?

先看下最终的实现效果:

//主菜单
//======================================================
    String[] Index_Menu = {
            "终端管理",
            "公交应用",
            "银联应用",
            "其他应用1",
            "其他应用2",
            "其他应用3",
            ""
    };

//一级子菜单
//=======================================================
    String[] Index_Inc_Pos={
            "终端查询",
            "终端设置",
            "红外应用",
            ""
    };

//二级子菜单
//=========================================================
    String[] Index_Inc_PosSet ={
            "系统参数设置",
            "线路票价设置",
            "终端时间设置",
            "终端音量设置",
            ""
    };
    String[] Index_Inc_PosGet ={
            "终端版本查询",
            "参数版本查询",
            ""
    };
    String[] Index_Inc_Bus ={
            "公交未传记录",
            "公交名单查询",
            "公交当班汇总",
            "公交记录汇总",
            "公交明细查询",
            "公交清除密钥",
            ""
    };
/*
 **************************************************************************************************************
 * 需要分级显示的在此定义
 **************************************************************************************************************
*/
    public _MenuDisplay[] MenuDisTab = {
            new _MenuDisplay("进入菜单", Index_Menu),
            new _MenuDisplay("终端管理", Index_Inc_Pos),
            new _MenuDisplay("终端查询", Index_Inc_PosGet),

            new _MenuDisplay("", new String[]{""})
    };

/*
 **************************************************************************************************************
 * 需要支持执行的在此定义
 **************************************************************************************************************
*/
    //菜单执行表
    public _MenuFind[] MenuExeTab = {
            new _MenuFind("终端版本查询",new GetTermInfoVer()),
            new _MenuFind("参数版本查询",new GetSysInfoVer()),


            new _MenuFind("", new Function(){
                @Override
                public void exeFun() {
                    //故意留空,作為結束
                }
            })
    };

看到了吧,增加修改菜单,只需要增加修改字符串就够啦!且支持无限菜单分级。

从这里的定义基本就能看出,菜单的查找都是根据比对字符串而已,因此,原理很简单,实现和使用也就很简单了。

最终把汉字菜单映射到方法的处理中。

最终菜单所要执行的功能在哪?

只需实现这个即可。举例:

//菜单执行表
    public _MenuFind[] MenuExeTab = {
            new _MenuFind("终端版本查询",new GetTermInfoVer()),
            new _MenuFind("参数版本查询",new GetSysInfoVer()),
            new _MenuFind("查未上传记录",new GetUnSendRecNum()),
            new _MenuFind("最近一笔交易",new GetLastRecord()),
            new _MenuFind("最近十笔交易",new GetLast10Record()),
            //在这里添加

            new _MenuFind("", new Function(){
                @Override
                public void exeFun() {
                    //故意留空,作為結束
                }
            })
    };
//=================================================================================
    class GetTermInfoVer implements Function {

        public void exeFun(){
            auxActivity.refreshTopScreen();
            auxActivity.refreshCenterScreen();
            auxActivity.titleTop("终端版本信息");
            //auxScreen.textOut(30, 130, "查询成功");
        }
    }
    class GetSysInfoVer implements Function {

        public void exeFun(){
            auxActivity.refreshTopScreen();
            auxActivity.refreshCenterScreen();
            auxActivity.titleTop("参数版本信息");
            //TODO 
            //完成需要的操作
        }
    }

以下为具体实现:

package com.example.yang.testmvvm.auxscreen;
import android.graphics.Color;

import com.example.yang.testmvvm.utils.DateUtils;
import com.newcapec.jni.AuxScreen;

//==============>>菜单任务处理
/**
 * 菜單框架類
 * created by yangyongzhen 20180810
 * QQ:534117529
 */
public class MenuProc {

    private AuxScreen auxScreen;
    public final int MenuMaxGrade = 4;			//菜单显示的最多级数
    public final int MenuMaxNumber = 50;		//所有菜单的数量
    public final int MenuMaxDisNum = 15;		//一页里的能显示的最大菜单行数,目前此值固定

    interface Function{
        void exeFun();
    }
    //菜单执行
    class _MenuFind {
        String    pDis;
        Function  function;
        public _MenuFind(String pDis,Function  pFunction) {
            this.pDis = pDis;
            this.function = pFunction;
        }
    }

    //菜单显示
    class _MenuDisplay {
        String      pDisDir;
        String[]    pDisFile;
        public _MenuDisplay(String pDisDir, String[] pDisFile) {
            this.pDisDir = pDisDir;
            this.pDisFile = pDisFile;
        }
    }

    //菜单处理
    class __MenuProc {
        public int GradeCout;				    //菜单等级计数
        String[] DisBuf;				//菜单显示当前缓冲区
        int[][] DisCount;				//菜单级计算
        String[] MemoryDisBuf;		//菜单暂存缓冲区

        public __MenuProc() {
            GradeCout = 1;
            DisCount = new int[MenuMaxGrade][2];
            DisBuf = new String[MenuMaxGrade+1];
            MemoryDisBuf = new String[MenuMaxDisNum+1];
        }
    }
    public __MenuProc	menuData;				//菜单处理定义
    public MenuProc(AuxScreen aux) {
        auxScreen = aux;
        menuData = new __MenuProc();
    }

//主菜单
//======================================================
    String[] Index_Menu = {
            "终端管理",
            "公交应用",
            "银联应用",
            "其他应用1",
            "其他应用2",
            "其他应用3",
            ""
    };

//一级子菜单
//=======================================================
    String[] Index_Inc_Pos={
            "终端查询",
            "终端设置",
            "红外应用",
            ""
    };

//二级子菜单
//=========================================================
    String[] Index_Inc_PosSet ={
            "系统参数设置",
            "线路票价设置",
            "终端时间设置",
            "终端音量设置",
            ""
    };
    String[] Index_Inc_PosGet ={
            "终端版本查询",
            "参数版本查询",
            ""
    };
    String[] Index_Inc_Bus ={
            "公交未传记录",
            "公交名单查询",
            "公交当班汇总",
            "公交记录汇总",
            "公交明细查询",
            "公交清除密钥",
            ""
    };
/*
 **************************************************************************************************************
 * 需要分级显示的在此定义
 **************************************************************************************************************
*/
    public _MenuDisplay[] MenuDisTab = {
            new _MenuDisplay("进入菜单", Index_Menu),
            new _MenuDisplay("终端管理", Index_Inc_Pos),
            new _MenuDisplay("终端查询", Index_Inc_PosGet),

            new _MenuDisplay("", new String[]{""})
    };

/*
 **************************************************************************************************************
 * 需要支持执行的在此定义
 **************************************************************************************************************
*/
    //菜单执行表
    public _MenuFind[] MenuExeTab = {
            new _MenuFind("终端版本查询",new GetTermInfoVer()),
            new _MenuFind("参数版本查询",new GetSysInfoVer()),


            new _MenuFind("", new Function(){
                @Override
                public void exeFun() {
                    //故意留空,作為結束
                }
            })
    };

    //刷新中间区域屏幕
    public void refreshCenterScreen() {
        auxScreen.setBgcolor(Color.parseColor("#F2F2F2"));
        auxScreen.clrLine(70, 100);
        auxScreen.setBgcolor(Color.parseColor("#F2F2F2"));
        auxScreen.clrLine(100, 150);
        auxScreen.setBgcolor(Color.parseColor("#F2F2F2"));
        auxScreen.clrLine(150, 200);
        auxScreen.setBgcolor(Color.parseColor("#F2F2F2"));
        auxScreen.clrLine(200, 250);
        auxScreen.setBgcolor(Color.parseColor("#F2F2F2"));
        auxScreen.clrLine(250, 300);
        auxScreen.setBgcolor(Color.parseColor("#F2F2F2"));
        auxScreen.clrLine(300, 319);
    }

    //刷新头部区域
    public void refreshTopScreen() {
        auxScreen.setBgcolor(Color.parseColor("#FFFFFF"));
        auxScreen.clrLine(0, 50);
        auxScreen.setBgcolor(Color.parseColor("#FFFFFF"));
        auxScreen.clrLine(50, 70);
    }
    //头部标题
    public void titleTop(String title) {
        auxScreen.setBgcolor(Color.parseColor("#FFFFFF"));
        auxScreen.setFontSize(25);
        auxScreen.setFgcolor(Color.parseColor("#000000"));

        auxScreen.textOut(22, 25, title);
        refreshTime();
    }
    //刷新日期
    public void refreshTime() {
        auxScreen.setFontSize(22);
        auxScreen.setFgcolor(Color.parseColor("#000000"));
        auxScreen.textOut(300, 25, DateUtils.getDate4());
    }
//=================================================================================
    class GetTermInfoVer implements Function {

        public void exeFun(){
            refreshTopScreen();
            refreshCenterScreen();
            titleTop("交易信息汇总");
            auxScreen.textOut(30, 130, "查询成功");
        }
    }
    class GetSysInfoVer implements Function {

        public void exeFun(){

        }
    }

}