> 文档中心 > 『牛角书』鸿蒙-计算器的实现

『牛角书』鸿蒙-计算器的实现


一,前言

        经过在学校中的鸿蒙学习后,实现一个简易的鸿蒙应用,代码中还有很多不足,有待继续学习。

二,成果展示

        

  三,开发思路

        主要分为计算器的逻辑实现,页面布局。要注意的是计算器应用使用的是自定义的按键,为避免用户在输入数学表达式时,系统自动弹出键盘,本应用在初始化时,会在入口类MainAbility禁止应用弹出软键盘。

1>禁止应用弹出软键盘

public class MainAbility extends Ability {    @Override    public void onStart(Intent intent) { // 禁止软键盘弹出 getWindow().setLayoutFlags(WindowManager.LayoutConfig.MARK_ALT_FOCUSABLE_IM,  WindowManager.LayoutConfig.MARK_ALT_FOCUSABLE_IM); super.onStart(intent); super.setMainRoute(MainAbilitySlice.class.getName());    }}

2>算术逻辑

    public static String getResultString(String exp) { Stack numStack = new Stack(); numStack.push(separateStr); // 数字用,分开,数字栈中,号 为了便于区分小数 Stack oprStack = new Stack(); String[] strings = exp.split(""); for (String singleStr : strings) {     if (isOperator(singleStr)) {  spiltExp(numStack, oprStack, singleStr);     } else {  numStack.push(singleStr);     } } while (!oprStack.isEmpty()) {     combineString(numStack);     compute(numStack, oprStack); } numStack.pop(); String resultValue = numStack.peek(); return resultValue;    }    private static void spiltExp(Stack numStack, Stack oprStack, String singleStr) { // 运算符间的字符拼接成一个数字 combineString(numStack); if (!oprStack.isEmpty()) {     // 先处理优先级高的运算符     while (!oprStack.isEmpty() && priority(singleStr) <= priority(oprStack.peek())) {  combineString(numStack);  compute(numStack, oprStack);     } } oprStack.push(singleStr);    }    private static void compute(Stack numStack, Stack oprStack) { BigDecimal result = null; numStack.pop(); BigDecimal rightNumber = new BigDecimal(numStack.pop()); numStack.pop(); BigDecimal leftNumber = new BigDecimal(numStack.pop()); String operator = oprStack.pop(); switch (operator) {     case "-":  result = leftNumber.subtract(rightNumber);  break;     case "+":  result = leftNumber.add(rightNumber);  break;     case "×":  result = leftNumber.multiply(rightNumber);  break;     case "÷":  result = leftNumber.divide(rightNumber, DECIMAL_DIGIT, BigDecimal.ROUND_HALF_UP);  break;     default:  break; } numStack.push(result.stripTrailingZeros().toPlainString()); numStack.push(separateStr);    }    private static void combineString(Stack stack) { if (separateStr.equals(stack.peek())) {     return; } StringBuilder numberBuilder = new StringBuilder(); while (true) {     String string = stack.peek();     if (separateStr.equals(string)) {  break;     }     numberBuilder.insert(0, string);     stack.pop(); } stack.push(numberBuilder.toString()); stack.push(separateStr); numberBuilder.delete(0, numberBuilder.length());    }

3>页面布局