今天跟着bilibili的教程,参考了网上的一些资料,实现了计算器app的基本逻辑部分,实际上需要细化的还用很多,但只是个练习,就不抠细节部分了,只是熟悉掌握按键互动的一些基本命令。 packagecom。example。importandroid。graphics。drawable。Dimportandroid。os。Bimportandroid。util。Limportandroid。view。Vimportandroid。widget。Bimportandroid。widget。TextVimportandroidx。appcompat。app。AppCompatAimportjava。util。LinkedLimportjava。util。SpublicclassCalculatorActivityextendsAppCompatActivity{privateButtonbtn0;privateButtonbtn1;privateBprivateButtonbtn2;privateButtonbtn3;privateButtonbtn4;privateButtonbtn5;privateButtonbtn6;privateButtonbtn7;privateButtonbtn8;privateButtonbtn9;privateBprivateBprivateBprivateBprivateBprivateBprivateBprivateB清除一个数字privateBprivateTextV算数表达式privateTextV计算结果判断是否是新的计算开始OverrideprotectedvoidonCreate(BundlesavedInstanceState){super。onCreate(savedInstanceState);setContentView(R。layout。activitycalculator);控制button上图标大小btnsqrtfindViewById(R。id。sqrt);Drawabledrawable1getResources()。getDrawable(R。drawable。kaifang);drawable1。setBounds(20,20,100,100);第一0是距左边距离,第二0是距上边距离,40分别是长宽btnsqrt。setCompoundDrawables(drawable1,null,null,null);只放左边计算结果tvresultfindViewById(R。id。resulttext);tvnumcalculatefindViewById(R。id。numcalculate);每个按钮注册监听btn0findViewById(R。id。zero);btn1findViewById(R。id。one);btn2findViewById(R。id。two);btn3findViewById(R。id。three);btn4findViewById(R。id。four);btn5findViewById(R。id。five);btn6findViewById(R。id。six);btn7findViewById(R。id。seven);btn8findViewById(R。id。eight);btn9findViewById(R。id。nine);btnpointfindViewById(R。id。point);btnplusfindViewById(R。id。plus);btnminusfindViewById(R。id。minus);btnmultiplyfindViewById(R。id。multiply);btnpidefindViewById(R。id。pide);btndelfindViewById(R。id。del);倒数btnequalfindViewById(R。id。equal);等于btncefindViewById(R。id。CEbtn);回退btnclearfindViewById(R。id。clear);清除btn0。setOnClickListener(ClickFn);btn1。setOnClickListener(ClickFn);btn2。setOnClickListener(ClickFn);btn3。setOnClickListener(ClickFn);btn4。setOnClickListener(ClickFn);btn5。setOnClickListener(ClickFn);btn6。setOnClickListener(ClickFn);btn7。setOnClickListener(ClickFn);btn8。setOnClickListener(ClickFn);btn9。setOnClickListener(ClickFn);btnpoint。setOnClickListener(ClickFn);btnplus。setOnClickListener(ClickFn);btnminus。setOnClickListener(ClickFn);btnmultiply。setOnClickListener(ClickFn);btnpide。setOnClickListener(ClickFn);btnsqrt。setOnClickListener(ClickFn);btndel。setOnClickListener(ClickFn);btnequal。setOnClickListener(ClickFn);btnce。setOnClickListener(ClickFn);btnclear。setOnClickListener(ClickFn);}privateView。OnClickListenerClickFnnewView。OnClickListener(){privatestaticfinalStringTAGCalculatorAOverridepublicvoidonClick(Viewview){Stringinputtexttvnumcalculate。getText()。toString();if(isnewcalculateview。getId()!R。id。equal){tvresult。setText(0);tvnumcalculate。setText(inputtext);}tvresult。setTextSize(30);switch(view。getId()){caseR。id。zero:caseR。id。one:caseR。id。two:caseR。id。three:caseR。id。four:caseR。id。five:caseR。id。six:caseR。id。seven:caseR。id。eight:caseR。id。nine:inputtextinputtext((Button)view)。getText()。toString();tvnumcalculate。setText(inputtext);caseR。id。sqrt:;caseR。id。point:caseR。id。plus:caseR。id。minus:caseR。id。multiply:caseR。id。pide:不允许连续输入多个运算符if(inputtext!null!inputtext。equals()){charcinputtext。charAt(inputtext。length()1);if((byte)c41(byte)c48c。equals()){acsii的4247为,。Stringcinputtext。substring(inputtext。length()1);if(c。equals()c。equals()c。equals()c。equals()c。equals(。)c。equals()){判断如果两次按的都是运算符,取最后一个运算符tvnumcalculate。setText(inputtext。substring(0,inputtext。length()1)((Button)view)。getText());}else{判断如果第两次按不是运算符,直接按字符串累加tvnumcalculate。setText(inputtext((Button)view)。getText());}}caseR。id。del:if(inputtext!null!inputtext。equals()){inputtextinputtext。substring(0,inputtext。length()1);tvnumcalculate。setText(inputtext);}caseR。id。CEbtn:第一次ac清空calculate,第二次清空resultif(inputtext。equals()){calculate为空则清空计算结果tvresult。setText(0);}tvnumcalculate。setText(inputtext);caseR。id。clear:tvresult。setText(0);tvnumcalculate。setText(inputtext);caseR。id。equal:按时进行,tvnumcalculate为结果值tvresult。setTextSize(40);if(inputtextnullinputtext。equals()){tvresult。setText(0);}else{tvresult。setText(inputtext);每输入一次数字后就进行计算tvresult。setText(getResult(inputtext));}default:}Log。d(TAG,onClick:inputtext);}privateStringgetResult(Stringinputtext){if(inputtextnullinputtext。equals()){}如果不为空,先判断末尾是否是符号,如果是符号,就去掉Stringcinputtext。substring(inputtext。length()1);if(c。equals()c。equals()c。equals()c。equals()c。equals(。)c。equals()){inputtextinputtext。substring(0,inputtext。length()1);}doublereturnnum0;returnnumcalculator(inputtext);如果小数位为0输出整形intSif(returnnum10){returnstringString。valueOf((int)returnnum);}else{returnstringString。valueOf(returnnum);}}运算,将数字类型改为double并在其中加入小数的运算privatedoublecalculator(Stringinputtext){一、把表达式分解成运算符和数字StackStringstkElesnewStackString();LinkedListStringtempBackcalnewLinkedListString();for(inti0;iinputtext。length();i){1。遇到了数字if(Character。isDigit(inputtext。charAt(i))){注意多位数的获取intki1;小数点也加入数字中for(;kinputtext。length()(Character。isDigit(inputtext。charAt(k))inputtext。charAt(k)。);k){}tempBackcal。add(inputtext。substring(i,k));ik1;更新}2。遇到了乘除运算符if(inputtext。charAt(i)inputtext。charAt(i)){if(inputtext。charAt(i)inputtext。charAt(i)){while(!stkEles。isEmpty()(stkEles。lastElement()。equals()stkEles。lastElement()。equals())){tempBackcal。add(stkEles。pop());弹出优先级相同或以上的栈内运算符}stkEles。add(String。valueOf(inputtext。charAt(i)));运算符入栈}3。遇到了加减运算符if(inputtext。charAt(i)inputtext。charAt(i)){while(!stkEles。isEmpty()!isNumeric(stkEles。lastElement())){tempBackcal。add(stkEles。pop());弹出优先级相同或以上的栈内运算符}stkEles。add(String。valueOf(inputtext。charAt(i)));运算符入栈}}4。最后弹出栈内所有元素到表达式while(stkEles。size()0){tempBackcal。add(stkEles。pop());}二、把分解的运算符和数字进行计算StackDoublecalStknewStackDouble();for(Stringc:tempBackcal){1。数字,入栈if(isNumeric(c)){calStk。push(Double。valueOf(c));}2。非数字,则为符号,出栈两个元素计算出结果然后再入栈该计算值else{DoubleacalStk。pop();DoublebcalStk。pop();switch(c。toCharArray()〔0〕){注意减法和除法时,注意出栈的顺序与原表达式是相反的case:calStk。push(ba);case:calStk。push(ba);case:calStk。push(ba);case:calStk。push(ba);}}}returncalStk。pop();}privatebooleanisNumeric(Stringstr){for(inti0;istr。length();i){是否为数字或者小数点if(!Character。isDigit(str。charAt(i))str。charAt(i)!。){}}};};}